Indholdsfortegnelse:

Servomotorstyring med STM32F4 ARM MCU: 4 trin
Servomotorstyring med STM32F4 ARM MCU: 4 trin

Video: Servomotorstyring med STM32F4 ARM MCU: 4 trin

Video: Servomotorstyring med STM32F4 ARM MCU: 4 trin
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

Hej igen venner:) Så i dette projekt vil vi styre en servomotor med STM32F4 ARM MCU. I mit tilfælde vil jeg bruge discovery board, men hvis du forstår kernen i problemet, kan du anvende det på hver MCU. Så. Lad os komme igang:)

Trin 1: Krav til hardware og software

Med hensyn til hardware har vi brug for:

  • En MCU, som i mit tilfælde er STM32f4 Discovery board
  • En almindelig servomotor, som SG90 eller enhver anden

Med hensyn til software har vi brug for:

  • STM32CubeMX
  • Keil uVision

Hvis du har alle disse, skal du springe til næste trin:)

Trin 2: STM32CubeMX -konfiguration

Som du ved, har vi brug for PWM -signal til styring af en servomotor. Kravene med hensyn til PWM -signal er sådan:

  • PWM -perioden skal være 20 mS
  • Til tiden skal være mellem 0,5 mS til 2,5 mS. Når tiden er 0,5 mS, vil servoen dreje 0 grader, 1,5 mS for 90 grader og 2,5 mS for 180 grader.

Så vi skal konfigurere PWM, og til det formål vil vi bruge Timer1.

  • Vælg først TIM1 fra sektionen Timere. Dette trin
  • Derefter fra tilstandsafsnittet

    1. Vælg Intern ur Dette trin
    2. PWM Generation CH1 Dette trin
  • Derefter fra konfigurationsafsnittet

    1. Indstil Prescaler til 160 Dette trin
    2. Indstil tællerperiode til 2000 Dette trin
    3. Indstil Pulse til 50 Dette trin
  • Derudover indstillede APB1 Timer -ure fra urkonfiguration til 16MHz. Dette trin

Lad os nu tale lidt om dette trin:

Vores APB1 -timerurets frekvens er 16MHz. Så det betyder, at det kræves 16.000.000 flåter for at få 1 sekund. Vi indstiller imidlertid vores forkalkningsmaskine til 160. Det betyder, at vi dividerer vores frekvens med det tal og reducerede antallet af flåter til 100.000. Så i 1 sekund har vi brug for 100.000 flåter. Vi har imidlertid brug for 20 ms PWM -periode, som vi sagde tidligere. Så baseret på simpel matematik har vi brug for 2000 flåter til 20 ms. Så ved at indstille Tællerperiode til 2000 bestemmer vi perioden for PWM -signalet, som er 20mS. Nu skal vi bestemme krydsnummeret for at få On -tider fra 0,5 ms til 2,5 ms. Vi kan få denne ligning fra simpel matematik, og den er:

On_Time = (Tick_Number / 100). Husk, at dette er on_time, der ændrer vinklen på servomotoren. Så under billedet opsummerer jeg dette trin. Hvis du har spørgsmål, skriv i kommentarerne, og jeg svarer så hurtigt som muligt.

Billede af beregninger

Efter at have gjort alle disse genererer kode:)

Trin 3: Keil UVision -kodning

Så lad os først afgøre, hvad vi vil gøre? Vi vil skrive en funktion, der accepterer grad og skrive den til servoen. Så hvordan gør vi det? Som vi har sagt før, skal vi ændre til tiden for at ændre vinkel. Vores vinkler skifter mellem [0, 180] og vores antal flåter, der bestemmer tidsændringer mellem [50, 250]. Så vi har brug for en kortlægningsfunktion, der kortlægger en given vinkel til rækkevidde af flåter. For eksempel for 0 grader 50 flåter, for 180 grader 250 flåter og så videre … Så lad os skrive vores kortlægningsfunktion:

int map (int st1, int fn1, int st2, int fn2, int value) {return (1,0*(værdi-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

Dette er vores kortlægningsfunktion. Er du interesseret i, hvordan det stammer? Så læs det. Så vi tager vores intervaller og den værdi, vi vil kortlægge.

Lad os nu skrive en funktion, der accepterer vinkel og kortlægger den til flåter:

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

Som du kan se, accepterer denne kode vinkel og tilknytter den til antallet af flåter. Derefter gives antallet af flåter til CCR1 -registret, der styrer til -tiden og så vinkel.

Men for at alle disse kan fungere, starter vi først pwm, som kun kan udføres med en linje kode:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Så vi har en funktion, der accepterer vinkel og skriver den til servoen. Lad os teste det og skrive vores fejefunktion, som er meget let:

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 tæller bare op til 180 og derefter ned til 0 og skriver disse værdier til servoen:) Så lad os se resultatet!

Trin 4: Resultatet:)

Så det er slutningen. Spørg hvis du har spørgsmål. Jeg vil være glad for at besvare dem. Mange tak for din læsning, og håber at vi ses i det næste projekt:)

Anbefalede: