Sadržaj:

Debounce dugmeta STM32CubeMX sa prekidom: 5 koraka
Debounce dugmeta STM32CubeMX sa prekidom: 5 koraka

Video: Debounce dugmeta STM32CubeMX sa prekidom: 5 koraka

Video: Debounce dugmeta STM32CubeMX sa prekidom: 5 koraka
Video: STM32 Timer - General Purpose Timer with Interrupt for LED Blinking 1Hz 2024, Juli
Anonim
Dugme STM32CubeMX deblokira s prekidom
Dugme STM32CubeMX deblokira s prekidom

Bok, u ovom vodiču pokušat ću dati svoje jednostavno rješenje za sprječavanje odskakivanja gumba što je vrlo ozbiljan problem. Na internetu postoji mnogo videozapisa koji nude rješenje za ovaj problem, ali nema njih za vanjske prekide. U svim ovim video zapisima pritisak na dugme se provjerava metodom anketiranja koja je neefikasna. Dakle, počnimo!

Korak 1: Hardverski i softverski zahtjevi

Hardverski zahtjevi:

  • STM32 ARM razvojna ploča
  • Kompjuter

Softverski zahtjevi:

  • STM32CubeMX
  • Keil uVision5

Korak 2: Razumijevanje problema

Razumevanje problema
Razumevanje problema

Stoga pokušavamo pronaći rješenje za problem odskakivanja gumba. Stoga moramo razumjeti problem. Dakle, kada pritisnemo dugme, ono bi trebalo doći u stanje koje je suprotno od prethodnog stanja. Na primjer, ako je bilo VISOKO, mora biti NISKO, a ako je bilo NISKO, onda mora biti VISOKO. Međutim, ovo je idealno stanje (u PROTEUS -u:)) U stvarnosti, kada pritisnemo dugme, ono počinje poskakivati između HIGH i LOW prije nego što dođe u stanje mirovanja. Dakle, pretvara se da je pritisnut nekoliko puta što uzrokuje probleme. Dakle, šta bismo trebali učiniti?

Ovdje želim napomenuti da ćemo u ovom primjeru koristiti vanjski prekid kako bismo otkrili pritiskanje tipke. Dakle, nakon što otkrijemo pritisak na dugme, moramo sačekati malo vremena, na primjer 50mS da bismo dosegli stanje mirovanja i ponovo provjeriti je li dugme u stanju mirovanja ili ne. Ako je u stanju mirovanja, možemo nastaviti sa svojim zadatkom. Pa da vidimo kod:)

Korak 3: Konfiguracija STM32CubeMX

STM32CubeMX konfiguracija
STM32CubeMX konfiguracija

Dakle, prvo moramo omogućiti vanjski prekid za naše dugme (ovdje pretpostavljam da koristite ploču za otkrivanje STM32F407VG):

  • Na kartici "Pinout & Configuration" kliknite na pin PA0 koji je spojen na gumb i odaberite GPIO_EXTI0 koji omogućuje vanjski prekid na tom pinu.
  • Promijenite "korisničku oznaku" igle u "Push_Button" ili bilo šta što želite.

Zatim moramo konfigurirati mjerač vremena kako bismo stvorili odgodu od 50 mS:

  • Unesite odjeljak "Tajmeri"
  • Kliknite na TIM1
  • Odaberite "Interni sat" kao izvor sata
  • U konfiguraciji (Ako želite razumjeti ovaj odjeljak, pogledajte ovaj vodič, visoko preporučena "Kontrola servo motora sa STM32F4 ARM MCU"):

    • Podkaler postavite na 32000
    • I period brojača do 50
  • Na kartici "NVIC Settings" omogućite sve prekide

Omogući LED kao izlaz:

Kliknite na PD12 i postavite kao "GPIO_Output"

Zatim konfigurirajte sat kao na gornjoj slici i generirajte kod.

Korak 4: Razvoj softvera Keil

Prvo definiramo varijablu stanja koja će osigurati da ne pokrećemo tajmer unutar vanjskog prekida kada se odskok dogodio:

/ * KORISNIČKI KOD POČINJE PFP */bool stanje = true; / * KORISNIČKI KOD KRAJ PFP */

Zatim pišemo ISR za vanjski prekid:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); stanje = netačno; } else {_NOP (); }}

Kada pritisnemo dugme, provjeravamo je li to bilo naše definirano dugme i je li stanje tačno. Na početku će stanje biti tačno za unos if naredbe. Nakon ulaska pokrećemo mjerač vremena i postavljamo stanje lažno kako bismo bili sigurni da se odskakanje neće ponovo pokrenuti.

Zatim pišemo ISR za prekid timera:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Spriječi upozorenje kompilacije neiskorištenih argumenata * / UNUSED (htim);

/* NAPOMENA: Ova funkcija se ne smije mijenjati, kada je potreban povratni poziv, HAL_TIM_PeriodElapsedCallback bi se mogao implementirati u korisničku datoteku */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_ GPIO_); stanje = tačno; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KORISNIČKI KOD KRAJ 4 */

Nakon 50mS provjeravamo je li gumb još uvijek u resetiranom stanju ili otpušten, ako da, onda znamo da je to dugme u stanju mirovanja. Zatim prebacimo LED diodu, učinimo stanje istinitim kako bismo mogli otkriti još jedno pritiskanje tipke i zaustaviti mjerač vremena kako bismo ga mogli ponovo pokrenuti.

Dakle, ovaj proces će osigurati da spriječimo problem poskakivanja.

Korak 5: Zaključak

Ovo je bio kod za debounce dugmeta. Želim napomenuti da sam ovaj kod razvio ja i da nisam stručan programer. Dakle, grešaka sigurno može biti. Zapamtite ako imate bolje rješenje. Ne zaboravite, ako naiđete na bilo koji problem, pišite mi i ja ću vam pokušati pomoći.

Preporučuje se: