Innholdsfortegnelse:

Servomotorstyring med STM32F4 ARM MCU: 4 trinn
Servomotorstyring med STM32F4 ARM MCU: 4 trinn

Video: Servomotorstyring med STM32F4 ARM MCU: 4 trinn

Video: Servomotorstyring med STM32F4 ARM MCU: 4 trinn
Video: [Dansk] Servo motor styring med Arduino 2024, Juli
Anonim
Servomotorstyring med STM32F4 ARM MCU
Servomotorstyring med STM32F4 ARM MCU
Servomotorstyring med STM32F4 ARM MCU
Servomotorstyring med STM32F4 ARM MCU

Hei igjen venner:) Så i dette prosjektet vil vi kontrollere en servomotor med STM32F4 ARM MCU. I mitt tilfelle vil jeg bruke discovery board, men hvis du forstår kjernen i problemet, kan du bruke det for hver MCU. Så. la oss komme i gang:)

Trinn 1: Krav til maskinvare og programvare

Når det gjelder maskinvare trenger vi:

  • En MCU som i mitt tilfelle STM32f4 Discovery board
  • En vanlig servomotor, som SG90 eller annen

Når det gjelder programvare trenger vi:

  • STM32CubeMX
  • Keil uVision

Hvis du har alle disse, hopper du til neste trinn:)

Trinn 2: STM32CubeMX -konfigurasjon

Som du vet, trenger vi PWM -signal for å kontrollere en servomotor. Kravene når det gjelder PWM -signal er slik:

  • PWM -perioden må være 20 mS
  • Tiden må være mellom 0,5 mS til 2,5 mS. Når tiden er 0,5 mS, vil servoen vende 0 grader, 1,5 mS for 90 grader og 2,5 mS for 180 grader.

Så vi må konfigurere PWM, og for det formålet bruker vi Timer1.

  • Velg først TIM1 fra Timere -delen. Dette trinnet
  • Deretter, fra modus -delen

    1. Velg Intern klokke Dette trinnet
    2. PWM Generation CH1 Dette trinnet
  • Deretter fra konfigurasjonsdelen

    1. Sett Prescaler til 160 Dette trinnet
    2. Sett tellerperiode til 2000 Dette trinnet
    3. Sett Pulse til 50 Dette trinnet
  • I tillegg, fra Clock Configuration, sett APB1 Timer -klokker til 16MHz. Dette trinnet

La oss nå snakke litt om dette trinnet:

Frekvensen til vår APB1 -timer er 16 MHz. Så det betyr at det kreves 16 000 000 flått for å få 1 sekund. Imidlertid setter vi prescaleren til 160. Det betyr at vi deler frekvensen vår med det tallet og reduserte antall flått til 100 000. Så i 1 sekund trenger vi 100 000 flått. Vi trenger imidlertid 20 ms PWM -periode som vi sa tidligere. Så, basert på enkel matematikk, trenger vi 2000 flått for 20mS. Så ved å sette Counter Period til 2000 bestemmer vi perioden for PWM -signalet som er 20mS. Nå må vi bestemme kryssnummeret for å få On -tider fra 0,5 ms til 2,5 ms. Vi kan få denne ligningen fra enkel matematikk, og den er:

On_Time = (Tick_Number / 100). Husk at dette er on_time som endrer vinkelen på servomotoren. Så under bildet oppsummerer jeg dette trinnet. Hvis du har spørsmål, skriv i kommentarene, så svarer jeg så raskt som mulig.

Bilde av beregninger

Etter å ha gjort alt dette genererer du kode:)

Trinn 3: Keil UVision -koding

Så la oss først finne ut hva vi vil gjøre? Vi vil skrive en funksjon som aksepterer grad og skrive den til servoen. Så, hvordan skal vi gjøre det? Som vi har sagt før, for å endre vinkel må vi endre på tid. Vinklene våre endres mellom [0, 180] og vårt antall flått som bestemmer tidsendringer mellom [50, 250]. Så vi trenger en kartleggingsfunksjon som kartlegger gitt vinkel til rekkevidde av flått. For eksempel, for 0 grader 50 flått, for 180 grader 250 flått og så videre … Så la oss skrive vår kartleggingsfunksjon:

int map (int st1, int fn1, int st2, int fn2, int verdi) {retur (1,0*(verdi-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

Dette er vår kartfunksjon. Er du interessert i hvordan det er avledet? Så les det. Så vi tar våre områder og verdien vi vil kartlegge.

La oss nå skrive en funksjon som godtar vinkel og tilordner den til flåtten:

void servo_write (int vinkel) {htim1. Instance-> CCR1 = map (0, 180, 50, 250, vinkel); }

Som du kan se, godtar denne koden vinkel og tilordner den til området med flått. Så blir antallet flått gitt til CCR1 -registeret som styrer på -tiden og så vinkelen.

Imidlertid, for at alle disse skal fungere, starter vi først pwm som kan gjøres med bare en linje med kode:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Så vi har en funksjon som godtar vinkel og skriver den til servoen. La oss teste det og skrive feiefunksjonen vår, som er veldig enkel:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_forsinkelse (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_forsinkelse (10); }}

Så det teller bare opp til 180 og deretter ned til 0 og skriver disse verdiene til servoen:) Så, la oss se resultatet!

Trinn 4: Resultatet:)

Så, dette er slutten. Spør hvis du har spørsmål. Jeg vil være glad for å svare dem. Tusen takk for at du leser, og håper jeg sees i neste prosjekt:)

Anbefalt: