Introducción a PWM – PWM – Pulse Pulse Width Modulation. Un dispositivo digital como un microcontrolador puede trabajar fácilmente con las entradas y salidas que tiene sólo dos estados, activado y desactivado. Así que usted puede utilizar fácilmente para el control de un LED de estado es decir, on/off. De la misma manera que se puede utilizar para controlar cualquier eléctrica dispositivo de encendido / apagado mediante el uso de controladores adecuados (transistor, triac, relés, etc.) Pero a veces se necesita más que sólo "on" y control "off" en el dispositivo. dispositi vo. Al igual que si quieres controlar el brillo de un LED (o cualquier lámpara) o la velocidad del motor de corriente continua a continuación las señales digitales (on / off) simplemente no pueden hacerlo. Esta situación situac ión está muy inteligentemente inteligentemen te manejada por una técnica t écnica llamada PWM o modulación de ancho de pulso. PWM es la técnica utilizada para generar señales analógicas a partir de un dispositivo digital como una MCU. Casi todos los MCUs modernos han creado un hardware dedicado para la generación de la señal PWM. PWM: Modulación de Ancho de Pulso Un dispositivo digital, como un microcontrolador sólo puede generar dos niveles en sus líneas de salida, HIGH y LOW = 5v = 0V. Pero lo que si queremos generar 2.5v o 3.1v o cualquier tensión entre la salida de 0-5 voltios? Para este tipo de requisito, en lugar de generar una salida de tensión continua constante generamos una onda cuadrada, que tiene un alto = 5 V y baja = 0v (Ver figura 1).
La figura. 1 - Una forma de onda de PWM. En la figura se puede ver una señal PWM. Como se puede ver que es sólo una digital de señal (fácilmente (fácilm ente se pueden generar por MCUs). MCU s). Pero quiero aclarar algunas de sus propiedades. La señal permanece en "ON" durante algún tiempo y "OFF" para algún tiempo. Ton = Tiempo de la salida permanece alta. Toff = Tiempo de la salida permanece baja.
Cuando la salida es alta la tensión es de 5V ' Cuando el caudal es bajo la tensión de 0V T = Período de tiempo = Ton + Toff Ciclo de servicio. Se define por
Así se puede ver que es sólo el porcentaje porcentaje del tiempo total de la producción producción fue alta. En la figura anterior (Fig. 1) se puede ver que Ton = Toff = La mitad del tiempo período. Así el ciclo de trabajo tr abajo es del 50%. Si la frecuencia frecuenci a de dicha onda es suficientemente suficienteme nte alta (digamos 500 Hz), la salida que se obtiene es la mitad de 5v es decir 2,5 voltios. Así, si esta salida está conectada a un motor (por medio de los controladores adecuados) que se ejecutará en el 50% de su plena velocidad a 5v. La técnica de PWM utiliza este hecho para generar cualquier voltaje entre dos extremos (por ejemplo, entre 012 Voltios). El truco consiste en variar el ciclo de trabajo entre 0-100% y conseguir conseguir mismo porcentaje de la tensión de entrada a la salida. sali da. A continuación continuaci ón se presentan pres entan algunos ejemplos de señales PWM de ciclo de trabajo diferente.
La figura. 2 - Una forma de onda de PWM. Ciclo de Trabajo = 12,5% Analog Voltage Salida = 12,5% de Vcc (5v) = 0.625 voltios
La figura. 3 - Una forma de onda PWM. Ciclo de servicio = 75% Analog Voltage Salida = 75% de Vcc (5v) = 3,75 voltios Así que acaba de ver cómo podemos generar niveles de tensión analógica de un sistema digital usando la técnica PWM. Si la salida está provista de un filtro de R / C obtendrá un puro DC señales de niveles en vez de ondas cuadradas. Pero esto no es necesario para el control de motores o controlar el brillo del LED. Usted puede alimentar a las señales PWM directamente a continuación (por directamente que quiero decir sin el filtro de R / C y no los conductores (como el transistor, etc)).
AVR Timers - Introducción Los temporizadores son características estándar de casi todos los microcontroladores. Así que es muy importante aprender su uso. Desde un microcontrolador AVR tiene temporizadores muy poderosos y multifuncionales, el tema del temporizador es un tanto "inmensa". Además hay muchos temporizadores diferentes en el chip. Así se multiparte esta sección en los temporizadores. Voy a dar una introducción básica en primer lugar.
¿Qué es un reloj? Un temporizador de expresión más simple es un registro. Temporizadores generalmente tienen una resolución de 8 o 16 bits. Así que un temporizador de 8 bits es 8Bits amplia así capaz de mantener el valor EL PLAZO 0-255. Pero este registro tiene una propiedad mágica! Su valor aumenta / disminuye de forma automática a una velocidad predefinida (suministrado por el usuario). Este es el reloj temporizador. Y esta operación no necesita la intervención de la CPU.
Fig.:. Funcionamiento básico de un temporizador.
Desde temporizador funciona independientemente de la CPU se puede utilizar para medir el tiempo con precisión. Temporizador bajo ciertas condiciones tomar alguna acción automática o informar a la CPU. Uno de la condición básica es la situación cuando OVERFLOWS temporizador es decir, su contado hasta su valor máximo (255 para 8 temporizadores BIT), removió a 0. En esta situación temporizador puede emitir una alarma y se debe escribir una rutina de servicio de interrupción (ISR) para controlar el evento.
Fig.:. Funcionamiento básico de un temporizador.
Uso del temporizador de 8 bits (TIMER0) El ATmega16 y ATmega32 tiene tres temporizadores diferentes de las que la más simple es TIMER0. Su resolución es de 8 BIT es decir, puede contar de 0 a 255. Nota: Por favor, lea los "periféricos internos del AVR" para tener los conocimientos básicos de las técnicas utilizadas para el uso de los periféricos (como OnChip temporizador!) http://www.extremeelectronics.co.in/avrtutorials/pdf/peripherals.pdf
El Precontador El Pre-escalador es un mecanismo de generación de reloj para el contador de tiempo del reloj de la CPU. Como usted sabe que la CPU tiene una fuente de reloj, como un cristal externo de oscilador interno. Normalmente estos tienen la frecuencia como de 1 MHz, 8 MHz, 12 MHz o 16 MHz (MAX). El Pre-escalador se utiliza para dividir la frecuencia de reloj y producir un reloj de TEMPORIZADOR. El Pre-escalador se puede utilizar para obtener el siguiente reloj para el temporizador. No Reloj (Timer Stop). No preescala (Reloj = FCPU) FCPU / 8 FCPU/64 FCPU/256 FCPU/1024 Temporizador también se puede sincronizarse de forma externa, pero estoy dejando todo por ahora por la simplicidad. Timer0 Registros.
Como es posible que sabiendo del artículo de "periféricos internos de los AVR" cada periférico se conecta con la CPU de un conjunto de registros utilizados para comunicarse con él. Los registros de los temporizadores se dan a continuación. TCCR0 -. Contador Temporizador para configurar el temporizador.
Registro
de
Control Esto
será
utilizado
Fig.:. TCCR0 - Temporizador Contador registro de control 0
Como puede ver, hay 8 bits en este registro cada utilizados para determinados fines. Para este tutorial sólo se centrará en el último tres bits CS02 CS01 CS00 Ellos son el reloj de bits de SELECT. Se utilizan para configurar el Pre-escalador de temporizador.
TCNT0 - Contador Temporizador 0
Máscara Timer Interrumpir Registrarse TIMSK
Este registro se utiliza para activar / desactivar las interrupciones relacionadas con temporizadores. Este registro controla las interrupciones de los tres temporizadores. Los dos últimos bits (bit 1 y el bit 0) Controla las interrupciones de TIMER0. TIMER0 tiene dos interrupciones. TOIE0: este bit cuando se establece en "1" permite la interrupción de desbordamiento. Ahora el tiempo para algunos códigos de prácticas! Nos instalamos en un temporizador para Precontador de 1024 y nuestra FCPU es 16MHz. Vamos a incrementar un "recuento" de variable en cada interrupción (desbordamiento) si la cuenta llega a 61 vamos a alternar PORTC0 que está conectado al LED y restablecer "count = 0". Entrada de reloj de TIMER0 = 16MHz/1024 = 15625 Hz Frecuencia de desbordamiento = 15625/256 =61.0352 Hz si incrementamos una variable "cuenta" cada desbordamiento cuando "contar llegar a 61" aproximadamente una segundo tiene transcurrir.
Configuración del TIMER0 / / Pre-escalador = FCPU/1024 TCCR0 | = (1 << CS02) | (1 << CS00); / / Habilitar desbordamiento habilitación de interrupción TIMSK | = (1 << TOIE0); / / Contador Initialize TCNT0 = 0;
Ahora el temporizador está ajustado y desbordamiento de fusilamiento interr umpe a 61,0352 Hz
El ISR ISR (TIMER0_OVF_vect) { / / Esta es la rutina de servicio de interrupción de TIMER0 DESBORDAMIENTO Interrupción. / / CPU llamará automáticamente cuando este TIMER0 desborda.
/ / Incrementar nuestra variable
cuenta + +; Si (recuento == 61) { PORTC = ~ PORTC; / / Invertir el valor de PORTC count = 0; } }
Demo Programa (AVR GCC)
[email protected] Blink Hz en PORTC [3,2,1,0]
# Include
# include
volátil recuento uint8_t;
void main () {
/ / Pre-escalador = FCPU/1024 TCCR0 | = ( 1 << CS02) | ( 1 << CS00);
/ / Habilitar Overflow Interrupt Enable TIMSK | = ( 1 << TOIE0);
/ / Inicializar Contador
TCNT0 = 0 ;
/ / Inicializar nuestra varriable count = 0 ;
/ / Puerto C [3,2,1,0] como poner un DDRC | = 0x0F ;
/ / Habilitar interrupciones Global sei ();
/ Loop / Infinito , mientras que ( 1 ); }
ISR (TIMER0_OVF_vect) {
/ / Esta es la rutina de servicio de interrupción de TIMER0 DESBORDAMIENTO Interrupción. / / CPU llamará automáticamente cuando este TIMER0 desborda.
/ / Incrementar nuestra variable cuenta + +; Si (recuento == 61 ) { PORTC = ~ PORTC; / / Invertir el valor de PORTC count = 0 ; } }
PWM Generación de señales mediante AVR temporizadores. Generación de señales PWM es una necesidad tan común que todos los microcontroladores modernos como AVR ha creado un hardware dedicado para eso. El hardware dedicado elimina la carga de generación de la señal PWM por el software (por lo tanto libera la CPU). Su como pedirle al hardware para generar una señal PWM de un ciclo de trabajo específico y la tarea de CPU ha terminado. El hardware PWM con el inicio la entrega de la necesaria señal de uno de sus números PIN, mientras que la CPU puede continuar con otras tareas. En microcontroladores AVR señales PWM son generados por las unidades de temporizador. (Ver AVR temporizador Tutoriales). En este tutorial te dará la idea básica de cómo PWM señales son generadas por temporizadores AVR. Sus dos métodos por los cuales se puede generar PWM de AVR TIMER0 (por ATmega16 y ATmega32 MCUs). 1. PWM rápido 2. Fase PWM correcta No se preocupe por sus nombres que se convertirá en claro a medida que avancemos. En primer lugar vamos a considerar el modo PWM rápido.
Fundas PWM Generación Vamos a utilizar el temporizador simple, TIMER0 para la generación de PWM. (Nota TIMER0 de ATmega8 no puede ser utilizado para la generación de PWM, estos son válidos para ATmega16 y ATmega32). En esta parte no vamos a estar tratando con cualquier código, lo que hacíamos era analizar los conceptos. Tenemos un contador de 8 bits contando 0-255 y la va a 0 y así sucesivamente. Esto se puede mostrar en el gráfico como
La figura. 1 - Temporizador AVR cuenta de secuencia para el PWM rápido.
El plazo depende de las ajustes PRESCALAR. Ahora, para la generación de PWM de esta secuencia de cuenta que tenemos un nuevo "amigo" llamado OCR0 (Output Compare Registrarse Zero, cero porque para TIMER0 y no son más de estos para TIMER1 y TIMER2). Podemos almacenar cualquier valor entre 0-255 en OCR0, decimos que almacenamos en 64 OCR0 luego aparecería en el gráfico de la siguiente manera (la línea roja).
La figura. 2 - Timer AVR secuencia de cuenta para PWM rápido con OCR0 = 64
Entonces, ¿cómo se compara esta salida registro genera PWM? Bueno, la respuesta sigue. Cuando el TIMER0 está configurado para el modo PWM rápido, mientras que hasta el conteo cuando el valor del contador TIMER0 ( TCNT0 registro) coincide OCR0 registrar una salida de PIN se tira bajo (0) y al contar secuencia comenzará de nuevo desde 0 se establece de nuevo (tirado alta = Vcc). Esto se muestra en la figura 3. Este PIN se llama OC0 y usted lo puede encontrar en la configuración del PIN de ATmega32.
La figura. 3 - Temporizador AVR secuencia de cuenta para PWM rápido con OCR0 = 64
De la figura se puede ver que una ola de ciclo de trabajo de 64/256 = 25% es producido mediante el establecimiento OCR0 = 64. Puede establecer OCR0 a cualquier valor y obtener un PWM de ciclo de trabajo de (OCR0 / 256). Si se ajusta a 0 se obtiene 0% ciclo de trabajo al establecer que a 255 se obtiene la salida de servicio del 100%. Por lo tanto, variando el ciclo de trabajo se puede obtener una salida de tensión analógica de
la OC0 PIN. La resolución de este PWM es 8BIT. Ver la animación de abajo para una explicación paso a paso del proceso de generación de PWM.
La figura. 4 - Proceso de generación de PWM del AVR temporizadores. Una nota sobre OCR0 es que se doble amortiguada. Pero lo que hace que los medios? Es sólo por su ayuda. Doblebuffering significa que no se puede escribir directamente a OCR0, cuando cada vez que se escribe en OCR0 en realidad se está escribiendo a un buffer. El valor de memoria intermedia se copia en OCR0 real sólo durante el inicio del ciclo (cuando TCNT0 envuelve 255-0). Esta buena característica impide la actualización de OCR0 entre los ciclos. El nuevo valor de OCR0 entra en vigor sólo en comienzo de un nuevo ciclo, incluso si se escribe en él en medio de un ciclo. Ahora se va a configurar el TIMER0 en modo PWM rápido y utilizarlo para generar señales PWM de ciclos de trabajo variables. De esta manera estaríamos generando analógicas señales de voltajes entre 0 y 5V. En el ejemplo vamos a conectar esta salida a un LED y ver cómo varía su brillo. Configuración TIMER0 en modo PWM rápido Configuración del TIMER0 en modo PWM rápido es muy fácil y sólo requiere una sola línea de código. Sólo tiene que hacer frente a un registro llamado TCCR0 ( Timer Counter Control Registro Para el temporizador de 0 ). Usted sólo tiene que configurar varios bits en él para conseguir el ajuste deseado. Los diversos trozos de TCCR0 es la siguiente. TCCR0 Este registro se utiliza para configurar el TIMER0. La explicación de los diversos bits de este registro es el siguiente.
Bit No
7
6
5
4
3
2
1
0
Nombre
FOC0
WGM00
COM01
COM00
WGM01
CS02
CS01
CS00
Inicial Val
0
0
1
0
0
0
0
0
(Tenga en cuenta los bits de RED se discuten aquí)
WGM - Modo Forma de onda de la Generación La siguiente tabla muestra los distintos modos soportados por TIMER0. Modo
WGM00
WGM01
Modo de funcionamiento
0
0
0
Normal
1
0
1
PWM de fase correcta
2
1
0
CTC
3
1
1
PWM rápido
De la tabla se desprende que, para PWM rápido que el modo 3 necesitamos. Para conseguirlo debemos establecer WGM00 = 1 y = 1 WGM01 COM - comparar Modo de salida Estos bits se utilizan para establecer el modo de salida en varias generaciones la forma de onda de modo. Para el modo PWM rápida estos pueden ser utilizados para lograr siguientes modos de salida.
COM01
COM00
Modo de salida
0
0
Normal Operación de puerto (OC0 desconectado)
1
0
RESERVADO
0
1
PWM No invertido
1
1
PWM invertida
Necesitamos que el "modo de salida PWM para no invertida " así que nos pusimos COM01 = 0 y COM00 = 1 CS - Reloj Select Estos se utilizan para establecer un reloj de entrada para TEMPORIZADOR. Los colocamos la siguiente manera para obtener Ftimer = F_CPU (es decir, sin prescalling). CS02 = 0 CS01 = 0 CS00 = 1 Ahora el temporizador está en modo PWM rápido para variar su ciclo de trabajo de salida sólo tenemos que configurar el OCR0 (Output Compare Regístrate Timer 0). Por ejemplo establecerla a 0 va a generar PWM con el ciclo de trabajo de 0% (totalmente apagado) mientras que con 128 generará ciclo de trabajo del 50% y el 255 va a generar señales de ciclo de trabajo del 100%. Nota: La forma de onda de salida está disponible en la salida asociada Comparar Pin del microcontrolador. Por ejemplo para el Timer 0 el pin OC asociado es OC0. En ATmega16 y ATmega32 está en PORTB bit 3, es decir, PB3. Este pin se debe establecer en la salida a obtener las señales PWM.
Programa de ejemplo El en el siguiente programa establecimos TIMER0 en modo PWM rápido y utilizamos las señales PWM generadas para variar el brillo de un LED. Este es el más simple programa para ayudarle a empezar con la generación de la señal PWM. Comenzamos con mínimo brillo y aumentarla gradualmente y luego otra vez reducimos gradualmente a cero. Este proceso se repite mientras el sistema está encendido.
# Include # include
void InitPWM () {
/ * TCCR0 - Timer Registro Contador Control (TIMER0)
--------------------------------------- -------BITS DESCRIPCIÓN
N º: NOMBRE DESCRIPCIÓN -------------------------BIT 7: FOC0 Forzar salida de comparación [No se utiliza en este ejemplo] BIT 6: Formulario WGM00 Wave Modo generartion [SET para 1] BIT 5: COM01 Comparar Modo de salida [SET 1] BIT 4: COM00 Comparar Modo de salida [SET para 0]
BIT 3: modo de generación de forma de onda WGM01 [SET 1] BIT 2: CS02 reloj Seleccione [SET para 0] BIT 1: CS01 reloj Seleccione [SET para 0] BIT 0: CS00 Reloj Seleccione [SET 1]
Los ajustes anteriores son para --------------------------
Temporizador Reloj = CPU del reloj (No Prescalling) Mode = Fast PWM PWM de salida = no invertido
* /
TCCR0 | = ( 1 << WGM00) | ( 1 << WGM01) | ( 1 << COM01) | ( 1 << CS00);
/ / Set OC0 PIN como salida. Es PB3 en ATmega16 ATmega32
DDRB | = ( 1 << PB3); }
/ ************************************************* *************** ** Establece el ciclo de trabajo de salida.
Argumentos --------deber: Entre 0 - 255
0 = 0%
255 = 100%
La función establece el ciclo de trabajo de salida PWM generada en OC0 PIN El voltaje promedio en este pin de salida será
deber Vout = ------ x 5v 255
Esto puede ser usado para controlar el brillo de LED o velocidad del motor. *********************************** ********************************** /
void SetPWMOutput (deber uint8_t) {
OCR0 = deber; }
/ ************************************************* *************** ****
Loop Espera simple
************************************************** ******************* /
void Wait () { _delay_loop_2 ( 3200 ); }
void main () { brillo uint8_t = 0 ;
/ / Inicializar PWM Canal 0 InitPWM ();
/ / Haga esto para siempre
mientras que ( 1 ) {
/ / Ahora Loop con el aumento de brillo
por (brillo = 0 ; brillo < 255 ; brillo + +)
{
/ / Ahora Set El Brighness usando PWM
SetPWMOutput (brillo);
/ / Ahora esperar algún tiempo Wait (); }
/ / Ahora Loop con la disminución del brillo
por (brillo = 255 ; brillo> 0 ; brillo -) {
/ / Ahora Set El Brighness usando PWM
SetPWMOutput (brillo);
/ / Ahora esperar algún tiempo Wait (); } MODO PWM FASE CORRECTA
La fase de modo PWM correcta (WGM01: 0 = 1) proporciona una fase de alta resolución PWM correcta opción de generación de forma de onda. El modo PWM de fase correcta se basa en una operación de doble pendiente. El contador cuenta repetidamente desde abajo hacia MAX y luego de MAX a abajo. En inversora Comparar el modo de salida, la salida de comparación (OC0) se despeja en el partido comparar entre TCNT0 y OCR0 mientras contaje, y situado en el partido, mientras que comparar conteo regresivo. En la inversión de la salida del modo Comparar, se invierte la operación. La operación de doble pendiente tiene menor frecuencia máxima de
operación de una sola operación pendiente. Sin embargo, debido a la característica simétrica de los modos de PWM de doble pendiente, se prefieren estos modos para aplicaciones de control de motores. La resolución de PWM para el modo PWM de fase correcta se fija a ocho bits. En el modo PWM de fase correcta del contador se incrementa hasta que el valor del contador coincide MAX. Cuando el contador llega a MAX, cambia la dirección de conteo. El valor TCNT0 será igual a MAX para un ciclo de reloj temporizador. El diagrama de tiempos para el modo PWM de fase correcta se muestra en la Figura que está a continuación. El valor TCNT0 es en el diagrama de temporización que muestra como un histograma para ilustrar el funcionamiento de doble pendiente. El diagrama incluye salidas PWM no invertidas e invertidas. La pequeña línea horizontal marca en las pistas TCNT0 representan partidos comparativas entre OCR0 y TCNT0.
El contador indicador de desbordamiento del temporizador (TOV0) se establece cada vez que el contador llegue a FONDO. El indicador de interrupción se puede utilizar para generar una interrupción cada vez que el contador alcanza el valor INFERIOR. En el modo PWM de fase correcta, la unidad de comparación permite la generación de formas de onda PWM en el pin OC0. Ajuste del COM01: 0 bits a 2 producirá un PWM no invertida. Una salida PWM invertida puede ser generada mediante el establecimiento de la COM01: 0 a 3 (véase la Tabla). El valor real OC0 sólo será visible en el pin de puerto si la dirección de datos para el pin del puerto se configura como salida. La forma de onda PWM es generada en la limpieza (o ajuste) del Registro OC0 al comparar partido entre OCR0 y TCNT0 cuando el contador se incrementa, y la creación (o compensación) el Registro OC0 a comparar partido entre OCR0 y TCNT0 cuando el contador disminuye. La
frecuencia PWM para la salida cuando se usa la fase correcta PWM se puede calcular por la siguiente ecuación:
La variable N representa el factor de pre-escala (1, 8, 64, 256, o 1024). Los valores extremos para el Registro OCR0 representan casos especiales cuando se genera una salida de forma de onda PWM en el modo PWM de fase correcta. Si el OCR0 se fija igual a la parte inferior, la salida estará continuamente bajo y si se establece igual a MAX, la salida será continua alta para el modo PWM no invertida. Para PWM invertida la salida tendrá los valores lógicos opuestos. En el comienzo del período de 2 en la Figura anterior OCn tiene una transición de alta a baja a pesar de que no hay coincidencia de comparación. El punto de esta transición es el de garantizar la simetría alrededor INFERIOR. Hay dos casos que dan una transición sin coincidencia de comparación: • OCR0A cambia su valor de MAX, al igual que en la Figura 33. Cuando el valor es OCR0A MAX el valor pin OCn es el mismo que el resultado de un conteo regresivo Compare Match. Para asegurar la simetría alrededor INFERIOR el valor OCn en MAX debe corresponderse con el resultado de un conteo progresivo Compare Match. • El temporizador empieza a contar a partir de un valor más alto que el de OCR0A, y por esa razón no alcanza la comparación del partido y de ahí el cambio OCn que habría sucedido en el camino.
COM1X1 0 0 1
COM1X0 0 1 0
Efectos en OCX1 No conectado No conectado Borrado en la comparación, cuenta ascendente. Puesta en
1
1
marcha de la comparación, cuenta descendente (PWM no invertido). Borrado en la comparación, cuenta descendente. Puesta en marcha de la comparación, cuenta ascendente (PWM invertido).
http://extremeelectronics.co.in/avr-tutorials/timers-in-compare-mode-part-i/ http://extremeelectronics.co.in/avr-tutorials/timers-in-compare-mode-part-ii/ http://www.atmel.com/images/doc2503.pdf