- Components necessaris
- Pin Descripció del servomotor
- Esquema de connexions
- Control de servomotor amb AVR ATmega16
- Programació d'Atmega16 mitjançant USBasp
Els servomotors s’utilitzen àmpliament quan es requereix un control precís, com ara robots, maquinàries automatitzades, braços robòtics, etc. No obstant això, l’abast del servomotor no es limita a això i es pot utilitzar en moltes aplicacions. Per obtenir més informació sobre els conceptes bàsics, la teoria i el principi de funcionament del servomotor, seguiu aquest enllaç.
Anteriorment, hem interfaciat el Servo Motor amb molts microcontroladors:
- Servomotor d’interfície amb ARM7-LPC2148
- Servomotor d’interfície amb MSP430G2
- Servomotor d’interfície amb STM32F103C8
- Servomotor d’interfície amb microcontrolador PIC mitjançant MPLAB i XC8
- Servomotor d’interfície amb Arduino Uno
- Interfície de servomotor amb microcontrolador 8051
En aquest tutorial, farem una interfície del servomotor micro amb el microcontrolador AVR Atmega16 mitjançant Atmel Studio 7.0. Es calcula que el servomotor funciona en 4,8-6V. Podem controlar el seu angle de rotació i direcció aplicant senyals de tren de polsos o PWM. Tingueu en compte que els servomotors no es poden moure per a una rotació completa de 360 graus, de manera que s’utilitzen allà on no és necessària una rotació contínua. L'angle de rotació és de 0 -180 graus o (-90) - (+90) graus.
Components necessaris
- Servomotor SG90 Tower Pro
- CI de microcontrolador Atmega16
- Oscil·lador de vidre de 16 MHz
- Dos condensadors 100nF
- Dos condensadors de 22pF
- Polsador
- Jumper Wires
- Taula de pa
- USBASP v2.0
- Led (qualsevol color)
Pin Descripció del servomotor

- Vermell = font d'alimentació positiva (4,8V a 6V)
- Marró = Terra
- Taronja = senyal de control (pin PWM)
Esquema de connexions
Connecteu tots els components tal com es mostra al diagrama següent per girar el servomotor mitjançant el microcontrolador AVR. Hi ha quatre pins PWM, podem utilitzar qualsevol pin PWM d'Atmega16. En aquest tutorial utilitzem el pin PD5 (OC1A) per generar PWM. El PD5 està connectat directament al fil taronja del servomotor que és el pin de senyal d’entrada. Connecteu qualsevol led de color per a l'indicador d'alimentació. A més, connecteu un polsador al pin Restableix per restablir Atmega16 sempre que sigui necessari. Connecteu Atmega16 amb un circuit d’oscil·lador de cristall adequat. Tot el sistema s’alimentarà amb un subministrament de 5 V.


La configuració completa serà la següent:

Control de servomotor amb AVR ATmega16
Igual que el motor pas a pas, el servomotor no necessita cap controlador extern, per exemple, el controlador de motor ULN2003 o L293D. Només amb PWM n'hi ha prou per accionar el servomotor i és molt fàcil generar PWM a partir d'un microcontrolador. El parell d’aquest servomotor és de 2,5 kg / cm, de manera que si necessiteu un parell més gran, aquest servo no és adequat.
Com sabem, el servo motor busca un impuls cada 20 ms i la longitud del pols positiu determinarà l’angle de rotació del servo motor.

La freqüència necessària per obtenir el pols de 20 ms és de 50 Hz (f = 1 / T). Per tant, per a aquest servomotor, l’especificació diu que per a 0 graus necessitem 0.388 ms, per a 90 graus necessitem 1.264 ms i per a 180 graus necessitem 2.14 ms de pols.
Per generar polsos especificats utilitzarem Timer1 d’Atmega16. La freqüència de la CPU és de 16Mz, però només utilitzarem 1Mhz, ja que no tenim molts perifèrics connectats al microcontrolador i no hi ha molta càrrega al microcontrolador, de manera que 1Mhz farà la feina. El Prescaler està configurat a 1. Per tant, el rellotge es divideix en 1Mhz / 1 = 1Mhz (1uS), que és fantàstic. El temporitzador 1 s'utilitzarà com a mode PWM ràpid, és a dir, el mode 14. Podeu utilitzar diferents modes de temporitzadors per generar el tren de pols desitjat. La referència es dóna a continuació i podeu trobar més descripció al full de dades oficial d'Atmega16.

Per utilitzar Timer1 com a mode PWM ràpid necessitarem el valor TOP d’ICR1 (Registre de captura d’entrada1). Per trobar el valor TOP, utilitzeu la fórmula que es mostra a continuació:
f pwm = f cpu / nx (1 + TOP)
Això es pot simplificar a, TOP = ( f cpu / ( f pwm xn)) - 1
On, N = Valor del conjunt de precalculadors
f cpu = CPU Frequencyy
f pwm = Amplada del pols del motor servo que és 50Hz
Ara calculeu el valor ICR1 ja que tenim tot el valor necessari, N = 1, f cpu = 1 MHz, f pwm = 50 Hz
Simplement poseu els valors a la fórmula anterior i aconseguirem
ICR1 = 1999
Això significa assolir el grau màxim, és a dir, 180 0, l'ICR1 hauria de ser el 1999.
Per a cristalls de 16 MHz i Prescaler establerts a 16, ho tindrem
ICR1 = 4999
Ara anem a parlar sobre l'esbós.
Programació d'Atmega16 mitjançant USBasp
A continuació es mostra el codi AVR complet per controlar el servomotor. El codi és senzill i es pot entendre fàcilment.
Aquí hem codificat l'Atmega16 per girar el servomotor de 0 0 a 180 0 i tornar de nou de 180 0 a 0 0. Aquesta transició es completarà en 9 passos, és a dir, 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Per retard, utilitzarem la biblioteca interna d'Atmel Studio ie
Connecteu el vostre USBASP v2.0 i seguiu les instruccions d’aquest enllaç per programar el microcontrolador AVR Atmega16 mitjançant USBASP i Atmel Studio 7.0. Simplement creeu l’esbós i pengeu-lo mitjançant una cadena d’eines externa.
A continuació es mostra el codi complet amb el vídeo de demostració. Apreneu també més sobre servomotors coneixent la seva importància en robòtica.
