Orodha ya maudhui:

Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU: Hatua 4
Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU: Hatua 4

Video: Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU: Hatua 4

Video: Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU: Hatua 4
Video: Nay Wa Mitego - Sauti Ya Watu (Official Music Video) 2024, Julai
Anonim
Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU
Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU
Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU
Udhibiti wa Magari ya Servo Na STM32F4 ARM MCU

Halo marafiki tena:) Kwa hivyo, katika mradi huu tutadhibiti servo motor na STM32F4 ARM MCU. Kwa upande wangu, nitatumia bodi ya ugunduzi, lakini ikiwa unaelewa kiini cha shida, basi unaweza kuitumia kwa kila MCU. Kwa hivyo. tuanze:)

Hatua ya 1: Mahitaji ya vifaa na programu

Kwa upande wa vifaa tutahitaji:

  • MCU ambayo iko kwa upande wangu Bodi ya Ugunduzi ya STM32f4
  • Servo motor ya kawaida, kama SG90 au nyingine yoyote

Kwa suala la programu tutahitaji:

  • STM32CubeMX
  • Keil uVision

Ikiwa unayo yote haya, rukia hatua inayofuata:)

Hatua ya 2: Usanidi wa STM32CubeMX

Kama unavyojua, kwa kudhibiti motor servo tunahitaji ishara ya PWM. Mahitaji kulingana na ishara ya PWM ni kama hiyo:

  • Kipindi cha PWM kinapaswa kuwa 20 mS
  • Kwa wakati lazima iwe kati ya 0.5 mS hadi 2.5 mS. Wakati kwa wakati ni 0.5 mS, basi servo itageuka digrii 0, 1.5 mS kwa digrii 90, na 2.5 mS kwa digrii 180.

Kwa hivyo, tunahitaji kusanidi PWM na kwa kusudi hilo tutatumia Timer1.

  • Kwanza, chagua TIM1 kutoka sehemu ya Vipima muda. Hatua hii
  • Kisha, kutoka sehemu ya Njia
    1. Chagua Saa ya Ndani Hatua hii
    2. Kizazi cha PWM CH1 Hatua hii
  • Kisha, kutoka sehemu ya Usanidi

    1. Weka Prescaler kwa 160 Hatua hii
    2. Weka Kipindi cha Kukabiliana na 2000 Hatua hii
    3. Weka Pulse hadi 50 Hatua hii
  • Kwa kuongeza, kutoka kwa Usanidi wa Saa kuweka saa za APB1 Timer hadi 16MHz. Hatua hii

Sasa, wacha tuzungumze kidogo juu ya hatua hii:

Mzunguko wetu wa saa ya APB1 ni 16MHz. Kwa hivyo, inamaanisha kuwa inahitajika kupe 16, 000, 000 kupata sekunde 1. Walakini, tunaweka daktari wetu hadi 160. Inamaanisha, tunagawanya masafa yetu kwa idadi hiyo na kupunguza idadi ya kupe hadi 100, 000. Kwa hivyo, kwa sekunde 1 tunahitaji kupe elfu 100. Walakini, tunahitaji 20mS ya kipindi cha PWM kama tulivyosema hapo awali. Kwa hivyo, kulingana na hesabu rahisi, tunahitaji kupe 2000 kwa 20mS. Kwa hivyo, kwa kuweka Kipindi cha Kukabiliana na 2000 tunaamua kipindi cha ishara ya PWM ambayo ni 20mS. Sasa tunahitaji kuamua nambari ya kupe kwa kupata Mara kutoka 0.5mS hadi 2.5mS. Tunaweza kupata equation hii kutoka kwa hesabu rahisi na ni:

On_Time = (Tick_Number / 100). Kumbuka kwamba hii ni wakati wa wakati ambao hubadilisha pembe ya servo motor. Kwa hivyo, chini ya picha mimi muhtasari wa hatua hii. Ikiwa una swali lolote andika kwenye maoni na nitajibu haraka iwezekanavyo.

Picha ya mahesabu

Baada ya kufanya haya yote hutengeneza nambari:)

Hatua ya 3: Keil UVision Coding

Kwa hivyo, wacha kwanza tuamua nini tunataka kufanya? Tunataka, kuandika kazi ambayo inakubali digrii na kuiandikia servo. Kwa hivyo, tutafanyaje hivyo? Kama tulivyosema hapo awali, ili kubadilisha angle tunahitaji kubadilisha wakati. Angle zetu hubadilika kati ya [0, 180] na idadi yetu ya kupe ambayo huamua kwa wakati mabadiliko kati ya [50, 250]. Kwa hivyo, tunahitaji kazi ya ramani ambayo ramani zimepewa pembe kwa anuwai ya kupe. Kwa mfano, kwa tikiti 0 digrii 50, kwa kupe 180 digrii 250 na kadhalika… Kwa hivyo wacha tuandike kazi yetu ya ramani:

ramani ya int (int st1, int fn1, int st2, int fn2, int value) {kurudi (1.0 * (thamani-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2; }

Hii ni kazi yetu ya ramani. Je! Unavutiwa jinsi inavyopatikana? Kisha soma hiyo. Kwa hivyo, tunachukua safu zetu na thamani ambayo tunataka kuweka ramani.

Sasa, wacha tuandike kazi inayokubali pembe na kuiweka ramani kwa anuwai ya kupe:

batili servo_write (int angle) {htim1. Instance-> CCR1 = ramani (0, 180, 50, 250, angle); }

Kama unavyoona, nambari hii inakubali pembe na inaipa ramani kwa idadi ya kupe. Halafu, idadi ya kupe hutolewa kwa rejista ya CCR1 ambayo inadhibiti kwa wakati na kwa hivyo, pembe.

Walakini, ili hizi zote zifanye kazi tunaanza kwanza pwm ambayo inaweza kufanywa na laini tu ya nambari:

Anza HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Kwa hivyo, tuna kazi inayokubali pembe na kuiandikia servo. Wacha tuijaribu na tuandike kazi yetu ya kufagia ambayo ni rahisi sana:

utupu servo_sweep (utupu) {kwa (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay (10); } kwa (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

Kwa hivyo, ni hesabu hadi 180 halafu chini hadi 0 na andika maadili haya kwa servo:) Kwa hivyo, wacha tuone matokeo!

Hatua ya 4: Matokeo:)

Kwa hivyo, huu ndio mwisho. Ikiwa una swali lolote tafadhali uliza. Nitafurahi ili kuwajibu. Asante sana kwa kusoma na tunatumahi kuwa nitakuona katika mradi unaofuata:)

Ilipendekeza: