- Componenti richiesti
- Descrizione pin del servomotore
- Schema elettrico
- Controllo del servomotore con AVR ATmega16
- Programmazione di Atmega16 tramite USBasp
I servomotori sono ampiamente utilizzati dove è richiesto un controllo preciso come robot, macchinari automatizzati, bracci robotici, ecc. Tuttavia, l'ambito del servomotore non è limitato a questo e può essere utilizzato in molte applicazioni. Per saperne di più sulle basi, teoria e principio di funzionamento del servomotore segui il link.
In precedenza abbiamo interfacciato il servomotore con molti microcontrollori:
- Interfacciamento del servomotore con ARM7-LPC2148
- Interfacciamento del servomotore con MSP430G2
- Interfacciamento del servomotore con STM32F103C8
- Interfacciamento del servomotore con il microcontrollore PIC utilizzando MPLAB e XC8
- Interfacciamento del servomotore con Arduino Uno
- Interfacciamento servomotore con microcontrollore 8051
In questo tutorial, interfacciamo Micro Servo Motor con Atmega16 AVR Microcontroller utilizzando Atmel Studio 7.0. Il servomotore è valutato per funzionare in 4.8-6V. Possiamo controllare il suo angolo di rotazione e direzione applicando segnali a treno di impulsi o PWM. Notare che i servomotori non possono muoversi per una rotazione completa di 360 gradi, quindi vengono utilizzati dove non è richiesta la rotazione continua. L'angolo di rotazione è 0-180 gradi o (-90) - (+90) gradi.
Componenti richiesti
- Micro servomotore SG90 Tower Pro
- Atmega16 Microcontroller IC
- Oscillatore in cristallo da 16 Mhz
- Due condensatori da 100 nF
- Due condensatori da 22pF
- Premi il bottone
- Cavi per ponticelli
- Breadboard
- USBASP v2.0
- Led (qualsiasi colore)
Descrizione pin del servomotore
- Rosso = alimentazione positiva (da 4,8 V a 6 V)
- Marrone = terra
- Arancione = segnale di controllo (pin PWM)
Schema elettrico
Collegare tutti i componenti come mostrato nello schema seguente per ruotare il servomotore utilizzando il microcontrollore AVR. Ci sono quattro pin PWM, possiamo usare qualsiasi pin PWM di Atmega16. In questo tutorial stiamo usando il Pin PD5 (OC1A) per generare PWM. Il PD5 è collegato direttamente al filo arancione del servomotore che è il pin del segnale di ingresso. Collegare qualsiasi led di colore per l'indicatore di alimentazione. Inoltre, collegare un pulsante nel pin di ripristino per ripristinare Atmega16 quando necessario. Collegare Atmega16 con il circuito dell'oscillatore a cristallo appropriato. Tutto il sistema sarà alimentato da 5V.
La configurazione completa apparirà come di seguito:
Controllo del servomotore con AVR ATmega16
Come il motore passo-passo, il servomotore non necessita di alcun driver esterno, ad esempio il driver del motore ULN2003 o L293D. Solo PWM è sufficiente per pilotare il servomotore ed è molto facile generare PWM da un microcontrollore. La coppia di questo servomotore è di 2,5 kg / cm, quindi se è necessaria una coppia maggiore, questo servo non è adatto.
Come sappiamo, il servomotore cerca un impulso ogni 20 ms e la lunghezza dell'impulso positivo determinerà l'angolo di rotazione del servomotore.
La frequenza richiesta per ottenere l'impulso di 20 ms è di 50 Hz (f = 1 / T). Quindi per questo servomotore, la specifica dice che per 0 gradi abbiamo bisogno di 0,388 ms, per 90 gradi abbiamo bisogno di 1,264 ms e per 180 gradi abbiamo bisogno di un impulso di 2,14 ms.
Per generare impulsi specificati useremo Timer1 di Atmega16. La frequenza della CPU è di 16Mz ma utilizzeremo solo 1Mhz poiché non abbiamo molte periferiche collegate al microcontrollore e non c'è molto carico sul microcontrollore, quindi 1Mhz farà il lavoro. Il Prescaler è impostato su 1. Quindi l'orologio è diviso come 1Mhz / 1 = 1Mhz (1uS) che è fantastico. Timer1 verrà utilizzato come modalità PWM veloce, ovvero Modalità 14. È possibile utilizzare diverse modalità di timer per generare il treno di impulsi desiderato. Il riferimento è dato di seguito e puoi trovare una descrizione più dettagliata nella scheda tecnica ufficiale di Atmega16.
Per utilizzare Timer1 come modalità PWM veloce avremo bisogno del valore TOP di ICR1 (Input Capture Register1). Per trovare il valore TOP utilizzare la formula fornita di seguito:
f pwm = f cpu / nx (1 + TOP)
Questo può essere semplificato a, TOP = ( f cpu / ( f pwm xn)) - 1
Dove, N = valore del set prescrittore
f cpu = CPU Frequencey
f pwm = larghezza dell'impulso del servomotore che è 50Hz
Ora calcola il valore ICR1 poiché abbiamo tutti i valori richiesti, N = 1, f cpu = 1MHz, f pwm = 50Hz
Basta inserire i valori nella formula sopra e otterremo
ICR1 = 1999
Ciò significa che per raggiungere il grado massimo, ovvero 180 0, l'ICR1 dovrebbe essere 1999.
Per il cristallo da 16 MHz e il Prescaler impostato su 16, avremo
ICR1 = 4999
Ora passiamo alla discussione dello schizzo.
Programmazione di Atmega16 tramite USBasp
Di seguito è riportato il codice AVR completo per il controllo del servomotore. Il codice è semplice e può essere compreso facilmente.
Qui abbiamo codificato l'Atmega16 per ruotare il servomotore da 0 0 a 180 0 e tornare di nuovo da 180 0 a 0 0. Questa transizione verrà completata in 9 passaggi, ovvero 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Per il ritardo, utilizzeremo la libreria interna di Atmel Studio, ovvero
Collega il tuo USBASP v2.0 e segui le istruzioni in questo collegamento per programmare il microcontrollore Atmega16 AVR utilizzando USBASP e Atmel Studio 7.0. Basta creare lo schizzo e caricarlo utilizzando una toolchain esterna.
Di seguito viene fornito il codice completo con il video dimostrativo. Ulteriori informazioni sui servomotori conoscendo la loro importanza nella robotica.