Innehållsförteckning:

Servomotorstyrning med STM32F4 ARM MCU: 4 steg
Servomotorstyrning med STM32F4 ARM MCU: 4 steg

Video: Servomotorstyrning med STM32F4 ARM MCU: 4 steg

Video: Servomotorstyrning med STM32F4 ARM MCU: 4 steg
Video: Servo motor controlled by Pulse Width Modulation from an Arduino 2024, November
Anonim
Servomotorstyrning med STM32F4 ARM MCU
Servomotorstyrning med STM32F4 ARM MCU
Servomotorstyrning med STM32F4 ARM MCU
Servomotorstyrning med STM32F4 ARM MCU

Hej igen kompisar:) Så i detta projekt kommer vi att styra en servomotor med STM32F4 ARM MCU. I mitt fall kommer jag att använda upptäcktskort, men om du förstår kärnan i problemet kan du använda det för varje MCU. Så. låt oss börja:)

Steg 1: Krav på hårdvara och programvara

När det gäller hårdvara behöver vi:

  • En MCU som i mitt fall är STM32f4 Discovery board
  • En vanlig servomotor, som SG90 eller någon annan

När det gäller programvara behöver vi:

  • STM32CubeMX
  • Keil uVision

Om du har alla dessa, hoppa till nästa steg:)

Steg 2: STM32CubeMX -konfiguration

Som du vet behöver vi PWM -signal för att styra en servomotor. Kraven när det gäller PWM -signal är så här:

  • PWM -perioden måste vara 20 mS
  • Tid måste vara mellan 0,5 mS till 2,5 mS. När tiden är 0,5 mS, kommer servon att vända 0 grader, 1,5 mS för 90 grader och 2,5 mS för 180 grader.

Så vi måste konfigurera PWM och för det ändamålet kommer vi att använda Timer1.

  • Välj först TIM1 från avsnittet Timers. Detta steg
  • Sedan från lägesdelen

    1. Välj Intern klocka Detta steg
    2. PWM Generation CH1 Detta steg
  • Sedan från konfigurationsavsnittet

    1. Ställ Prescaler på 160 Detta steg
    2. Ställ in räknarperiod till 2000 Detta steg
    3. Ställ in pulsen på 50 Detta steg
  • Från klockkonfiguration ställer du dessutom in APB1 Timer -klockor till 16MHz. Detta steg

Låt oss nu prata lite om detta steg:

Vår APB1 -timerurfrekvens är 16MHz. Så det betyder att det krävs 16 000 000 fästingar för att få 1 sekund. Vi ställer dock in vår förkalkning på 160. Det betyder att vi delar vår frekvens med det antalet och minskade antalet fästingar till 100 000. Så för 1 sekund behöver vi 100 000 fästingar. Vi behöver emellertid 20 ms PWM -period som vi sade tidigare. Så, baserat på enkel matematik, behöver vi 2000 fästingar för 20 ms. Så genom att ställa in Räkneperiod till 2000 bestämmer vi perioden för PWM -signalen som är 20mS. Nu måste vi bestämma bocknumret för att få på -tider från 0,5 ms till 2,5 ms. Vi kan få denna ekvation från enkel matematik och det är:

On_Time = (Tick_Number / 100). Tänk på att detta är on_time som ändrar vinkeln på servomotorn. Så under bilden sammanfattar jag detta steg. Om du har några frågor skriv i kommentarerna så svarar jag så snabbt som möjligt.

Bild på beräkningar

Efter att ha gjort alla dessa generera kod:)

Steg 3: Keil UVision -kodning

Så, låt oss först avgöra vad vi vill göra? Vi vill skriva en funktion som accepterar examen och skriva den till servon. Så hur ska vi göra det? Som vi har sagt tidigare, för att ändra vinkel måste vi ändra tid. Våra vinklar ändras mellan [0, 180] och vårt antal fästingar som avgör tidsändringar mellan [50, 250]. Så, vi behöver en kartläggningsfunktion som kartlägger en given vinkel till intervallet för antal fästingar. Till exempel för 0 grader 50 fästingar, för 180 grader 250 fästingar och så vidare … Så låt oss skriva vår kartfunktion:

int map (int st1, int fn1, int st2, int fn2, int value) {return (1.0*(value-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Detta är vår kartfunktion. Är du intresserad av hur det härleds? Läs sedan det. Så vi tar våra intervall och det värde som vi vill kartlägga.

Låt oss nu skriva en funktion som accepterar vinkel och kartlägger den till fästingarna:

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

Som du kan se accepterar den här koden vinkel och kartlägger den till antalet fästingar. Därefter ges antalet fästingar till CCR1 -registret som styr på -tiden och så, vinkel.

Men för att alla dessa ska fungera startar vi först pwm som kan göras med bara en kodrad:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Så vi har en funktion som accepterar vinkel och skriver den till servon. Låt oss testa det och skriva vår svepfunktion som är väldigt lätt:

void servo_sweep (void) {för (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Fördröjning (10); } för (int i = 180; i> = 0; i--) {servo_write (i); HAL_Fördröjning (10); }}

Så det räknas bara upp till 180 och sedan ner till 0 och skriver dessa värden till servon:) Så, låt oss se resultatet!

Steg 4: Resultatet:)

Så det här är slutet. Om du har några frågor, fråga. Jag kommer att vara glad för att kunna svara på dem. Tack så mycket för att du läste och hoppas att vi ses i nästa projekt:)

Rekommenderad: