Source: http://microcontroladores-mrelberni.com/pwm-avr-control-velocidad-motor-12vcc/
Timestamp: 2017-09-24 15:43:00+00:00

Document:
PWM AVR control velocidad motor 12VCC - MICROCONTROLADORES
Inicio » PWM AVR control velocidad motor 12VCC
Compartir: 10 0 1 0
PWM AVR control velocidad motor 12VCC, se generará una señal PWM AVR para el control de la velocidad de un pequeño motor de 12VCC de corriente continua, las frecuencias adecuadas para el uso de señales PWM en motores de continua se recomienda que sean mayores a los 4Khz, esto se hace con el fin de que no se produzcan ruidos molestos cuando el motor entre en funcionamiento, en realidad la frecuencia a elegir dependerá del uso que se le quiera dar al motor y el ver como responde a las pruebas para diversas frecuencias que se le de a la señal PWM, esto hay que hacerlo con cuidado porque puede ocurrir que algunos motores lleguen a dañarse, por lo que es muy importante revisar la hoja de datos del motor a utilizar por si tiene algún rango de frecuencias recomendado por el fabricante.
En la imagen se tiene el motor de 12VCC del cual se controlará su velocidad mediante PWM AVR control velocidad motor 12VCC, se hará la programación para que la señal PWM generada con el microcontrolador AVR ATmega88 sea de unos 15Khz aproximadamente, el rango audible está entre los 20Hz y los 20Khz, además muchos motores vienen preparados para que filtren el ruido que puede provocar el motor.
Para generar la señal PWM AVR control velocidad motor se utilizará el PWM modo rápido timer1 AVR con una resolución de 9 bits, el ancho de pulso de la señal PWM AVR control velocidad motor será variable, la señal PWM se obtendrá por el pin OC1B del ATmega88 en forma no invertida, se utilizarán dos pulsadores para controlar la velocidad del motor mediante el control del ancho de pulso de la señal PWM modo rápido, un pulsador estará conectado al pin PB0 y será para aumentar la velocidad mediante el aumento del ancho de pulso, el otro pulsador estará conectado en el pin PD7 y será para disminuir la velocidad mediante la disminución el ancho de pulso. El ATmega88 estará trabajando a una frecuencia de 8Mhz.
El prescaler elegido para el registro TCNT1 será de 1, la frecuencia de la señal PWM modo rápido para el timer1 se obtiene de la siguiente relación:
Fpwm=FCPU/(prescaler*(máximo+1))
Como la resolución será de 9, entonces el valor máximo al que llegará el registro TCNT1 será de 511, entonces se tendrá
Fpwm=(8Mhz/(1*512)
de donde Fpwm=15,625KHz que es lo mismo que un periodo de Tpwm=64us, se iniciará el ancho de pulso a un 0% por lo que el registro OCR1B se cargará en un inicio con 0.
OCR1B=0;//Ancho de pulso inicial de 0
Mediante el pulsador conectado al pin PB0 cada vez que este sea pulsado se incrementarán los valores del registro OCR1B en 5 unidades, de esta manera se aumenta la velocidad del motor, se a elegido 5 para que se aprecien pronto los cambios en el ancho del pulso, puede ser cualquier otro incremento, por precaución se limitará que el valor del registro OCR1B no sea mayor a 511, del pin PB0 se aprovechara su resistencia pull up interna.
Mediante el pulsador conectado al pin PD7 cada vez que este sea pulsado se decrementarán los valores del registro OCR1B en 5 unidades, de esta manera se disminuye la velocidad del motor, se a elegido 5 para que se aprecien pronto los cambios en el ancho del pulso, puede ser cualquier otro decremento, por precaución se limitará que el valor del registro OCR1B no sea menor a 0, del pin PD7 se aprovechara su resistencia pull up interna.
Se controlará la velocidad del motor mediante incrementos o decrementos en el valor del registro OCR1B dentro del ciclo del programa.
Configuración del registro TCCR1A para el PWM AVR control velocidad motor 12VCC
Como se obtendrá la señal PWM timer1 AVR en forma no invertida por el pin OC1B su bit5 se pondrá a 1 y su bit4 se pondrá a 0, sus bit1 se pondrá a 1 y su bit0 se pondrá a 0 ya que se utilizará el modo PWM rápido con una resolución de 9 bits, sus demás bits se pondrán a 0 ya que no se usarán.
TCCR1A=0b00100010;//PWM por el pin OC1B, no invertido, PWM modo rápido de 9 bits
Configuración del registro TCCR1B para el ejemplo PWM AVR control velocidad motor 12VCC
Su bit4 se pondrá a 0 y su bit3 se pondrá a 1 para utilizar el modo PWM rápido con una resolución de 9 bits, y como se usará un prescaler de 1 la combinación de sus bits 2, 1 y 0 será 001, todos sus demás bits se pondrán a 0 ya que no se usarán.
TCCR1B=0b00001001;//PWM modo rápido resolución de 10 bits, prescaler de 1
El circuito utilizado es el siguiente, se utiliza el transistor BJT 2N2222A ya que el motor necesita una corriente de 80mA, el 2N2222A está trabajando en corte y saturación para controlar la velocidad del motor de 12VCC, mediante la señal PWM que llega a la base del transistor por medio de la resistencia de 1K que limita la corriente que se absorbe del pin OC1A. El diodo es para proteger el circuito durante el corte, ya que evita que el cambio en la corriente a través del motor sea instantaneo. En el osciloscopio se puede ver la señal PWM generada en el pin OC1B.
El código para el PWM AVR control velocidad motor 12VCC, hecho en el ATMEL STUDIO es el siguiente:
/////////////////////////////////////////// ///////*****************************/////// ///***microcontroladores-mrelberni.com***// ///////*****************************/////// //*PWM AVR control velocidad motor 12VCC*// ///////*****************************/////// #define F_CPU 8000000ul //frecuencia de trabajo del ATmega88 8Mhz #include <avr/io.h> #include <util/delay.h> int main(void) { int16_t ancho_de_pulso=0;//variable entera sin signo de 16 bits para //controlar el ancho de pulso de PWM por medio //del cual se controlará la velocidad del motor DDRB&=~(1<<0);//pin PB0 como entrada para aumentar la velocidad del motor PORTB|=(1<<0);//Se usará la resistencia interna pull up del pin PB0 DDRD&=~(1<<7);//pin PD7 como entrada para disminuir la velocidad del motor PORTD|=(1<<7);//Se usará la resistencia interna pull up del pin PD7 DDRB|=(1<<2);//pin OC1B como salida, obligatorio para PWM TCCR1A=0b00100010;//PWM por el pin OC1B, no invertido, PWM modo rápido de 9 bits TCCR1B=0b00001001;//PWM modo rápido resolución de 9 bits, prescaler de 1 //Fpwm=15,625KHz por lo que Tpwm=64us while(1)//ciclo de programa { OCR1B=ancho_de_pulso;//velocidad del motor aumenta al presionar en PB0 //y disminuye al presionar en PD7, el ancho //de pulso está limitado entre 0 y 511 ya que la //resolución es de 9 bits if(!(PINB&(1<<PB0))){//si se pulsa en PB0 _delay_ms(100);//antirrebote ancho_de_pulso=ancho_de_pulso+5;//incrementa el registro OCR1B //en 5 unidades y como consecuencia //aumenta la velocidad if(ancho_de_pulso>511){//para limitar el ancho de pulso, si se hace ancho_de_pulso=511;//mayor a 511 se lo limita a 511 } } if(!(PIND&(1<<PD7))){//si se pulsa en PD7 _delay_ms(100);//antirrebote ancho_de_pulso=ancho_de_pulso-5;//decrementa el registro OCR1B //en 5 unidades y como consecuencia //disminuye la velocidad if(ancho_de_pulso<0){//para limitar el ancho de pulso, si se hace ancho_de_pulso=0;//menor a 0 se lo limita a 0 } } } }
///////*****************************///////
///***microcontroladores-mrelberni.com***//
//*PWM AVR control velocidad motor 12VCC*//
#define F_CPU 8000000ul //frecuencia de trabajo del ATmega88 8Mhz
int16_t ancho_de_pulso=0;//variable entera sin signo de 16 bits para
//controlar el ancho de pulso de PWM por medio
//del cual se controlará la velocidad del motor
DDRB&=~(1<<0);//pin PB0 como entrada para aumentar la velocidad del motor
PORTB|=(1<<0);//Se usará la resistencia interna pull up del pin PB0
DDRD&=~(1<<7);//pin PD7 como entrada para disminuir la velocidad del motor
PORTD|=(1<<7);//Se usará la resistencia interna pull up del pin PD7
DDRB|=(1<<2);//pin OC1B como salida, obligatorio para PWM
TCCR1B=0b00001001;//PWM modo rápido resolución de 9 bits, prescaler de 1
//Fpwm=15,625KHz por lo que Tpwm=64us
while(1)//ciclo de programa
OCR1B=ancho_de_pulso;//velocidad del motor aumenta al presionar en PB0
//y disminuye al presionar en PD7, el ancho
//de pulso está limitado entre 0 y 511 ya que la
//resolución es de 9 bits
if(!(PINB&(1<<PB0))){//si se pulsa en PB0
_delay_ms(100);//antirrebote
ancho_de_pulso=ancho_de_pulso+5;//incrementa el registro OCR1B
//en 5 unidades y como consecuencia
//aumenta la velocidad
if(ancho_de_pulso>511){//para limitar el ancho de pulso, si se hace
ancho_de_pulso=511;//mayor a 511 se lo limita a 511
if(!(PIND&(1<<PD7))){//si se pulsa en PD7
ancho_de_pulso=ancho_de_pulso-5;//decrementa el registro OCR1B
//disminuye la velocidad
if(ancho_de_pulso<0){//para limitar el ancho de pulso, si se hace
ancho_de_pulso=0;//menor a 0 se lo limita a 0
A continuación se tienen algunas imágenes de las medidas hechas en el osciloscopio para dos anchos de pulsos que se obtienen en el pin OC1B para la señal PWM, lo que se manifiesta en el motor como diferentes velocidades las cuales se controlan por los pulsadores.
En esta primera imagen de lo que se mide en el pin OC1B la señal PWM, el ciclo de trabajo es de 8,98%, lo que se manifiesta como una baja velocidad para el motor, se observa que la frecuencia es de 15,9Khz y el periodo es de 63us.
En esta segunda imagen en la que se mide en el pin OC1B la señal PWM, el ciclo de trabajo es de 78,3%, lo que se manifiesta como una mayor velocidad para el motor, se observa que la frecuencia es de 15,9Khz y el periodo es de 63us.
En la tercera imagen se ha medido con el osciloscopio entre el colector y el emisor del transistor, cuando la señal está a 0 el transistor conduce y el motor gira, cuando esta a 1(12V) el transistor está apagado y no conduce, las pendientes que se ven son debidas a los tiempos de conmutación del transistor, el pasar de bajo a alto le toma mas tiempo que el pasar de alto a bajo.
La siguiente es una imagen del circuito experimental implementadodo en los protoboard.
Si he logrado ayudarte, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.
Atte: MrElberni.

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución