Control PWM Atmega8 (frecuencia, polaridad, ciclo de trabajo) tutorial con el programa de ejemplo Publicado el 03 de diciembre 2010 Si vas allí de búsqueda en Internet supone que ya sabe lo que es PWM y dónde se puede utilizar, por lo que en este artículo s ólo voy a explicar cómo utilizar 8 bits de temporizador Atmega8 para generar la señal PWM y control de frecuencia, la polaridad y el deber ciclo. PWM se puede generar a partir de 16-bit Timer/Counter1 u 8 bits Timer/Counter2 pero esta vez sólo voy a explicar de 8 bits Timer/Counter2 PWM de modo rápido.
En este cuadro se explica en la documentación Atmega8 modo PWM rápido. Contador (8 bits) cuenta desde 0 × 00 a 0xFF y reinicia desde 0 × 00. En el modo de no invertir OC2 se borra cuando el valor del contador en partido OCR2 registro y se fijó en 0 × 00. En OC2 modo de inversión se establece c uando el valor del contador en partido OCR2 registro y borra a 0 × 00. De todo esto resulta que el ciclo de trabajo PWM depende OCR2 registro. En el ciclo de trabajo de modo que no inversora = OCR2/256 * 100% y es 50% si OCR2 es 0 × 80 (medio entre 0 × 00 - 0xFF). En cada ficha periodo PWM debe contar 256 pasos, por lo que la frecuencia de la señal es 256 veces inferior al contador de reloj de prescaler. Frecuencia PWM = ATmega frecuencia de reloj reloj / temporizador prescaler (1,8,32,64,128,256) (1,8,32,64,128,256) / 256. 256. Con 4 máximo cristal MHz (sin prescaler) Frecuencia PWM es el 15 de 625Hz. Registro de configuración Por ejemplo 15 625 Hz, ciclo de trabajo 50%, el modo de no inversión generación de la señal PWM. 1. OCR2 = 0 × 80 (128) Como se ha mencionado antes el c iclo de trabajo = OCR2/256 * 100% 2. TCCR2 = 0 × 69;
3. DDRB = 0 × 08: la señal PWM se emite por nivel de PORTB pin 3 alternar.
DDRB establece como salida. Todos juntos:
#include
int main( void ) { DDRB=0x08; OCR2=0x80; TCCR2=0x69; while (1) {}; } Resultado:
~ Ciclo de trabajo del 10%, 61 Hz.
#include int main( void ) { DDRB=0x08; OCR2=0x1A; // 256/10=25,6 26 in hex = 1A; TCCR2=0x6E; // 256 prescaler
while (1) {}; } Resultado:
Y no hay programa de demostración y *. Hex de PWM Demo visto en video.
TEORÍA DE FUNCIONAMIENTO:
Figura 1: ATmega168/328 pines PWM
Cuando usted toma una onda cuadrada, está en un momento y por un tiempo. Si dividimos el sobre por el descuento y lo multiplicamos por 100% obtendremos lo que se llama un ciclo de trabajo. Duty_Cycle = [ on_time / (on_time + OFF_time)] * 100 Así que si estamos de 1 ms y se apaga durante 1 ms que va a terminar con un ciclo de trabajo del 50%, si estamos en de 1 ms y apagado durante 3 ms nos encontramos con un ciclo de tr abajo del 25%. Output_Voltage = Duty_Cycle * Input_Voltage Ahora bien, si nos tomamos nuestro ciclo de trabajo y multiplicamos por nuestra tensión obtendremos la tensión de salida. Así que si tenemos una fuente de alimentación de 5V y activamos un PWM con un ciclo de trabajo del 25% haremos un dispositivo analógico comportarse como si estuviera recibiendo una señal de 1.25V. Enfriar eh? Al igual que las funciones de contador PWM puede ser simulado en software sin embargo, se prefiere la versión de hardware, ya que sólo una especie de hace lo suyo y, con muy poco código se puede obtener una onda cuadrada constante ir. Recuerda el Precontador? bien la espalda en el PWM. Y al igual que en el contador, su rol consiste en retrasar las cosas. Esto es bueno porque nos permite ejecutar el PWM a diferentes fre cuencias. Esto es importante debido a que algunos dispositivos son sensibles a la velocidad de PWM. Un motor, por ejemplo, se calentará si la forma de onda PWM es muy rápido, y la voluntad jitter si el PWM es demasiado lento. Puesto que ya planté la pregunta en su cabeza, la respuesta se inicia en 10 kHz. Diferentes motores como diferentes frecuencias de 10 kHz, pero se conseguirá en el parque de pelota. El ATmega168/328 tiene 6 (!) Salidas PWM, 2 se encuentran en cada temporizador / contador. Como siempre, el pin de salida tiene las mismas limitaciones que cualquier salida (ver el capítulo de salida digital para más detalles).
Temporizador PWM del AVR es capaz de funcionar en 3 modos diferentes: Fast PWM, Fase Corregido PWM y Fase y Fase Frecuencia Corregido PWM.
El modo PWM rápido:
Fast PWM funciona de la misma manera que el contador normal. La lógica de control recibe la señal e incrementa el registro TCNTn. Cuando se detecta una coincidencia la bandera OCFnx se establece y la señal es enviar al generador de forma de onda. El generador de forma de onda a continuación, cambia el estado de la clavija de OCnx (el estado se determina por el modo seleccionado). Cuando el registro TCNTn pasa el valor de TOP (0xFF o OCRnA) sino que simplemente se desborda (o excesos) a 0, al mismo tiempo, se establece el indicador OCFnx. La bandera OCFnx puede ser configurado para desencadenar una interrupción. La bandera OCFnx puede borrar software, pero como siempre se borra automáticamente cuando se activa una solicitud de interrupción. Debido a la alta frecuencia de este modo se utiliza mejor para la regulación de DAC, los LED de desvanecimiento, rectificación y Poder. La frecuencia de la PWM rápido se puede calcular mediante la siguiente ecuación. PWM_fequency = clock_speed / [Prescaller_value * (1 + TOP_Value)]
Fase Corregido el modo PWM:
La fase corregida modo es un poco extraño, cuenta hasta que llegue al valor de TOP (FIJA, OCRnA o ICRN), entonces comienza la cuenta atrás hasta que llega a la parte inferior (0). La lógica de control recibe la señal y aumenta el registro TCNTn . Cuando se detecta una coincidencia la bandera OCFnx se establece y la señal es enviar al ge nerador de forma de onda. El generador de forma de onda a continuación, cambia el estado de la clavija de OCnx (el estado se determina por el modo seleccionado). Cuando el registro TCNTn golpea el valor TOP (FIJA, OCRnA o ICRN) se establece el indicador OCFnx. La bandera OCFnx puede ser configurado para desencadenar una interrupción. La bandera OCF1x puede borrar software, pero como siempre se borra automáticamente cuando se activa una solicitud de interrupción. Este modo puede ser invertida o no invertida. En el modo no inversora, el pasador OCn es BAJO (GND) en la Comparar coincidencia entre TCNTn y OCRnx mientras que hasta el conteo, y HIGH (VCC) en el partido de comparación, mientras que hacia abajo-contando . En el modo de inversión, el pasador OCn es HIGH (VCC) en el partido de comparación entre TCNTn y OCRnx mientras que hasta el conteo, y LOW (GND) en el partido de comparación, mientras que abajo contando. Este modo se recomienda para el control del motor. La frecuencia de la fase de Corregido PWM s e puede calcular mediante la siguiente ecuación. PWM_frequency = clock_speed / (2 * Prescaller_value * TOP_value) Fase y frecuencia corregida modo PWM:
Fase corregida y Fase y Frecuencia Corregido modos PWM funcionan de la misma manera si no estamos pensando en cambiar nuestro valor TOP vez que se inicia e l modo PWM. La única diferencia que pude v er en la hoja de datos es que la fase y frecuencia corregida actualizaciones modo su valor superior cuando se toca fondo, mientras que la Fase Corregido actualizaciones modo su valor superior cuando se golpea la parte superior. Si alguien sabe algo más (o si me equivoco) sobre estos 2 modos, por favor hágamelo saber. Este modo se recomienda para el control del motor. La frecuencia de la fase y corregidos en frecuencia PWM se puede calcular mediante la siguiente ecuación. PWM_frequency = clock_speed / (2 * Prescaller_value * TOP_value)
TIMER0 (8 BITS PWM):
Figura 2: ATmega328 Timer0 (8 bits)
Timer/Contador0 tiene 2 salidas, OC0A y OC0B. Dado que ambas salidas de salirse de la misma temporizador y generadores de forma de onda tanto OC0A y OC0B están sincronizados, esto hace que el reloj perfecto para hacer robots tanque (me encantan los robots de tanque). Timer/Contador0 no tiene un Devision 32 o 128 en su pre-escalador. Debido a esto , es un poco limitado a las frecuencias que se podría producir. Si usted necesita una frecuencia específica en el uso Timer/Counter2 PWM que tiene todos sus valores prescaler. Timer/Contador0 es capaz de ejecutar en 4 modos de la PWM rápido con un TOP máx (0xFF), un modo PWM rápido con una variable de TOP (OCR0A), una fase corregida modo PWM con un TOP máx (0xFF) y una fase Corregido PWM modo con un TOP variables (OCR0A). Cada uno de estos modos puede ser invertida o no invertida. 7 bits TCCR0A
6 bits
COM0A1 COM0A0
5 bits
4 bits
3 bits
2 bits
1 bit
COM0B1
COM0B0
-
-
WGM01
0 bit
WGM00
Timer / Control Contadores de registro 0 A COM0A1
COM0A0
DESCRIPCIÓN
0
0
OC0A desactivado
0
1
WGM02 = 0: Funcionamiento normal Puerto, OC0A Disconnected WGM02 = 1: OC0A Toggle en comparación Partido
1
0
Modo Ninguno invertida (HIGH en el fondo, LOW Match)
1
1
Modo invertido (LOW, en el fondo en lo alto de partido)
Sólo se aplica a los modos PWM COM0B1
COM0B0
DESCRIPCIÓN
0
0
OC0B desactivado
0
1
Reservado
1
0
Modo Ninguno invertida (HIGH en el fondo, LOW Match)
1
1
Modo invertido (LOW, en el fondo en lo alto de partido)
Sólo se aplica a los modos PWM
TCCR0B
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
FOC0A
FOC0B
-
-
WGM02
CS02
CS01
Timer / Control Contadores de registro 0 A CS02
CS01
CS00
DESCRIPCIÓN
0
0
0
Disabled Timer/Counter2
0
0
1
No preescala
0
1
0
Reloj / 8
0 bit
CS00
0
1
1
Reloj / 64
1
0
0
Reloj / 256
1
0
1
Reloj / 1024
CS trozos MODO WGM02 WGM01 WGM00
TOP
DESCRIPCIÓN
0
0
0
0
Normal
1
0
0
1
0xFF
PWM de fase corregida
2
0
1
0
OCRA
CTC
3
0
1
1
0xFF
Fast PWM
4
1
0
0
-
Reservado
5
1
0
1
OCR0A
PWM de fase corregida
6
1
1
0
-
Reservado
7
1
1
1
OCR0A
Fast PWM
Forma de onda del generador bits de modo
TIMSK0
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
-
-
-
-
-
OCIE0B
OIE0A
TOIE0
Timer / Contador registro de máscara de interrupción
TIFR0
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
-
-
-
-
-
OCF0B
OCF0A
TOV0
3 bits
2 bits
1 bit
0 bit
1 bit
0 bit
Timer / Contador Flag Registro de interrupción 7 bits
6 bits
5 bits
4 bits
TCNT0
Timer / Contador Register (almacena el valor del contador) 7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
OCR0A
Output Compare Registro A (almacena el valor de co mparación)
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
OCR0B
Output Compare Register B (almacena el valor de comparación) ATmega168/328 Código: / / Este código establece counter0 para un rápido 8 kHz PWM wave @ reloj 16Mhz # include int main (void) { DDRD | = (1 << DDD6); / / PD6 es ahora una salida OCR0A = 128; / / Establecer PWM para el ciclo de trabajo del 50% TCCR0A | = (1 << COM0A1); Modo / / set ninguno inversora TCCR0A | = (1 << WGM01) | (1 << WGM00); / / Establecer el modo PWM rápido TCCR0B | = (1 << CS01); / / set prescaler de 8 y empieza PWM while (1) { / / tenemos un rápido trabajo PWM } }
TIMER1 (16BIT PWM):
Figura 3: ATmega328 Timer1 (16 bits)
Timer/Counter1 tiene 2 salidas, OC1A y OC1B. Dado que ambas salidas de salirse de la misma temporizador y generadores de forma de onda tanto OC1A y OC1B están sincronizados, esto hace que el reloj perfecto para hacer robots tanque (me encantan los robots de tanque). Timer/Contador1 es capaz de funcionar en 3 modos el modo PWM rápida, la Fase Corregido modo PWM y, de fase y de frecuencia modo corregido. Cada uno de estos modos puede ser invertida o no invertida. Al igual que Timer/Contador0 Timer/Counter1 tiene varias opciones para controlar el valor TOP del PWM a diferencia Timer/Contador0 sin embargo, el valor TOP puede ser fijo, almacenado en el registro o en el registro OCR1A ICR1 (ver tabla abajo).
TCCR1A
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
COM1A1
COM1A0
COM1B1
COM1B0
-
-
WGM11
0 bit
WGM10
Timer / Control Contadores de registro 1 A COM1A1 COM1A0 COM1B1 COM1B0 DESCRIPCIÓN
0
0
Operación portuaria Normal, OC1A/OC1B desconectado.
0
1
Modo 9,11,14,15 only: Habilitar sólo OCR1A (OC1B desconectado)
1
0
Modo Ninguno invertida (HIGH en el fondo, LOW Match)
1
1
Modo invertido (LOW, en el fondo en lo alto de partido)
Sólo se aplica a los modos PWM
TCCR1B
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
ICNC1
ICES1
-
WGM13
WGM12
CS12
CS11
0 bit
CS10
Timer / Contador Registro de Control 1 B CS12
CS11
CS10
0
0
0
Disabled Timer/Counter2
0
0
1
No preescala
0
1
0
Reloj / 8
0
1
1
Reloj / 64
1
0
0
Reloj / 256
1
0
1
Reloj / 1024
1
1
0
Fuente de reloj externa en T1 pin, reloj de Flanco descendente
1
1
1
Fuente de reloj externa en T1 pin, reloj en el flanco ascendente
CS trozos
DESCRIPCIÓN
MODO WGM13
WGM12
WGM11 WGM10
DESCRIPCIÓN
TOP
0
0
0
0
0
Normal
0xFFFF
1
0
0
0
1
PWM, Fase corregida, 8 bits
0x00FF
2
0
0
1
0
PWM, Fase corregida, 9bit
0x01FF
3
0
0
1
1
PWM, Fase Corregido, 10 bits
0x03FF
5
0
1
0
1
Fast PWM, 8 bits
0x00FF
6
0
1
1
0
Fast PWM, 9bit
0x01FF
7
0
1
1
1
Fast PWM, 10 bits
0x03FF
8
1
0
0
0
PWM, fase y frecuencia corregida
ICR1
9
1
0
0
1
PWM, fase y frecuencia corregida
OCR1A
10
1
0
1
0
PWM, fase correcta
ICR1
11
1
0
1
1
PWM, fase correcta
OCR1A
14
1
1
1
0
Fast PWM
ICR1
15
1
1
1
1
Fast PWM
OCR1A
Forma de onda del generador bits d e modo (abreviado)
TCCR1C
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
FOC1A
FOC1B
-
-
-
-
-
0 bit
Timer / Control Contadores de registro C
TIMSK1
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
-
-
ICIE1
-
-
OCIE1B
OCIE1A
TOIE1
Timer / Contador registro de máscara de interrupción
TIFR
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
OCF2
TOV2
ICF1
OCF1A
OCF1B
TOV1
-
TOV0
3 bits
2 bits
1 bit
0 bit
Timer / Contador Flag Registro de interrupción 7 bits
6 bits
5 bits
4 bits
TCNT1H TCNT1L
Timer / Contador Register (almacena el valor del contador de 16 bits)
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
OCR1AH OCR1AL
Output Compare Registro A (almacena el valor de comparación, 16 bits) 7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
OCR1BH OCR1BL
Output Compare Register B (almacena el valor de comparación, 16 bits) ATmega168/328 Código: / / Este código establece counter1 Una salida a 25% y la salida B al 75% . / / Usando ICR1 como superior (16 bits), Fast PWM
# include int main (void) { DDRB | = (1 << DDB1) | (1 << DDB2); / / PB1 y PB2 es ahora una salida OCR1 = 0xFFFF; / / Establecer TOP de 16 bits OCR1A = 0x3FFF; / / Establecer PWM para el ciclo de trabajo del 25% @ 16 bits OCR1B = 0xBFFF; / / Establecer PWM para el ciclo de trabajo del 75% @ 16 bits TCCR1A | = (1 << COM1A1) | (1 << COM1B1); Modo / / set ninguno inversora TCCR1A | = (1 << WGM11); TCCR1B | = (1 << WGM12) | (1 << WGM13); / / Configurar Fast PWM
modo mediante ICR1 como TOP
TCCR1B | = (1 << CS10); / / Iniciar el temporizador sin prescaler while (1) { / / tenemos un rápido trabajo PWM } }
TIMER2 (8 BITS PWM):
Figura 2: ATmega328 Timer2 (8 bits) Timer/Contador0 es muy bueno, ya que tiene 2 salidas, OC2A y OC2B. Dado que ambas salidas de salirse de la misma temporizador y generadores de forma de onda tanto OC2A y OC2B están sincronizados, esto hace que el reloj perfecto para hacer robots tanque (me encantan los robots de tanque). Como se indica en Timer/Contador0, Timer/Counter2 tiene todos sus valores prescaler, esto hace que sea capaz de producir mucho más frecuencias entonces su hermano de 8 bits. Timer/Contador0 es capaz de ejecutar en 4 modos de la PWM r ápido con un TOP máx (0xFF), un modo PWM rápido con una variable de TOP (OCR2A), una fase corregida modo PWM con un TOP máx (0xFF) y una fase Corregido PWM modo con un TOP variables (OCR2A). Cada uno de estos modos puede ser invertida o no invertida. 7 bits TCCR2A
6 bits
COM2A1 COM2A0
5 bits
4 bits
3 bits
2 bits
1 bit
COM2B1
COM2B0
-
-
WGM21
Timer / Control Register contador 2 A COM2A1
COM2A0
DESCRIPCIÓN
0
0
OC2A desactivado
0
1
WGM22 = 0: Funcionamiento normal Puerto, OC2A Disconnected WGM22 = 1: OC2A Toggle en comparación Partido
1
0
Modo Ninguno invertida (HIGH en el fondo, LOW Match)
1
1
Modo invertido (LOW, en el fondo en lo alto de partido)
Sólo se aplica a los modos PWM COM2B1
COM2B0
DESCRIPCIÓN
0
0
OC2B desactivado
0
1
Reservado
1
0
Modo Ninguno invertida (HIGH en el fondo, LOW Match)
1
1
Modo invertido (LOW, en el fondo en lo alto de partido)
0 bit
WGM20
Sólo se aplica a los modos PWM
TCCR2B
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
FOC2A
FOC2B
-
-
WGM22
CS22
CS21
0 bit
CS20
Timer / Control Register contador 2 A CS22
CS21
CS20
DESCRIPCIÓN
0
0
0
Disabled Timer/Counter2
0
0
1
No preescala
0
1
0
Reloj / 8
0
1
1
Reloj / 32
1
0
0
Reloj / 64
1
0
1
Reloj / 128
1
1
0
Reloj / 256
1
1
1
Reloj / 1024
CS trozos MODO WGM22 WGM21 WGM20
TOP
DESCRIPCIÓN
0
0
0
0
0xFF
Normal
1
0
0
1
0xFF
PWM de fase corregida
2
0
1
0
OCRA
CTC
3
0
1
1
0xFF
Fast PWM
4
1
0
0
-
Reservado
5
1
0
1
OCR0A
PWM de fase corregida
6
1
1
0
-
Reservado
7
1
1
1
OCR0A
Fast PWM
Forma de onda del generador bits de modo
TIMSK2
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
-
-
-
-
-
OCIE2B
OIE2A
TOIE2
Timer / Contador registro de máscara de interrupción
TIFR2
7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
-
-
-
-
-
OCF2B
OCF2A
TOV2
Timer / Contador Flag Registro de interrupción 7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
1 bit
0 bit
1 bit
0 bit
1 bit
0 bit
TCNT2
Timer / Contador Register (almacena el valor del contador) 7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
OCR2A
Output Compare Registro A (almacena el valor de comparación) 7 bits
6 bits
5 bits
4 bits
3 bits
2 bits
OCR2B
Output Compare Register B (almacena el valor de comparación) ATmega168/328 Código: / / Este código establece counter2 para un rápido 8 kHz PWM wave @ reloj 16Mhz # include int main (void) { DDRD | = (1 << DDD6); / / PD6 es ahora una salida OCR2A = 128; / / Establecer PWM para el ciclo de trabajo del 50% TCCR2A | = (1 << COM2A1); Modo / / set ninguno inversora TCCR2A | = (1 << WGM21) | (1 << WGM20); / / Establecer el modo PWM rápido TCCR2B | = (1 << CS21); / / set prescaler de 8 y empieza PWM while (1) { / / tenemos un rápido trabajo PWM } }