Talaan ng mga Nilalaman:

STM32CubeMX Button na Pagwawasto Sa Pag-abala: 5 Hakbang
STM32CubeMX Button na Pagwawasto Sa Pag-abala: 5 Hakbang

Video: STM32CubeMX Button na Pagwawasto Sa Pag-abala: 5 Hakbang

Video: STM32CubeMX Button na Pagwawasto Sa Pag-abala: 5 Hakbang
Video: Tutorial 7: LAB - LED with Button Control in STM32 using STM32CUBEMX 2024, Nobyembre
Anonim
STM32CubeMX Button na Pagwawasto Sa Nakagambala
STM32CubeMX Button na Pagwawasto Sa Nakagambala

Kumusta, sa tutorial na ito susubukan kong ibigay ang aking simpleng solusyon upang maiwasan ang pag-bounce ng pindutan na napakaseryoso sa isyu. Sa internet maraming mga video na nag-aalok ng solusyon sa isyung ito, ngunit hindi sa kanila para sa panlabas na pagkagambala. Sa lahat ng mga video na ito, ang press button ay naka-check sa pamamagitan ng paraan ng botohan na hindi mabisa. Kaya, magsimula na tayo!

Hakbang 1: Mga Kinakailangan sa Hardware at Software

Mga kinakailangan sa hardware:

  • STM32 ARM development board
  • Isang kompyuter

Mga kinakailangan sa software:

  • STM32CubeMX
  • Keil uVision5

Hakbang 2: Pag-unawa sa Suliranin

Pag-unawa sa Suliranin
Pag-unawa sa Suliranin

Kaya, sinusubukan naming maghanap ng solusyon para sa problema sa pag-bouncing ng button. Samakatuwid, kailangan nating maunawaan ang isyu. Kaya, kapag pinindot namin ang isang pindutan dapat itong dumating sa isang estado na kabaligtaran sa dating estado nito. Halimbawa, kung ito ay Mataas dapat itong maging mababa at kung ito ay mababa pagkatapos ito ay dapat na maging mataas. Gayunpaman, ito ay mainam na estado (sa PROTEUS:)) Sa totoo lang, kapag pinindot namin ang isang pindutan nagsisimula itong bounce sa pagitan ng TAAS at LOW bago ito dumating sa idle state. Kaya, nagpapanggap na ito ay nai-press nang maraming beses na nagiging sanhi ng mga problema. Kaya, ano ang dapat nating gawin?

Dito nais kong tandaan na sa halimbawang ito, gagamit kami ng panlabas na makagambala upang makita ang pindot ng pindutan. Kaya, pagkatapos naming makita ang pindutin ang pindutan kailangan naming maghintay ng kaunting oras, tulad ng 50mS upang maabot ang idle na estado at suriin muli kung ang pindutan ay idle na estado o hindi. Kung nasa idle state ito pagkatapos ay maaari nating ipagpatuloy ang aming gawain. Kaya, tingnan natin ang code:)

Hakbang 3: Pag-configure ng STM32CubeMX

Pag-configure ng STM32CubeMX
Pag-configure ng STM32CubeMX

Kaya, kailangan muna naming paganahin ang panlabas na makagambala para sa aming pindutan ng itulak (ipinapalagay ko dito na gumagamit ka ng board ng pagtuklas ng STM32F407VG):

  • Sa tab na "Pinout & Configuration" mag-click sa pin PA0 na konektado sa pindutan ng push at piliin ang GPIO_EXTI0 na nagbibigay-daan sa panlabas na makagambala sa pin na iyon.
  • Palitan ang "label ng gumagamit" ng pin sa "Push_ Button" o anumang nais mo.

Pagkatapos, kailangan naming i-configure ang timer upang lumikha ng pagkaantala ng 50mS na oras:

  • Ipasok ang seksyong "Mga timer"
  • Mag-click sa TIM1
  • Piliin ang "Panloob na Orasan" bilang isang mapagkukunan ng Orasan
  • Sa pagsasaayos (Kung nais mong maunawaan ang seksyong ito mangyaring sumangguni sa tutorial na ito, lubos na inirerekumenda ang "Servo Motor Control Sa STM32F4 ARM MCU"):

    • Itakda ang prescaler bilang 32000
    • At counter period hanggang 50
  • Sa tab na "Mga Setting ng NVIC," paganahin ang lahat ng mga nakakagambala

Paganahin ang LED bilang isang output:

Mag-click sa PD12 at itakda bilang "GPIO_Output"

Pagkatapos, i-configure ang orasan tulad ng sa imaheng ibinigay sa itaas at bumuo ng code.

Hakbang 4: Pag-unlad ng Keil Software

Una, tinukoy namin ang variable ng estado na makatiyak na hindi kami magsisimulang timer sa loob ng panlabas na pagkagambala kapag naganap ang pag-bouncing:

/ * USER CODE BEGIN PFP * / bool state = true; / * USER CODE END PFP * /

Pagkatapos, nagsusulat kami ng ISR para sa panlabas na makagambala:

walang bisa HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {kung (GPIO_Pin == Push_ Button_Pin && estado == totoo) {HAL_TIM_Base_Start_IT (& htim1); estado = mali; } iba pa {_NOP (); }}

Kapag pinindot ang pindutan sinusuri namin kung ito ang aming tinukoy na pindutan ng itulak at kung ang estado ay totoo. Sa simula ang estado ay magiging totoo upang maipasok ang kung pahayag. Matapos ang pagpasok simulan namin ang timer at gawing hindi totoo ang estado upang matiyak na ang bouncing ay hindi i-restart ang timer.

Pagkatapos, nagsusulat kami ng ISR para sa timer makagambala:

walang bisa HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Pigilan ang (mga) hindi nagbigay ng babalang babala * / UNUSED (htim);

/ * TANDAAN: Ang pagpapaandar na ito ay hindi dapat mabago, kung kinakailangan ang callback, ang HAL_TIM_PeriodElapsedCallback ay maaaring ipatupad sa file ng gumagamit * / kung (HAL_GPIO_ReadPin (Push_ Button_GPIO_Port, Push_button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_12); estado = totoo; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * USER CODE END 4 * /

Pagkatapos ng 50mS sinusuri namin kung ang pindutan pa rin sa naka-reset na estado o inilabas, kung oo alam namin na ang pindutan ay nasa idle na estado. Pagkatapos ay i-toggle namin ang pinangunahan, gawing totoo ang estado upang makapag-tiktikan ang isa pang pindutin ang pindutan at ihinto ang timer upang masimulan itong muli.

Kaya, titiyakin ng prosesong ito na pipigilan namin ang isyu ng pagba-bounce.

Hakbang 5: Konklusyon

Ito ang code para sa pag-debug ng pindutan. Nais kong tandaan na ang code na ito ay binuo ko at hindi ako dalubhasang programmer. Kaya, tiyak na maaaring may mga pagkakamali. Kung mayroon kang mas mahusay na solusyon mangyaring tandaan ito. Huwag kalimutan, kung nakatagpo ka ng anumang problema mangyaring sumulat sa akin at susubukan kong tumulong.

Inirerekumendang: