- Componentes requeridos
- Descripción de los pines del servomotor
- Diagrama de circuito
- Control del servomotor con AVR ATmega16
- Programando Atmega16 usando USBasp
Los servomotores se utilizan ampliamente cuando se requiere un control preciso, como robots, maquinarias automatizadas, brazo robótico, etc. Sin embargo, el alcance del servomotor no se limita a esto y se puede utilizar en muchas aplicaciones. Para saber más sobre los conceptos básicos, la teoría y el principio de funcionamiento del servomotor, siga el enlace.
Anteriormente interconectamos el servomotor con muchos microcontroladores:
- Interfaz de servomotor con ARM7-LPC2148
- Interfaz de servomotor con MSP430G2
- Interfaz de servomotor con STM32F103C8
- Interfaz de servomotor con microcontrolador PIC usando MPLAB y XC8
- Interfaz de servomotor con Arduino Uno
- Interfaz de servomotor con microcontrolador 8051
En este tutorial, conectaremos el Micro Servo Motor con el Microcontrolador Atmega16 AVR usando Atmel Studio 7.0. El servomotor está clasificado para funcionar en 4.8-6V. Podemos controlar su ángulo de rotación y dirección aplicando tren de pulsos o señales PWM. Tenga en cuenta que los servomotores no se pueden mover para una rotación completa de 360 grados, por lo que se utilizan donde no se requiere una rotación continua. El ángulo de rotación es 0 -180 grados o (-90) - (+90) grados.
Componentes requeridos
- Micro servomotor SG90 Tower Pro
- Microcontrolador Atmega16 IC
- Oscilador de cristal de 16Mhz
- Dos condensadores de 100nF
- Dos condensadores de 22pF
- Presionar el botón
- Cables de puente
- Tablero de circuitos
- USBASP v2.0
- Led (cualquier color)
Descripción de los pines del servomotor
- Rojo = Fuente de alimentación positiva (4.8V a 6V)
- Marrón = Tierra
- Naranja = señal de control (pin PWM)
Diagrama de circuito
Conecte todos los componentes como se muestra en el diagrama a continuación para rotar el servomotor usando el microcontrolador AVR. Hay cuatro pines PWM, podemos usar cualquier pin PWM de Atmega16. En este tutorial usamos Pin PD5 (OC1A) para generar PWM. PD5 está conectado directamente al cable naranja del servomotor que es el pin de señal de entrada. Conecte cualquier LED de color para el indicador de encendido. Además, conecte un botón en el pin de reinicio para reiniciar Atmega16 cuando sea necesario. Conecte Atmega16 con el circuito oscilador de cristal adecuado. Todo el sistema estará alimentado por un suministro de 5V.
La configuración completa se verá a continuación:
Control del servomotor con AVR ATmega16
Al igual que el motor paso a paso, el servomotor no necesita ningún controlador externo, por ejemplo, controlador de motor ULN2003 o L293D. Solo PWM es suficiente para impulsar el servomotor y es muy fácil generar PWM desde un microcontrolador. El par de este servomotor es de 2,5 kg / cm, por lo que si necesita un par mayor, este servo no es adecuado.
Como sabemos, el servomotor busca un pulso cada 20ms y la longitud del pulso positivo determinará el ángulo de rotación del servomotor.
La frecuencia requerida para obtener el pulso de 20 ms es 50 Hz (f = 1 / T). Entonces, para este servomotor, la especificación dice que para 0 grados necesitamos 0.388ms, para 90 grados necesitamos 1.264ms y para 180 grados necesitamos un pulso de 2.14ms.
Para generar pulsos específicos usaremos Timer1 de Atmega16. La frecuencia de la CPU es de 16Mz, pero solo utilizaremos 1Mhz ya que no tenemos muchos periféricos conectados al microcontrolador y no hay mucha carga en el microcontrolador, por lo que 1Mhz hará el trabajo. El Prescaler está configurado en 1. Por lo tanto, el reloj se divide en 1Mhz / 1 = 1Mhz (1uS), lo cual es genial. El temporizador 1 se utilizará como modo PWM rápido, es decir, el modo 14. Puede utilizar diferentes modos de temporizadores para generar el tren de pulsos deseado. La referencia se proporciona a continuación y puede encontrar más descripción en la hoja de datos oficial de Atmega16.
Para usar Timer1 como modo PWM rápido, necesitaremos el valor TOP de ICR1 (Input Capture Register1). Para encontrar el valor TOP, use la fórmula que se indica a continuación:
f pwm = f cpu / nx (1 + ARRIBA)
Esto se puede simplificar a, ARRIBA = ( f cpu / ( f pwm xn)) - 1
Donde, N = Valor del conjunto de preescalador
f cpu = frecuencia de la CPU
f pwm = ancho de pulso del servomotor que es 50Hz
Ahora calcule el valor ICR1 ya que tenemos todos los valores requeridos, N = 1, f CPU = 1MHz, f pwm = 50Hz
Simplemente coloque los valores en la fórmula anterior y obtendremos
ICR1 = 1999
Esto significa que para alcanzar el grado máximo, es decir, 180 0, el ICR1 debería ser 1999.
Para cristal de 16MHz y Prescaler establecido en 16, tendremos
ICR1 = 4999
Ahora pasemos a discutir el boceto.
Programando Atmega16 usando USBasp
A continuación se proporciona el código AVR completo para controlar el servomotor. El código es simple y se puede entender fácilmente.
Aquí hemos codificado el Atmega16 para rotar el servomotor de 0 0 a 180 0 y volver de 180 0 a 0 0. Esta transición se completará en 9 pasos, es decir, 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Para el retraso, utilizaremos la biblioteca interna de Atmel Studio, es decir.
Conecte su USBASP v2.0 y siga las instrucciones en este enlace para programar el microcontrolador Atmega16 AVR usando USBASP y Atmel Studio 7.0. Simplemente cree el boceto y cárguelo usando una cadena de herramientas externa.
El código completo con el video de demostración se proporciona a continuación. También aprenda más sobre los servomotores conociendo su importancia en robótica.