Índice:

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

Vídeo: STM32CubeMX botão Debounce com interrupção: 5 etapas

Vídeo: STM32CubeMX botão Debounce com interrupção: 5 etapas
Vídeo: STM32 Nucleo Tutorial 2- Interrupt, PUSH Button and LED code generation using STM32CubeMx 2024, Novembro
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: