I servomotori sono molto utili nell'elettronica e nei sistemi embedded. Puoi trovare l'uso del servomotore ovunque intorno a te, sono usati in giocattoli, robot, vassoio CD di computer, automobili, aeroplani ecc. La ragione di questo ampio scopo è che il servomotore è molto affidabile e preciso. Possiamo ruotarlo a qualsiasi angolo particolare. Sono disponibili in un'ampia gamma, da motori a coppia elevata a motori a coppia ridotta. In questo tutorial interfacciamo un servomotore al microcontrollore 8051 (AT89S52).
Per prima cosa dobbiamo capire il principio di funzionamento dei servomotori. Il servomotore funziona sul principio PWM (Pulse width modulation), significa che il suo angolo di rotazione è controllato dalla durata dell'impulso applicato al suo PIN di controllo. Fondamentalmente il servomotore è costituito da un motore CC controllato da un resistore variabile (potenziometro) e da alcuni ingranaggi. La forza ad alta velocità del motore CC viene convertita in coppia da Gears. Sappiamo che LAVORO = FORZA X DISTANZA, nel motore DC la Forza è minore e la distanza (velocità) è alta e in Servo, la forza è Alta e la distanza è minore. Il potenziometro è collegato all'albero di uscita del servo, per calcolare l'angolo e arrestare il motore CC sull'angolo richiesto.
Il servomotore può essere ruotato da 0 a 180 gradi, ma può arrivare fino a 210 gradi, a seconda del produttore. Questo grado di rotazione può essere controllato applicando un impulso LOGIC di livello 1 per una durata compresa tra 1ms e 2ms. Un 1 ms può ruotare il servo a 0 gradi, 1,5 ms può ruotare a 90 gradi e un impulso di 2 ms può ruotarlo a 180 gradi. La durata compresa tra 1 e 2 ms può ruotare il servomotore a qualsiasi angolo compreso tra 0 e 180 gradi.
Schema del circuito e spiegazione del funzionamento
Il servomotore ha tre fili rosso per Vcc (alimentazione), marrone per terra e arancione è il cavo di controllo. Il cavo di controllo può essere collegato all'8051, lo abbiamo collegato al pin 2.1 dell'8051. Ora dobbiamo mantenere questo pin su Logic 1 per 1 ms per ruotarlo di 0 gradi, 1,5 ms per 90 gradi, 2 ms per 180 gradi. Abbiamo utilizzato timer su chip dell'8051 per creare un ritardo. Abbiamo creato un ritardo di 50us tramite la funzione "servo_delay" e utilizzato il loop "for" per creare un ritardo in multipli di 50us.
Stiamo usando Timer 0 e in Modalità 1, quindi abbiamo inserito 01H nel registro TMOD. La modalità 1 è la modalità timer a 16 bit e TH0 contiene byte alto e TL0 contiene byte basso di timer a 16 bit. Abbiamo inserito FFD2 nel registro del timer a 16 bit, FF in TH0 e D2 in TL0. Mettere FFD2 creerà il ritardo di ca. 50 us con il cristallo di 11.0592MHz. TR0 e TF0 sono i bit del registro TCON, il pin TR utilizzato per avviare il timer quando impostato e fermarsi quando viene ripristinato (0). TF è un flag di overflow, impostato dall'hardware in caso di overflow e deve essere ripristinato dal software. Fondamentalmente TF indica il completamento del timer e impostato dall'hardware quando 16 timer transitano da FFFFH a 0000H. Puoi leggere le informazioni sui "8051 Timer" per comprendere il calcolo del valore nei registri dei timer, per creare il ritardo di 50 us.
Ora, se misurati da CRO, 13 loop della funzione servo_delay daranno un ritardo di 1 ms, quindi siamo partiti da 1 ms (13 loop) e siamo passati a 2 ms (26 loop) per ruotare il servo da 0 a 180 gradi. Ma abbiamo incrementato lentamente il ritardo da 1 ms, abbiamo diviso la finestra da 1 ms a 2 ms in 7 parti come 1,14 ms, 1,28 ms, 1,42 ms e così via, quindi il servo ruoterà in multipli di ca. 26 gradi (180/7). Dopo 180 tornerà automaticamente a 0 gradi.