Ir ao conteúdo
  • Cadastre-se

Sobre debouncing como funciona


Carlos Zanon
Ir à solução Resolvido por aphawk,

Posts recomendados

Tenho algumas pequenas dúvidas sobre o debouncing.

A dúvida surgiu em um projetinho meu usando um ATTiny85 para uma pequena horta que estou montando em casa e vou fazer ela micro-controlada... Por puro hobby e aprendizado =)

image.png.c737b9cee353baf2da1d255dcb56e74d.png

O Botão ali em A1, ele somente tinha a seguinte estrutura:

 

image.png.d5edb4f2ffd7befbf6066e662cf61d47.png

 

Meu código já estava prevendo o tempo de segurar o botão, pois a cada clock ele ia executar o código novamente e isso ia me dar uma dor de cabeça...

image.png.18d49e82d24769398ee65000096d7792.png

 

 

Mas pelo que entendi do bouncing a melhor forma de eu deixar o botão é dessa forma aqui:

image.png.fdce719af29501d345cb515c912026eb.png

 

A Dúvida é no papel do capacitor... O Capacitor ai no caso, vai funcionar como um "filtro" para os ruídos? É isso que se chama de capacitor de desacoplamento?

No caso do reset, funciona da mesma forma... ele entra com um resistor de pull-up, é interessante eu fazer o mesmo procedimento nele?

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
35 minutos atrás, Carlos Zanon disse:

O Capacitor ai no caso, vai funcionar como um "filtro" para os ruídos?

sim amigo. Olha o que eu achei pra você

https://www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/

(paulão kk)

 

37 minutos atrás, Carlos Zanon disse:

No caso do reset, funciona da mesma forma... ele entra com um resistor de pull-up, é interessante eu fazer o mesmo procedimento nele?

sim amigo. Por gentileza consulte o d.s. do seu mc

 

Tem um debounce por sw pra complementar o do hw que elaborei há algum tempo mas mais tarde eu publico

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz Eu olhei um monte de links mas nenhum foi tão explicativo quanto o do @aphawk

 

No caso eu preferi fazer de uma segunda forma (ao invés de usar o delay), acabei por colocar um comparativo de timing no código.

 

Meu código final de teste para debouncing ficou:

/**
 * Verifica se o botão foi clicado e verifica o debouncing.
 * @return void
 */
bool btnIsClicked()
{
	// Verifica se o botão foi pressionado, a entrada irá a 0
	// Então, inicia a verificação de debouncing
	if(digitalRead(PIN_BTN) == LOW)
	{
		// Caso os testes "contra" o debouncing mostrem que o botão foi realmente
		// apertado, então retorta informando que o mesmo está em estado HIGH.
		if(BTN_STATE_TIME == HIGH)
			return HIGH;
		
		// Se ainda não foi provado que o mesmo foi clicado, então, marca a hora atual
		// no botão para futura comparação de dados e timing
		if(BTN_TIMER_PRESSED == 0)
			BTN_TIMER_PRESSED = time;
		
		// Este IF será valido num momento futuro onde é provado que o botão continua pressionado
		// Mantendo a entrada em nível 0 durante um certo tempo, então é considerado o click.
		if((time-BTN_TIMER_PRESSED) > 50)
		{
			BTN_STATE_TIME = HIGH;
			return btnIsClicked();
		}
	}
	else
	{
		// Se for apenas ruido, ele irá zerar, a filtragem/desacoplamento o capacitor
		// irá cuidar no circuito até que tudo esteja correto para validar o click.
		BTN_STATE_TIME = LOW;
		BTN_TIMER_PRESSED = 0;
	}

	return LOW;
}

 

E caso o mesmo seja pressionado, quero que apenas 1 vez este seja executado enquanto apertado:

	if(btnIsClicked())
	{
		if(BTN_STATE == LOW)
		{
			BTN_STATE = HIGH;
			btnClicked();
		}
	}
	else
	{
		BTN_STATE = LOW;
	}

 

Aproveitei para colocar durante a inicialização do MCU:

 

/**
 * Configura o MCU para as operações de leitura de porta
 * e realiza os testes iniciais
 */
void setup()
{
	// Número de erros obtidos.
	int errorCount = 0;

	// Tempo inicial de execução do MCU
	time = millis();

	// Configura os pinos de leitura
	pinMode(PIN_BTN, INPUT);
	pinMode(PIN_HGM, INPUT);
	pinMode(PIN_LDR, INPUT);

	// Configura os pinos de escrita
	pinMode(PIN_LIGHT, OUTPUT);
	pinMode(PIN_WATER, OUTPUT);

	// Desliga os pinos de agua e luz
	digitalWrite(PIN_LIGHT, LOW);
	digitalWrite(PIN_WATER, LOW);

	// Somente estará em LOW caso esteja pressionado ou capacitor ainda não carregado.
	while((errorCount++) < 3 && digitalRead(PIN_BTN) == LOW)
		delay(50);

	// Em caso de erro ou sensores sem funcionamento, então
	// Declara estado de ERRO.
	if(errorCount >= 3 || !verificarSensores())
	{
		ERROR_STATE = HIGH;
	}
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Algo como um minimalista capacitor virtual (inventei isso agora):

 

#define _TEMPO 128
while (RA0) //se pressionar e ...
{
while(tmp--) if (RA0) tmp=_TEMPO; //e manter por algum _TEMPO, foi alguém
}

Só o conceito. Claro, passível de evolução. O melhor é incorporar isso numa interrupção por mudança de estado, numa varredura de teclas e etc pra não travar o processamento na leitura do botão....

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Sérgio Lembo Isso ocorre em milésimos de segundo correto? Essa variação ocorre tanto no momento que eu pressiono quanto no momento que eu solto o botão, certo?

 

@Isadora Ferraz O Meu código ali faz algo parecido com isso só que com 50ms de intervalo...

Ele só "trava" (máx de 150ms) o MCU quando está inicializando onde ocorre o delay, de resto eu procuro não travar o processamento de nenhuma forma.

Link para o comentário
Compartilhar em outros sites

Não me preocupei em desenhar em escala. No teste adicionei as 2 resistências para visualização do tri-state. Sobre o tempo ser em milisegundos... num é tão rápido assim. Um relé/contator leva entre 40 e 120ms para completar o ciclo de manobra, sendo que a imensa maioria se situa entre 80 e 100ms. Em fim de curso, quando se tem um movimento muito rápido e filtros temporizados não podem ser usados ou em qualquer outra situação em que filtros com efeito de retardo não sejam aceitos, havendo a disponibilidade de um contato reversível fica fácil a filtragem por um simples flip-flop.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...