Índice:
- Etapa 1: Requisitos de Hardware e Software
- Etapa 2: Compreendendo o problema
- Etapa 3: configuração do STM32CubeMX
- Etapa 4: Desenvolvimento de software Keil
- Etapa 5: Conclusão
Vídeo: STM32CubeMX botão Debounce com interrupção: 5 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:37
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
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
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:
Projeto de um controlador de interrupção programável em VHDL: 4 etapas
Projeto de um controlador de interrupção programável em VHDL: Estou impressionado com o tipo de respostas que recebo neste blog. Obrigado pessoal por visitar meu blog e me motivar a compartilhar meu conhecimento com vocês. Desta vez, vou apresentar o design de outro módulo interessante que vemos em todos os SOCs - Interromper C
Microcontrolador AVR. Alterne os LEDs usando um botão de pressão. Botão Debouncing: 4 etapas
Microcontrolador AVR. Alterne os LEDs usando uma chave de botão. Push Button Debouncing: Nesta seção, aprenderemos como fazer o código do programa C para ATMega328PU para alternar o status dos três LEDs de acordo com a entrada de uma chave de botão. Além disso, exploramos uma solução para o problema de ‘Switch Bounce’. Como de costume, nós teremos
Arduino - Interrupção periódica: 4 etapas
Arduino - Interrupção Periódica: Este Instructable trata do uso de uma interrupção periódica para cronometragem em programas Arduino. Esta é uma etapa para um programador de Arduino iniciante que sabe que o Arduino pode fazer mais, mas não sabe exatamente como fazer isso acontecer. Se houver um pr
Brilho do LED de interrupção do Arduino dos EUA: 6 etapas
Brilho do LED do Arduino Interrupt dos EUA: Neste projeto, criaremos um display LED vermelho, branco e azul com um potenciômetro e um botão de pressão. Parece fácil, mas também usaremos interrupções para isso. Assim, quando o botão for pressionado, o valor do potenciômetro será definido
Como corrigir uma interrupção / " travada " Espelho em uma Pentax ES Spotmatic: 8 etapas
Como corrigir uma interrupção / " travada " Espelho em uma Pentax ES Spotmatic: Este tutorial foi desenvolvido para ajudá-lo a consertar um corpo da Pentax ES Spotmatic no qual o espelho ficou preso na posição " para cima " posição. No entanto, essas instruções também se aplicam à maioria dos outros corpos dentro da família Spotmatic. Se o seu corpo for