ዝርዝር ሁኔታ:

STM32CubeMX አዝራር በማቋረጥ Debounce: 5 ደረጃዎች
STM32CubeMX አዝራር በማቋረጥ Debounce: 5 ደረጃዎች

ቪዲዮ: STM32CubeMX አዝራር በማቋረጥ Debounce: 5 ደረጃዎች

ቪዲዮ: STM32CubeMX አዝራር በማቋረጥ Debounce: 5 ደረጃዎች
ቪዲዮ: Monitoring the RPM of a 12Vdc Three Wire Cooler Fan with Arduino, with speed control potentiometer 2024, ህዳር
Anonim
STM32CubeMX አዝራር በማቋረጥ
STM32CubeMX አዝራር በማቋረጥ

ጤና ይስጥልኝ ፣ በዚህ አጋዥ ስልጠና ውስጥ በጣም ከባድ ጉዳይ የሆነውን የአዝራር ንዝረትን ለመከላከል ቀላል መፍትሄዬን ለመስጠት እሞክራለሁ። በበይነመረብ ላይ ለዚህ ጉዳይ መፍትሄ የሚሰጡ ብዙ ቪዲዮዎች አሉ ፣ ግን ከእነሱ ውጭ ለውጭ መቋረጥ። በእነዚህ ሁሉ ቪዲዮዎች ውስጥ አዝራር ፕሬስ ውጤታማ ባልሆነ የምርጫ ዘዴ ምልክት ይደረግበታል። ስለዚህ ፣ እንጀምር!

ደረጃ 1 የሃርድዌር እና የሶፍትዌር መስፈርቶች

የሃርድዌር መስፈርቶች;

  • STM32 ARM ልማት ቦርድ
  • ኮምፒተር

የሶፍትዌር መስፈርቶች

  • STM32CubeMX
  • Keil uVision5

ደረጃ 2 - ችግሩን መረዳት

ችግሩን መረዳት
ችግሩን መረዳት

ስለዚህ ፣ ለአዝራር መነሳት ችግር መፍትሄ ለማግኘት እንሞክራለን። ስለዚህ ጉዳዩን መረዳት አለብን። ስለዚህ ፣ አንድ ቁልፍ ስንጫን ከቀድሞው ሁኔታው ተቃራኒ የሆነ ሁኔታ መምጣት አለበት። ለምሳሌ ፣ ከፍ ያለ ቢሆን ዝቅተኛ መሆን አለበት እና ዝቅተኛ ከሆነ ከዚያ ከፍተኛ መሆን አለበት። ሆኖም ፣ ይህ ተስማሚ ሁኔታ ነው (በ PROTEUS:)) በእውነቱ ፣ አንድ አዝራር ስንጫን ወደ ስራ ፈት ሁኔታ ከመምጣቱ በፊት በከፍተኛ እና ዝቅተኛ መካከል መብረር ይጀምራል። ስለዚህ ፣ ብዙ ጊዜ የተጫነ ያስመስላል ይህም ችግሮችን ያስከትላል። ስለዚህ ፣ ምን ማድረግ አለብን?

እዚህ በዚህ ምሳሌ ውስጥ የአዝራር ቁልፍን ለመለየት የውጭ መቋረጥን እንደምንጠቀም ማስተዋል እፈልጋለሁ። ስለዚህ ፣ የአዝራር ማተሚያውን ካወቅን በኋላ ስራ ፈት ያለበትን ሁኔታ ለመድረስ እና አዝራሩ ስራ ፈት አለመሆኑን ወይም አለመሆኑን እንደገና ለመፈተሽ እንደ 50mS ትንሽ ጊዜ መጠበቅ አለብን። ስራ ፈት በሆነ ሁኔታ ውስጥ ከሆነ ወደ ተግባራችን መቀጠል እንችላለን። ስለዚህ ኮዱን እንይ:)

ደረጃ 3 STM32CubeMX ውቅር

STM32CubeMX ውቅር
STM32CubeMX ውቅር

ስለዚህ ፣ እኛ ለእኛ የግፋ አዝራራችን የውጭ መቋረጥን ማንቃት አለብን (እዚህ STM32F407VG ግኝት ሰሌዳ እንደሚጠቀሙ እገምታለሁ)

  • በ “Pinout & Configuration” ትር ውስጥ ከግፊት አዝራሩ ጋር የተገናኘውን ፒን PA0 ላይ ጠቅ ያድርጉ እና በዚያ ፒን ላይ የውጭ መቋረጥን የሚፈቅድ GPIO_EXTI0 ን ይምረጡ።
  • የፒኑን “የተጠቃሚ መለያ” ወደ “Push_Button” ወይም ወደሚፈልጉት ማንኛውም ነገር ይለውጡ።

ከዚያ ፣ የ 50mS የጊዜ መዘግየትን ለመፍጠር ሰዓት ቆጣሪን ማዋቀር አለብን-

  • “ሰዓት ቆጣሪዎች” ክፍልን ያስገቡ
  • በ TIM1 ላይ ጠቅ ያድርጉ
  • እንደ የሰዓት ምንጭ “ውስጣዊ ሰዓት” ን ይምረጡ
  • በማዋቀር ውስጥ (ይህንን ክፍል ለመረዳት ከፈለጉ እባክዎን ይህንን መማሪያ ይመልከቱ ፣ በጣም የሚመከር “የ Servo Motor Control በ STM32F4 ARM MCU”)

    • ቅድመ -ተቆጣጣሪውን እንደ 32000 ያዘጋጁ
    • እና የቆጣሪ ጊዜ ወደ 50
  • በ “NVIC ቅንብሮች” ትር ውስጥ ሁሉንም ማቋረጦች ያንቁ

ኤልኢዲ እንደ ውፅዓት ያንቁ ፦

PD12 ላይ ጠቅ ያድርጉ እና እንደ «GPIO_Output» ያዘጋጁ

ከዚያ ፣ ከላይ በተሰጠው ምስል ላይ እንደ ሰዓት ያዋቅሩ እና ኮዱን ያመነጩ።

ደረጃ 4 የኬይል ሶፍትዌር ልማት

መጀመሪያ ፣ መወርወር በሚከሰትበት ጊዜ በውጫዊ መቋረጥ ውስጥ የሰዓት ቆጣሪ አለመጀመራችንን የሚያረጋግጥ የስቴት ተለዋዋጭን እንገልፃለን-

/ * የተጠቃሚ ተጠቃሚ ኮድ PFP */bool state = true; / * የተጠቃሚ ኮድ መጨረሻ PFP */

ከዚያ ፣ ለውጫዊ መቋረጥ ISR እንጽፋለን-

ባዶ HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {ከሆነ (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); ግዛት = ሐሰት; } ሌላ {_NOP () ፤ }}

አዝራር ሲጫን የእኛ የተገለፀው የግፋ አዝራር መሆኑን እና ግዛቱ እውነት መሆኑን እንፈትሻለን። መግለጫው ውስጥ ለመግባት መጀመሪያ ላይ ግዛቱ እውነት ይሆናል። ከገባን በኋላ የጊዜ መቁጠሪያውን እንደገና ማስጀመር አለመጀመሩን ለማረጋገጥ የሰዓት ቆጣሪን እንጀምራለን እና ግዛት ሐሰተኛ እናደርጋለን።

ከዚያ ፣ ሰዓት ቆጣሪን ለማቋረጥ ISR እንጽፋለን-

ባዶ HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *ጥቅም ላይ ያልዋለ የክርክር (ቶች) ማጠናከሪያ ማስጠንቀቂያ * / ጥቅም ላይ አልዋለም (htim);

/* ማሳሰቢያ - ይህ ተግባር መሻሻል የለበትም ፣ የመደወያው ጥሪ ሲያስፈልግ ፣

HAL_TIM_PeriodElapsedCallback በተጠቃሚ ፋይል */ ከሆነ (HAL_GPIO_ReadPin (Push_Button_GPIO_Port ፣ Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD ፣ GPIOD ፣ GPIOD ፣ GPIOD ፣ GPIOD ፣ GPIOD ፣ GPIOD ግዛት = እውነት; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * የተጠቃሚ ኮድ ማብቂያ 4 */

ከ 50mS በኋላ አዝራሩ ገና በመልሶ ሁኔታ ውስጥ ከሆነ ወይም ከተለቀቀ እንፈትሻለን ፣ አዎ ከሆነ ያ አዝራሩ ስራ ፈት ባለ ሁኔታ ውስጥ መሆኑን እናውቃለን። ከዚያ እንደገና ለመጀመር እንዲቻል ሌላ የአዝራር ቁልፍን ለመለየት እና ቆጣሪን ለማቆየት መሪውን እንለውጣለን ፣ ሁኔታውን እውነት እናደርጋለን።

ስለዚህ ፣ ይህ ሂደት የመብረቅ ችግርን መከላከልን ያረጋግጣል።

ደረጃ 5 መደምደሚያ

ይህ የአዝራር መቀልበስ ኮድ ነበር። ይህ ኮድ በእኔ የተገነባ እና እኔ የባለሙያ ፕሮግራም አውጪ እንዳልሆን ማስተዋል እፈልጋለሁ። ስለዚህ ፣ በእርግጥ ስህተቶች ሊኖሩ ይችላሉ። የተሻለ መፍትሔ ካለዎት እባክዎ ልብ ይበሉ። አይርሱ ፣ ማንኛውም ችግር ካጋጠመዎት እባክዎን ይፃፉልኝ እና ለማገዝ እሞክራለሁ።

የሚመከር: