|
There are no translations available.
Teoria e pratica con i servomotori
Il servomotore è un attuatore. Generalmente si presenta come un contenitore di materiale plastico dal quale esce un cavo di alimentazione/controllo ed un pignone dentellato.

all'interno dell'involucro vi trovano posto una circuiteria elettronica dedicata, un potenziometro, un motore elettrico alimentato con una tensione continua di 5/6 volts ed una serie di ingranaggi. Il principio di funzionamento è molto semplice: grazie ad un apposito segnale il pignone del motore si sposta in un angolo compreso tra -90° e 90°.

Per permettere questo movimento, oltre a fornire le giuste tensioni di alimentazione viene dato come input un treno di impulsi, composto da un'onda quadra compresa in un range tra 600usec e 2100 usec:

da come si può notare tra i vari impulsi vi è una pausa di refresh, che generalmente viene impostata a 20msec. Il potenziometro è collegato meccanicamente all'albero motore e serve per misurare l'attuale angolo di spostamento, se all'impulso inviato al servomotore corrisponde un angolo diverso di spostamento, esso ruoterà sino al raggiungimento dell'angolo di lavoro impostato.
Come calcolare il Δt
Ora che sappiamo quanto deve valere in termini di tempo il Δt, dobbiamo calcolarlo in base alla nostra configurazione hardware. La scheda Freedom del Golem monta un PIC Microchip 18f4580 con un clock settato da 20MHz, assumendo di volerla programmare nel modo più semplice possibile (busy waiting), dovremo creare un ciclo che apra e chiuda una porta del pic per creare un appropriato reno di impulsi:
TEMPO DI APERTURA / TEMPO DI UN CICLO = CICLI NECESSARI
Questo pic ha un TCY pari a 4/FOSC. Questo significa che con un clock di 20 MHz impiegherà 0,2 usec per compiere una singola istruzione, dunque avremo:
- -90°: ( 600 / 0,2 )usec = 3000 cicli
- +90°: ( 2100 / 0,2 )usec = 10500 cicli
- refresh: 20ms / 0,2usec = 100000 cicli
qui sotto riportiamo un codice di esempio in c18
PORTDbits.RD6 = 1; // apro la porta logica PORTD6 Delay100TCYx(30); // aspetto 600usec PORTDbits.RD6 = 0; // chiudo la porta logica PORTD6 Delay1KTCYx(100); // aspetto 20ms
Duty Cycle l'esempio del codice riportato sopra però pone un grave difetto: il Pic risulta sempre impegnato a gestire il servomotore. Un primo parametro di misura utile può essere il duty cycle, che non è altro che il rapporto tra il tempo complessivo del segnale alto e la durata totale del segnale:
d = tempo complessivo segnale alto / tempo complessivo
- nel caso di un treno di impulsi da 1500usec avrò un duty cycle del 7%
- nel caso di un treno di impulsi da 1500usec avrò un duty cycle del 9%
qui emerge un parametro fondamentale: il vero lavoro che impegna pic è il cambio dello stato della porta logica da chiusa ad aperta e viceversa, se usiamo il pic a questo scopo come nel paragrafo sopra descritto abbiamo un problema di ottimizzazione, che in gergo viene denominato busy waiting (attesa attiva). Si potrebbe ottimizzare il programma in base a questa esigenza, e per fare ciò abbiamo bisogno di una nozione più avanzata, la gestione degli interrupt.
Riferimenti http://www.hitecrcd.com/files/Servomanual.pdf http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en020615
|