Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-23 14:42
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
- Valitse Sisäinen kello Tämä vaihe
- PWM -sukupolvi CH1 Tämä vaihe
- Sitten Configuration -osiosta
- Aseta esiasetin 160 -asentoon Tämä vaihe
- Aseta laskurijakso 2000 Tämä vaihe
- 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:
SERVOMOOTTORIN OHJAUS WIFI- JA BLYNK -KÄYTTÖÖN: 5 vaihetta
SERVO -MOOTTORIN OHJAUS WIFI- JA BLYNK -KÄYTTÖÖN: Hei kaverit, tässä opastetussa opetelkaamme hallitsemaan servomoottorin liikettä WiFi -yhteyden kautta solmun MCU: n ja Blynk -sovelluksen avulla
Arduino -opetusohjelma - Servomoottorin ohjaus ohjaussauvalla: 4 vaihetta
Arduino -opetusohjelma - Servomoottorin ohjaus ohjaussauvalla: Tässä opetusohjelmassa opimme käyttämään servoa ohjaussauvan kanssa. Ohjaamme 1 kpl servomoottoria yhdellä ohjaussauvalla ja voit toteuttaa robottivarsiprojektisi tämän opetusohjelman avulla. Käytämme tietysti ulkoista akkua / virtaa tehdessämme
Arduino -opetusohjelma - Servomoottorin ohjaus potentiometrillä: 5 vaihetta
Arduino -opetusohjelma - Servomoottorin ohjaus potentiometrillä: Tämä ohje on kirjallinen versio "Arduino: Servomoottorin ohjaamisesta potentiometrillä" " Äskettäin lataamani YouTube -video. Suosittelen lämpimästi tarkistamaan sen. Käy YouTube -kanavalla
Arduino -opetusohjelma - Servomoottorin ohjaus Arduinolla: 5 vaihetta
Arduino -opetusohjelma - Servomoottorin ohjaus Arduinolla: Tämä ohje on kirjallinen versio "Arduino: Servo -moottorin ohjaamisesta Arduinolla". Äskettäin lataamani YouTube -video. Suosittelen lämpimästi tarkistamaan sen. Käy YouTube -kanavalla
Servomoottorin näppäimistön ohjaus: 7 vaihetta
Servomoottorin näppäimistön ohjaus: Ensimmäinen on servomoottorin asentaminen. Keskijohto menee 5V -porttiin Vasen menee GND -porttiin Liitä viimeinen (ohjausjohto) porttiin 9