Sisällysluettelo:

Servomoottorin ohjaus STM32F4 ARM MCU: 4 vaihetta
Servomoottorin ohjaus STM32F4 ARM MCU: 4 vaihetta

Video: Servomoottorin ohjaus STM32F4 ARM MCU: 4 vaihetta

Video: Servomoottorin ohjaus STM32F4 ARM MCU: 4 vaihetta
Video: Testing servo 2024, Heinäkuu
Anonim
Servomoottorin ohjaus STM32F4 ARM MCU: lla
Servomoottorin ohjaus STM32F4 ARM MCU: lla
Servomoottorin ohjaus STM32F4 ARM MCU: lla
Servomoottorin ohjaus STM32F4 ARM MCU: lla

Hei taas ystävät:) Joten tässä projektissa ohjaamme servomoottoria STM32F4 ARM MCU: lla. Minun tapauksessani käytän etsintäkorttia, mutta jos ymmärrät ongelman ytimen, voit käyttää sitä jokaisessa MCU: ssa. Niin. aloitetaan:)

Vaihe 1: Laitteisto- ja ohjelmistovaatimukset

Laitteiston osalta tarvitsemme:

  • MCU, joka on minun tapauksessani STM32f4 Discovery -levy
  • Yleinen servomoottori, kuten SG90 tai mikä tahansa muu

Ohjelmiston osalta tarvitsemme:

  • STM32CubeMX
  • Keil uVision

Jos sinulla on kaikki nämä, siirry seuraavaan vaiheeseen:)

Vaihe 2: STM32CubeMX -määritykset

Kuten tiedätte, servomoottorin ohjaamiseen tarvitsemme PWM -signaalia. PWM -signaalin vaatimukset ovat seuraavat:

  • PWM -ajan on oltava 20 mS
  • Ajan on oltava välillä 0,5 mS - 2,5 mS. Kun oikea aika on 0,5 mS, servo kääntyy 0 astetta, 1,5 mS 90 astetta ja 2,5 mS 180 astetta.

Joten meidän on määritettävä PWM ja tätä tarkoitusta varten käytämme ajastinta 1.

  • Valitse ensin TIM1 ajastimista. Tämä vaihe
  • Sitten Tila -osiosta
    1. Valitse Sisäinen kello Tämä vaihe
    2. PWM -sukupolvi CH1 Tämä vaihe
  • Sitten Configuration -osiosta
    1. Aseta esiasetin 160 -asentoon Tämä vaihe
    2. Aseta laskurijakso 2000 Tämä vaihe
    3. Aseta pulssi arvoon 50 Tämä vaihe
  • Lisäksi aseta kellokokoonpanosta APB1 -ajastinkellot 16 MHz: iin. Tämä vaihe

Puhutaan nyt hieman tästä vaiheesta:

APB1 -ajastinkellomme taajuus on 16 MHz. Joten se tarkoittaa, että 1 sekunnin saamiseksi tarvitaan 16 000 000 punkkia. Esiasetuksemme on kuitenkin 160. Se tarkoittaa, että jaamme taajuutemme tällä lukumäärällä ja vähensimme punkkien määrän 100 000: een. Tarvitsemme siis 1 sekunnin ajan 100 000 punkkia. Tarvitsemme kuitenkin 20 mS PWM -aikaa, kuten aiemmin totesimme. Joten yksinkertaisen matematiikan perusteella tarvitsemme 2000 punkkia 20 mS: lle. Joten asettamalla laskurijakson arvoksi 2000 määritämme PWM -signaalin ajanjakson, joka on 20 mS. Nyt meidän on määritettävä rasti -numero, jotta pääsyajat ovat 0,5 mS - 2,5 mS. Voimme saada tämän yhtälön yksinkertaisesta matematiikasta ja se on:

On_Time = (Tick_Number / 100). Muista, että tämä on aika, joka muuttaa servomoottorin kulmaa. Joten, kuvan alla tiivistän tämän vaiheen. Jos sinulla on kysyttävää, kirjoita kommentteihin ja vastaan mahdollisimman nopeasti.

Kuva laskelmista

Kun olet tehnyt nämä kaikki, luo koodi:)

Vaihe 3: Keil UVision -koodaus

Joten määritetään ensin, mitä haluamme tehdä? Haluamme kirjoittaa funktion, joka hyväksyy asteen ja kirjoittaa sen servolle. Joten miten teemme sen? Kuten olemme aiemmin sanoneet, kulman muuttamiseksi meidän on muutettava ajoissa. Kulmamme muuttuvat välillä [0, 180] ja punkkien lukumäärä, joka määrittää ajan muutoksen välillä [50, 250]. Tarvitsemme siis kartoitustoiminnon, joka kartoittaa annetun kulman punkkien lukumäärään. Esimerkiksi 0 asteen 50 punkille, 180 asteen 250 punkille ja niin edelleen … Kirjoitetaan siis kartoitustoimintomme:

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

Tämä on kartoitustoimintomme. Oletko kiinnostunut siitä, miten se on johdettu? Lue se sitten. Joten otamme alueemme ja arvon, jonka haluamme kartoittaa.

Kirjoitetaan nyt funktio, joka hyväksyy kulman ja yhdistää sen punkkien alueeseen:

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

Kuten näette, tämä koodi hyväksyy kulman ja yhdistää sen punkkien lukumäärään. Sitten punkkien lukumäärä annetaan CCR1 -rekisterille, joka ohjaa oikea -aikaista kulmaa.

Jotta kaikki nämä toimisivat, käynnistetään kuitenkin ensin pwm, joka voidaan tehdä vain koodirivillä:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Joten meillä on toiminto, joka hyväksyy kulman ja kirjoittaa sen servolle. Testaa se ja kirjoita lakaisutoiminto, joka on erittäin helppo:

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

Joten se vain laskee jopa 180 ja sitten alas 0 ja kirjoittaa nämä arvot servolle:) Katsotaan siis tulosta!

Vaihe 4: Tulos:)

Joten tämä on loppu. Jos sinulla on kysyttävää, kysy. Olen iloinen voidessani vastata niihin. Kiitos paljon lukemisesta ja toivottavasti nähdään seuraavassa projektissa:)

Suositeltava: