Cuprins:

Control servomotor cu STM32F4 ARM MCU: 4 pași
Control servomotor cu STM32F4 ARM MCU: 4 pași

Video: Control servomotor cu STM32F4 ARM MCU: 4 pași

Video: Control servomotor cu STM32F4 ARM MCU: 4 pași
Video: stm32f4 servo motor 2024, Iulie
Anonim
Control servomotor cu STM32F4 ARM MCU
Control servomotor cu STM32F4 ARM MCU
Control servomotor cu STM32F4 ARM MCU
Control servomotor cu STM32F4 ARM MCU

Bună ziua, prieteni:) Deci, în acest proiect vom controla un servomotor cu STM32F4 ARM MCU. În cazul meu, voi folosi placa de descoperire, dar dacă înțelegeți esența problemei, atunci o puteți aplica pentru fiecare MCU. Asa de. să începem:)

Pasul 1: Cerințe hardware și software

În ceea ce privește hardware-ul, vom avea nevoie de:

  • Un MCU care este în cazul meu placa Discovery STM32f4
  • Un servomotor comun, cum ar fi SG90 sau orice altul

În ceea ce privește software-ul, vom avea nevoie de:

  • STM32CubeMX
  • Keil uVision

Dacă aveți toate acestea, treceți la pasul următor:)

Pasul 2: Configurare STM32CubeMX

După cum știți, pentru controlul unui servomotor avem nevoie de semnal PWM. Cerințele în ceea ce privește semnalul PWM sunt astfel:

  • Perioada PWM trebuie să fie de 20 mS
  • La timp trebuie să fie între 0,5 mS și 2,5 mS. Când timpul este de 0,5 mS, atunci servo se va întoarce la 0 grade, 1,5 mS pentru 90 de grade și 2,5 mS pentru 180 de grade.

Deci, trebuie să configurăm PWM și în acest scop vom folosi Timer1.

  • Mai întâi, selectați TIM1 din secțiunea Cronometre. Acest pas
  • Apoi, din secțiunea Mode

    1. Alegeți Ceas intern Acest pas
    2. PWM Generation CH1 Acest pas
  • Apoi, din secțiunea Configurare

    1. Setați Prescalerul la 160 Acest pas
    2. Setați Perioada contorului la 2000 Acest pas
    3. Setați Pulse la 50 Acest pas
  • În plus, din Configurarea ceasului setați ceasurile APB1 Timer la 16 MHz. Acest pas

Acum, să vorbim puțin despre acest pas:

Frecvența ceasului APB1 Timer este de 16 MHz. Deci, înseamnă că este nevoie de 16, 000, 000 de căpușe pentru a obține o secundă. Cu toate acestea, ne-am setat prescalerul la 160. Înseamnă că ne împărțim frecvența la acel număr și am redus numărul de căpușe până la 100 000. Deci, pentru o secundă avem nevoie de 100 000 de căpușe. Cu toate acestea, avem nevoie de 20mS de perioadă PWM așa cum am menționat anterior. Deci, pe baza matematicii simple, avem nevoie de 2000 de căpușe pentru 20mS. Deci, setând Perioada contorului la 2000, determinăm perioada semnalului PWM care este de 20mS. Acum trebuie să determinăm numărul de bifare pentru obținerea timpilor de pornire de la 0,5mS la 2,5mS. Putem obține această ecuație dintr-o matematică simplă și este:

On_Time = (Tick_Number / 100). Rețineți că acesta este timpul de pornire care modifică unghiul servomotorului. Deci, în imaginea de mai jos rezum acest pas. Dacă aveți vreo întrebare scrieți în comentarii și voi răspunde cât mai repede posibil.

Imagine a calculelor

După ce ați făcut toate acestea, generați cod:)

Pasul 3: Codificare UVil Keil

Deci, să stabilim mai întâi ce vrem să facem? Vrem să scriem o funcție care acceptă gradul și să o scriem în servo. Deci, cum vom face asta? După cum am mai spus, pentru a schimba unghiul, trebuie să schimbăm timpul. Unghiurile noastre se schimbă între [0, 180] și numărul nostru de căpușe, care determină schimbările de timp între [50, 250]. Deci, avem nevoie de o funcție de cartografiere care să mapeze unghiul dat în funcție de numărul de căpușe. De exemplu, pentru 0 grade 50 căpușe, pentru 180 grade 250 căpușe și așa mai departe … Deci, să scriem funcția noastră de cartografiere:

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

Aceasta este funcția noastră de cartografiere. Vă interesează cum este derivat? Atunci citește asta. Deci, luăm gamele noastre și valoarea pe care dorim să o mapăm.

Acum, să scriem o funcție care acceptă unghiul și să o mapeze la intervalul de căpușe:

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

După cum puteți vedea, acest cod acceptă unghiul și îl mapează la intervalul de număr de căpușe. Apoi, numărul de căpușe este dat registrului CCR1 care controlează unghiul de timp și deci.

Cu toate acestea, pentru ca toate acestea să funcționeze, începem mai întâi pwm, care se poate face doar printr-o linie de cod:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Deci, avem o funcție care acceptă unghiul și o scrie pe servo. Să-l testăm și să scriem funcția noastră de măturare, care este foarte ușoară:

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

Deci, numără până la 180 și apoi la 0 și scrie aceste valori pe servo:) Deci, să vedem rezultatul!

Pasul 4: Rezultatul:)

Deci, acesta este sfârșitul. Dacă aveți întrebări, vă rugăm să întrebați. Voi fi fericit pentru a le răspunde. Vă mulțumesc foarte mult pentru lectură și sper să ne vedem în următorul proiect:)

Recomandat: