INHOUDSOPGAWE:

Servomotorbeheer met STM32F4 ARM MCU: 4 stappe
Servomotorbeheer met STM32F4 ARM MCU: 4 stappe

Video: Servomotorbeheer met STM32F4 ARM MCU: 4 stappe

Video: Servomotorbeheer met STM32F4 ARM MCU: 4 stappe
Video: Marlin Firmware - VScode PlatformIO Install - Build Basics 2024, November
Anonim
Servomotorbeheer met STM32F4 ARM MCU
Servomotorbeheer met STM32F4 ARM MCU
Servomotorbeheer met STM32F4 ARM MCU
Servomotorbeheer met STM32F4 ARM MCU

Hallo weer vriende:) Dus, in hierdie projek beheer ons 'n servomotor met STM32F4 ARM MCU. In my geval sal ek die ontdekkingsbord gebruik, maar as u die kern van die probleem verstaan, kan u dit op elke MCU toepas. So. laat ons begin:)

Stap 1: Vereistes vir hardeware en sagteware

Wat hardeware betref, benodig ons:

  • 'N MCU wat in my geval STM32f4 Discovery -bord is
  • 'N Algemene servomotor, soos SG90 of enige ander motor

Wat sagteware betref, benodig ons:

  • STM32CubeMX
  • Keil uVision

Gaan na die volgende stap as u dit alles het:)

Stap 2: STM32CubeMX -opset

Soos u weet, benodig ons PWM -sein vir die bestuur van 'n servomotor. Die vereistes in terme van PWM -sein is soos volg:

  • PWM tydperk moet 20 mS wees
  • Tyd moet tussen 0,5 mS tot 2,5 mS wees. As die tyd betyds 0,5 mS is, draai die servo 0 grade, 1,5 mS vir 90 grade en 2,5 mS vir 180 grade.

Ons moet dus PWM instel en daarvoor gebruik ons Timer1.

  • Kies eers TIM1 in die afdeling Timers. Hierdie stap
  • Dan, uit die modus -afdeling

    1. Kies interne klok Hierdie stap
    2. PWM Generation CH1 Hierdie stap
  • Dan, uit die konfigurasie -afdeling

    1. Stel Prescaler op 160 Hierdie stap
    2. Stel die tellerperiode op 2000 Hierdie stap
    3. Stel Pulse op 50 Hierdie stap
  • Verder stel APB1 Timer -horlosies vanaf die klokkonfigurasie op 16MHz. Hierdie stap

Kom ons praat 'n bietjie oor hierdie stap:

Die frekwensie van ons APB1 -timer is 16MHz. Dit beteken dus dat dit 16 000 000 bosluise benodig om 1 sekonde te kry. Ons stel egter ons voorverkoeler op 160. Dit beteken dat ons ons frekwensie deur die getal deel en die aantal bosluise verminder tot 100 000. Dus, vir 1 sekonde benodig ons 100 000 bosluise. Ons benodig egter 20mS PWM -tydperk soos ons vroeër gesê het. Op grond van eenvoudige wiskunde benodig ons dus 2000 bosluise vir 20mS. Dus, deur die tellerperiode op 2000 te stel, bepaal ons die tydperk van die PWM -sein wat 20mS is. Ons moet nou die regmerkie bepaal om die tye van 0.5mS tot 2.5mS te kry. Ons kan hierdie vergelyking uit eenvoudige wiskunde kry en dit is:

Op_Tyd = (Tik_getal / 100). Hou in gedagte dat dit die on_time is wat die hoek van die servomotor verander. Dus, onder die prent, vat ek hierdie stap saam. Skryf in die kommentaar as u enige vrae het, en ek sal so vinnig as moontlik antwoord.

Beeld van berekeninge

Nadat u dit alles gedoen het, genereer u kode:)

Stap 3: Keil UVision -kodering

Dus, laat ons eers bepaal wat ons wil doen? Ons wil 'n funksie skryf wat die graad aanvaar en dit aan die servo skryf. So, hoe gaan ons dit doen? Soos ons al voorheen gesê het, moet ons die tyd betyds verander om die hoek te verander. Ons hoeke verander tussen [0, 180] en ons aantal bosluise wat bepaal hoe tydsveranderings tussen [50, 250] is. Ons benodig dus 'n karteringsfunksie wat 'n gegewe hoek na die reeks bosluise toewys. Byvoorbeeld, vir 0 grade 50 bosluise, vir 180 grade 250 bosluise ensovoorts … Kom ons skryf ons karteringsfunksie:

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

Dit is ons karteringsfunksie. Stel u belang hoe dit afgelei word? Lees dit dan. Ons neem dus ons reekse en die waarde wat ons wil toewys.

Laat ons nou 'n funksie skryf wat hoek aanvaar en dit in die reeks bosluise in kaart bring:

leegte servo_write (int hoek) {htim1. Instance-> CCR1 = kaart (0, 180, 50, 250, hoek); }

Soos u kan sien, aanvaar hierdie kode hoek en bring dit na die aantal bosluise. Dan word die aantal bosluise gegee aan die CCR1 -register wat die aan -tyd en so die hoek beheer.

Om dit alles te laat werk, begin ons eers met die pwm, wat slegs met 'n reël kode gedoen kan word:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Ons het dus 'n funksie wat hoek aanvaar en dit aan die servo skryf. Kom ons toets dit en skryf ons sweepfunksie, wat baie maklik is:

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

Dus, dit tel net tot 180 en dan tot 0 en skryf hierdie waardes aan die servo:) Laat ons die resultaat sien!

Stap 4: Die resultaat:)

So, dit is die einde. As u enige vrae het, vra asb. Ek sal bly wees om hulle te kan beantwoord. Baie dankie dat u gelees het en hoop ek sien u in die volgende projek:)

Aanbeveel: