Inhoudsopgave:

Servomotorbesturing met STM32F4 ARM MCU - Ajarnpa
Servomotorbesturing met STM32F4 ARM MCU - Ajarnpa

Video: Servomotorbesturing met STM32F4 ARM MCU - Ajarnpa

Video: Servomotorbesturing met STM32F4 ARM MCU - Ajarnpa
Video: Как правильно подключить сервопривод - серводвигатель к любому ПЛК?||Полное руководство 2024, Juli-
Anonim
Servomotorbesturing met STM32F4 ARM MCU
Servomotorbesturing met STM32F4 ARM MCU
Servomotorbesturing met STM32F4 ARM MCU
Servomotorbesturing met STM32F4 ARM MCU

Hallo weer vrienden:) Dus in dit project zullen we een servomotor besturen met STM32F4 ARM MCU. In mijn geval zal ik het ontdekkingsbord gebruiken, maar als je de kern van het probleem begrijpt, kun je het voor elke MCU toepassen. Dus. laten we beginnen:)

Stap 1: Hardware- en softwarevereisten

Qua hardware hebben we nodig:

  • Een MCU die in mijn geval STM32f4 Discovery board is
  • Een gewone servomotor, zoals SG90 of een andere;

Qua software hebben we nodig:

  • STM32CubeMX
  • Keil uVision

Als je al deze hebt, ga dan naar de volgende stap:)

Stap 2: STM32CubeMX-configuratie

Zoals u weet, hebben we voor het aansturen van een servomotor een PWM-signaal nodig. De vereisten in termen van PWM-signaal zijn als volgt:

  • PWM-periode moet 20 mS. zijn
  • De aan-tijd moet tussen 0,5 mS en 2,5 mS liggen. Wanneer op tijd 0,5 mS is, dan draait de servo 0 graden, 1,5 mS voor 90 graden en 2,5 mS voor 180 graden.

We moeten dus PWM configureren en daarvoor zullen we Timer1 gebruiken.

  • Selecteer eerst TIM1 in het gedeelte Timers. Deze stap
  • Vervolgens, vanuit het gedeelte Modus

    1. Kies Interne Klok Deze stap
    2. PWM Generatie CH1 Deze stap:
  • Vervolgens, vanuit het gedeelte Configuratie

    1. Stel Prescaler in op 160 Deze stap
    2. Stel Tellerperiode in op 2000 Deze stap
    3. Stel Puls in op 50 Deze stap
  • Bovendien stelt u vanuit Clock Configuration de APB1 Timer-klokken in op 16 MHz. Deze stap

Laten we het nu eens hebben over deze stap:

De frequentie van onze APB1 Timer-klok is 16 MHz. Het betekent dus dat er 16, 000, 000 ticks nodig zijn om 1 seconde te krijgen. We hebben onze prescaler echter ingesteld op 160. Het betekent dat we onze frequentie door dat aantal delen en het aantal tikken hebben verlaagd tot 100.000. Dus voor 1 seconde hebben we 100.000 tikken nodig. We hebben echter 20 mS PWM-periode nodig, zoals we eerder hebben vermeld. Dus, op basis van eenvoudige wiskunde, hebben we 2000 ticks nodig voor 20 mS. Dus door Tellerperiode in te stellen op 2000, bepalen we de periode van het PWM-signaal dat 20 mS is. Nu moeten we het tick-nummer bepalen om Aan-tijden van 0,5 mS tot 2,5 mS te krijgen. We kunnen deze vergelijking uit eenvoudige wiskunde halen en het is:

On_Time = (Tick_Number / 100). Houd er rekening mee dat dit de aan_tijd is die de hoek van de servomotor verandert. Dus onderstaande afbeelding vat ik deze stap samen. Als je een vraag hebt, schrijf dan in de comments en ik zal zo snel mogelijk antwoorden.

Afbeelding van berekeningen

Na het doen van al deze genereer code:)

Stap 3: Keil UVision-codering

Laten we dus eerst bepalen wat we willen doen? We willen een functie schrijven die graad accepteert en deze naar de servo schrijven. Dus, hoe gaan we dat doen? Zoals we eerder hebben gezegd, moeten we de hoek op tijd veranderen om van hoek te veranderen. Onze hoeken veranderen tussen [0, 180] en ons aantal tikken dat bepalend is voor de tijdsveranderingen tussen [50, 250]. We hebben dus een mapping-functie nodig die een gegeven hoek toewijst aan het bereik van het aantal tikken. Bijvoorbeeld, voor 0 graden 50 ticks, voor 180 graden 250 ticks enzovoort… Laten we dus onze mapping functie schrijven:

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

Dit is onze mappingfunctie. Ben je geïnteresseerd hoe het is afgeleid? Lees dat dan. We nemen dus onze bereiken en de waarde die we in kaart willen brengen.

Laten we nu een functie schrijven die de hoek accepteert en deze toewijst aan het bereik van teken:

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

Zoals u kunt zien, accepteert deze code de hoek en wijst deze toe aan het bereik van het aantal teken. Vervolgens wordt het aantal tikken gegeven aan het CCR1-register dat de op tijd en dus de hoek regelt.

Om deze allemaal te laten werken, starten we echter eerst de pwm, wat kan worden gedaan met slechts een regel code:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

We hebben dus een functie die de hoek accepteert en deze naar de servo schrijft. Laten we het testen en onze sweep-functie schrijven, wat heel eenvoudig is:

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

Dus, het telt gewoon tot 180 en dan omlaag naar 0 en schrijft deze waarden naar de servo:) Dus, laten we eens kijken naar het resultaat!

Stap 4: Het resultaat:)

Dit is dus het einde. Als u een vraag heeft, stel deze dan alstublieft. Ik zal ze graag beantwoorden. Heel erg bedankt voor het lezen en ik hoop je te zien in het volgende project:)

Aanbevolen: