Servomotorele sunt foarte utile în electronică și sisteme încorporate. Puteți găsi utilizarea servomotorului peste tot în jurul vostru, acestea sunt folosite în jucării, roboți, tăvi CD pentru computer, mașini, avion etc. Motivul acestui domeniu larg este că servomotorul este foarte fiabil și precis. Îl putem roti la orice unghi special. Sunt disponibile într-o gamă largă, de la motoare cu cuplu ridicat la motoare cu cuplu mic. În acest tutorial vom interfața un servomotor la microcontrolerul 8051 (AT89S52).
Mai întâi trebuie să înțelegem principiul de funcționare al servomotorelor. Servomotorul funcționează pe principiul PWM (modularea lățimii impulsurilor), înseamnă că unghiul său de rotație este controlat de durata impulsului aplicat la PIN-ul său de control. Practic, servomotorul este alcătuit dintr-un motor DC care este controlat de un rezistor variabil (potențiometru) și de unele angrenaje. Forța de viteză mare a motorului de curent continuu este convertită în cuplu de către Gears. Știm că MUNCA = FORȚA X DISTANȚĂ, în motorul continuu Forța este mai mică și distanța (viteza) este mare și în Servo, forța este mare și distanța este mai mică. Potențiometrul este conectat la arborele de ieșire al servo-ului, pentru a calcula unghiul și a opri motorul de curent continuu pe unghiul necesar.
Servomotorul poate fi rotit de la 0 la 180 de grade, dar poate merge până la 210 de grade, în funcție de producător. Acest grad de rotație poate fi controlat prin aplicarea unui impuls de nivel 1 LOGIC pe o durată cuprinsă între 1ms și 2ms. Un 1 ms poate roti servo la 0 grade, 1,5 ms se poate roti la 90 de grade și impulsul de 2 ms îl poate roti la 180 de grade. Durata cuprinsă între 1 și 2 ms poate roti Servomotorul la orice unghi între 0 și 180 de grade.
Diagrama circuitului și explicația de lucru
Servomotorul are trei fire roșu pentru Vcc (sursă de alimentare), maro pentru masă, iar portocaliu este fir de control. Firul de control poate fi conectat la 8051, l-am conectat la Pinul 2.1 din 8051. Acum trebuie să păstrăm acest pin la Logic 1 timp de 1 ms pentru a-l roti 0 grade, 1,5ms pentru 90 de grade, 2 ms pentru 180 de grade. Am folosit pe cip Timers de 8051 pentru a crea întârziere. Am creat întârziere de 50us prin funcția „servo_delay” și am folosit bucla „pentru” pentru a crea întârziere în multiplu de 50us.
Folosim Temporizatorul 0 și în Modul 1, așa că am pus 01H în registrul TMOD. Modul 1 este un mod de timer pe 16 biți, iar TH0 conține octet ridicat, iar TL0 conține octet scăzut de timer pe 16 biți. Am pus FFD2 în registrul temporizatorului pe 16 biți, FF în TH0 și D2 în TL0. Punerea FFD2 va crea întârzierea de aprox. 50 de noi cu cristalul de 11,0592MHz. TR0 și TF0 sunt biții registrului TCON, pin TR folosit pentru a porni cronometrul când este setat și pentru a opri la resetare (0). TF este semnal de depășire, setat de hardware atunci când depășește și trebuie să-l resetați prin software. Practic TF spune finalizarea Timer-ului și setat de hardware atunci când 16 timer tranzitează de la FFFFH la 0000H. Puteți citi despre „8051 Timers” pentru a înțelege calculul valorii în registrele temporizatorilor, pentru a crea întârzierea de 50 US.
Acum, măsurate de la CRO, 13 bucle ale funcției servo_delay vor da întârzierea de 1 ms, așa că am pornit de la 1 ms (13 bucle) și am trecut la 2 ms (26 bucle) pentru a roti servo-ul de la 0 la 180 de grade. Dar am crescut încet întârzierea de la 1 ms, am împărțit fereastra de la 1 ms la 2 ms în 7 părți precum 1,14 ms, 1,28 ms, 1,42 ms și așa mai departe, astfel încât servo-ul se va roti în multiple de aprox. 26 de grade (180/7). După 180 se va reveni automat la 0 grade.