STM32CubeMX botão Debounce com interrupção: 5 etapas
STM32CubeMX botão Debounce com interrupção: 5 etapas
Anonim
Botão STM32CubeMX Debounce com interrupção
Botão STM32CubeMX Debounce com interrupção

Olá, neste tutorial tentarei dar minha solução simples para evitar que o botão salte, o que é um problema muito sério. Na internet existem muitos vídeos que oferecem solução para esse problema, mas nenhum deles para interrupção externa. Em todos esses vídeos, o pressionamento do botão é verificado pelo método de votação, que é ineficiente. Então vamos começar!

Etapa 1: Requisitos de Hardware e Software

Requisitos de hardware:

  • Placa de desenvolvimento STM32 ARM
  • Um computador

Requisitos de software:

  • STM32CubeMX
  • Keil uVision5

Etapa 2: Compreendendo o problema

Compreendendo o problema
Compreendendo o problema

Então, tentamos encontrar uma solução para o problema de salto do botão. Portanto, temos que entender o problema. Portanto, quando pressionamos um botão, ele deve chegar a um estado oposto ao seu estado anterior. Por exemplo, se foi HIGH tem que ser LOW e se foi LOW tem que ser HIGH. No entanto, este é o estado ideal (no PROTEUS:)). Na realidade, quando pressionamos um botão, ele começa a pular entre ALTO e BAIXO antes de entrar no estado inativo. Então, finge que já foi pressionado várias vezes o que causa problemas. Então, o que devemos fazer?

Aqui, quero observar que, neste exemplo, usaremos interrupção externa para detectar o pressionamento de botão. Assim, após detectarmos o pressionamento do botão, precisamos esperar um pouco, como 50mS, para chegar ao estado inativo e verificar novamente se o botão está ocioso ou não. Se estiver ocioso, podemos continuar com nossa tarefa. Então, vamos ver o código:)

Etapa 3: configuração do STM32CubeMX

Configuração STM32CubeMX
Configuração STM32CubeMX

Portanto, precisamos primeiro habilitar a interrupção externa para o nosso botão (presumo aqui que você usa a placa de descoberta STM32F407VG):

  • Na guia "Pinagem e configuração", clique no pino PA0 que está conectado ao botão e escolha GPIO_EXTI0 que ativa a interrupção externa naquele pino.
  • Altere o "rótulo do usuário" do pino para "Push_Button" ou qualquer coisa que você quiser.

Então, precisamos configurar o temporizador para criar um atraso de 50mS:

  • Acesse a seção "Timers"
  • Clique em TIM1
  • Escolha "Relógio interno" como uma fonte de relógio
  • Na configuração (se você quiser entender esta seção, consulte este tutorial, altamente recomendado "Controle de servo motor com STM32F4 ARM MCU"):

    • Defina o prescaler como 32000
    • E contra-período para 50
  • Na guia "Configurações NVIC" habilite todas as interrupções

Ative o LED como uma saída:

Clique em PD12 e defina como "GPIO_Output"

Em seguida, configure o relógio como na imagem fornecida acima e gere o código.

Etapa 4: Desenvolvimento de software Keil

Primeiro, definimos a variável de estado que garantirá que não iniciaremos o cronômetro dentro de uma interrupção externa quando o salto acontecer:

/ * CÓDIGO DE USUÁRIO BEGIN PFP * / bool state = true; / * CÓDIGO DO USUÁRIO FIM PFP * /

Em seguida, escrevemos ISR para interrupção externa:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); estado = falso; } mais {_NOP (); }}

Quando o botão é pressionado, verificamos se era o nosso botão definido e se o estado é verdadeiro. No início, o estado será verdadeiro para inserir a instrução if. Depois de entrar, iniciamos o cronômetro e tornamos o estado falso para garantir que o salto não reinicie o cronômetro.

Em seguida, escrevemos ISR para interrupção do temporizador:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Evita aviso de compilação de argumento (s) não utilizado (s) * / UNUSED (htim);

/ * NOTA: Esta função não deve ser modificada, quando o retorno de chamada for necessário, o HAL_TIM_PeriodElapsedCallback pode ser implementado no arquivo do usuário * / if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_12); estado = verdadeiro; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * FIM DO CÓDIGO DO USUÁRIO 4 * /

Após 50mS, verificamos se o botão ainda está no estado de reinicialização ou liberado; em caso afirmativo, sabemos que o botão está no estado inativo. Em seguida, alternamos o led, tornamos o estado verdadeiro para detectar outro pressionamento de botão e paramos o cronômetro para poder reiniciá-lo.

Portanto, este processo irá garantir que evitaremos problemas de saltos.

Etapa 5: Conclusão

Este era o código para debounce do botão. Quero observar que este código foi desenvolvido por mim e não sou um programador especialista. Portanto, certamente pode haver erros. Se você tiver uma solução melhor, anote. Não se esqueça, se tiver algum problema escreva-me e tentarei ajudar.

Recomendado: