Modulación de ancho de pulso. Software PWM (PWM) Conformación PWM digital 16 bits

PWM- Modulación de ancho de pulso
PWM- Modulación de ancho de pulso (es decir, lo mismo que PWM)

¿Qué es PWM y por qué es necesario?

¿Por qué necesitas el software PWM?

Luego, en el propio AVR (Atmega) hay 1-2 canales de calce, lo que a menudo no es suficiente para lo que se necesita.

Tengamos 3 (tres) LED y queremos controlar el brillo de cada uno de ellos individualmente. Los canales del temporizador PWM integrados no son suficientes. Y, en general, tal vez todavía nos queden algunos control especial queremos implementar sobre cada uno de ellos. Por lo tanto, los colocamos en tramos normales (en el ejemplo de PORTC, tramos 3,4,5) y los controlamos mediante programación.

Información adicional sobre la conexión: http://www.radiokot.ru/start/mcu_fpga/avr/05/ y en la hoja de datos del controlador.

Cálculo de una resistencia para un LED:

Potencia: 5V. La caída de voltaje en el LED se puede considerar de 1,5 V. La corriente en el LED no debe ser superior a 20 mA (algunos argumentarán que se necesitan 15 mA, pero a mí me gusta más brillante).
Según la ley de Ohm: I=U/R, R=U/I=(5-1,5)/0,02=175 Ohm. Instalé resistencias R1, R2 y R2 - 220 ohmios.

Algoritmo

La opción más sencilla es un ciclo eterno. La opción con interrupción será más adelante (abajo), ahora veamos un ejemplo simple para entender la esencia.

En primer lugar, es necesario determinar dos cosas: con qué frecuencia parpadearán los LED para que este parpadeo no sea visible y, en segundo lugar, cuántos niveles de brillo puede tener el LED.

En términos de niveles de brillo, sea 256. 0 - completamente apagado, 255 - completamente encendido (es decir, el canal PWM está en modo lógico todo el tiempo, es decir, ciclo de trabajo = 100%).

Sin embargo, ahora te confundiré un poco.

El caso es que tenemos el PLUS del diodo en el circuito conectado directamente a la fuente de alimentación, y el menos pasa por la resistencia hasta la pata (no importa dónde esté la resistencia, lo que importa es cuál está en la pata MK) . Por lo tanto, el LED se enciende cuando el nivel en la pata MK es bajo, es decir, cero, es decir la pierna dentro del MK se lanza a GND, es decir al suelo. Esto significa que los 0 y 1 en el PWM deben invertirse. Aquellos. Cuanto más tiempo contenga la señal ceros en relación con unos, más brillante será el diodo.

Y así, hay 256 niveles de brillo.

¿De qué tipo de parpadeo estamos hablando? La conclusión es que si debemos aplicar una señal PWM a muchos diodos y hacer esto secuencialmente a cada uno, luego de enviar la señal al primer diodo debemos volver a enviarle la señal en un tiempo tal que:

  1. tener tiempo para generar una señal PWM completa,
  2. no ha pasado más de 1/25 de segundo; de lo contrario, el LED parpadeará notablemente,
  3. No hubo pausas notables en la generación de PWM entre segmentos de la señal PWM, es decir. para que la señal PWM NO SE DISTORSIONE.

A continuación se muestra un ejemplo de distorsión de señal PWM:

Tendremos todo esto en cuenta, pero en realidad no nos importa aquí, ya que tendremos un parpadeo suave muy simple y solo cambiará el brillo, es decir. Habrá mucho tiempo y la tarea es tan simple que no consumirá tiempo generando la señal PWM.

Entonces, aquí está el código fuente (para AVR Studio, es decir, gcc):

#definir F_CPU 1000000UL #incluir #incluir #define LEDS_N 3 #define LEDS_PORT PORTC #define LEDS_DDR DDRC int main() (registra el contador de escaneo de caracteres sin firmar=0; registra el carácter i sin firmar; registra el brillo de caracteres sin firmar=0; nivel de caracteres sin firmar=(0,16,32); // qué parte de todos los ciclos está encendido el led unsigned char ledbits=(0b00001000,0b00010000, 0b00100000); // establece la dirección C5 - salida LEDS_DDR=0b11111111; // apaga todos los leds LEDS_PORT=0b11111111; ;i =nivel[i])( // apagado - enciende el pin LEDS_PORT|=ledbits[i]; ) else ( // encendido - apaga el pin LEDS_PORT&=~ledbits[i]; ) ) scancounter++; // cambio de brillo del led if (!scancounter)( for (i=0;i 128)nivel[i]=0; ) ) ) )

Cómo funciona el programa

Hay un contador de intervalo de tiempo: scancount. El valor máximo de este contador es el número de niveles de brillo menos 1. Cada revolución del ciclo aumenta en uno, luego supera 255 y vuelve a ser 0. En cada revolución del ciclo, se establece una señal para cada LED. Si el contador es menor o igual que el nivel de brillo, apague el diodo. Si el contador es inferior al nivel de brillo especificado para el diodo, encienda el diodo. Y como cada ciclo. Por ejemplo, si el nivel de brillo es 0, entonces el contador siempre será igual o mayor que cero y el diodo siempre estará apagado. Si el nivel de brillo es 255, entonces el contador será inferior a este valor 254 de 255 revoluciones del contador y arderá casi a plena intensidad. Si el brillo se establece en 50, durante las primeras 50 revoluciones del ciclo el diodo estará encendido y durante las 206 revoluciones restantes estará apagado, es decir. Se le suministrará el 50/256 de la corriente máxima.

A continuación en el programa controlamos el nivel de brillo del diodo para que haya algún tipo de demostración. Con cada desbordamiento del contador, se agrega 1 al brillo de todos los diodos, pero si el brillo supera 128, se restablece a 0. En general, si esta verificación no hubiera existido, luego de alcanzar el nivel de brillo de 255 Se habría puesto a cero, pero la experiencia ha demostrado que después de un brillo de 128 aumenta tan imperceptiblemente que podemos suponer que con un valor de 128 ya es casi el máximo. Y para que el efecto resultante sea más dinámico se introdujo este control.

También debe saber que la dependencia del brillo de la corriente para los LED NO ES LINEAL. Aquellos. 128 no es dos veces más tenue que 255 ni dos veces más brillante que 64.

Aquí no nos interesa cuánto tiempo se tarda en girar todo el ciclo con todos los diodos, ya que está claro que con una pureza de 1 MHz (ahí es donde funciona mi MK), será lo suficientemente rápido como para que el ojo no lo note. ver cualquier parpadeo.

Foto de montaje:


Haga clic en la foto para ampliar

Y aquí un vídeo del trabajo: (avi, divx, 3MB)
El vídeo no muestra bien el proceso de transición de brillo, ya que la matriz de la cámara no tiene la misma inercia visual que el ojo humano, pero, en general, el proceso es visible.

Se consideró un generador hardware PWM de un microcontrolador. Todo en él es bueno, pero hay algunos “peros”:
- el hardware PWM está estrictamente vinculado a ciertos pines del MK, no se puede reasignar a otra pierna
- el número de canales PWM de hardware es limitado, su número depende del modelo MK
- la profundidad de bits del hardware PWM no se puede cambiar

En este caso, puede resultar útil un método de software para obtener una señal PWM. No es difícil de hacer, pero exige la frecuencia de funcionamiento del microcontrolador y consume bastante tiempo del procesador, a diferencia del hardware, que pasa desapercibido para el programa principal. Pero dado que se utiliza, por regla general, para luces intermitentes LED, esto no es tan importante.

Necesitamos establecer un determinado tramo MK en 1 o 0 al comienzo del período de la señal PWM (dependiendo de qué señal necesitemos) y luego, al alcanzar la duración del pulso especificada, invertir el valor del tramo. La forma más conveniente de hacerlo es mediante una interrupción de desbordamiento. Esto es lo que haremos, usaremos la interrupción de desbordamiento del temporizador T0. Controlaremos un LED RGB, por lo que haremos legibles los nombres de las variables y las definiciones de macros para los puertos.

/*definir bloque************************************************ ******** *************************************** ** */ #definir PORTB.0 ROJO #definir PORTB.1 VERDE #definir PORTB.2 AZUL /***************************** ******** *************************************** ** **********************************/ /*anunciar cambios********* ** ************************************** *********** **********************/ carácter sin firmar rojo=255, verde, azul; //variables para cambiar el ciclo de trabajo PWM en el programa unsigned char red_b, green_b, blue_b; //variables para almacenar en búfer los valores del ciclo de trabajo de PWM unsigned char count; //variable - contador de llamadas del controlador de interrupciones unsigned char temp=1; //variable para el funcionamiento del algoritmo de cambio de color /*************************************** ********** **************************************** **********************/

Cuando ocurre una interrupción, debe incrementar el contador del programa en 1 y verificar si se ha desbordado. Si el temporizador está lleno, entonces debe enviar un 1 lógico a todos los pines en los que se emite PWM y también guardar las variables en un búfer. Las variables se guardan en el búfer para que los datos del ciclo de trabajo se actualicen una vez al comienzo de cada período, lo que elimina el comportamiento impredecible de la salida. A continuación, comparamos el valor del contador con el valor del búfer del ciclo de trabajo de cada canal. Si el contador ha alcanzado este valor, enviamos un 0 lógico al tramo MK correspondiente.

/*controlador de interrupciones************************************************ ******** ******************************************* *******/ interrumpir void timer0_ovf_isr( void) ( count++; if (count == 0)( //si el contador se ha desbordado y ha tomado el valor 0 red_b = red; //guardando el valor en el buffer green_b = green; blue_b = blue; RED =1; //establece los tramos correspondientes para PWM en 1 lógico GREEN =1 ) if (red_b == recuento) (RED = 0;) //al alcanzar el valor especificado; ciclo de trabajo, salida 0 lógica al pin MK if (green_b == recuento) (VERDE = 0;) if (blue_b == recuento) (AZUL = 0;)) /************ ********************** ******************************* *********** *******************************/

Para demostrar el trabajo, mostraremos un cambio de color suave en el LED según los colores del arco iris (Todo cazador quiere saber dónde se sienta el faisán). Para ello utilizaremos un algoritmo sencillo que ejecutaremos en un bucle sin fin.

/*función principal********************************************** **** **************************************** */ void principal(void ) ( PORTB=0x08; //configura el puerto DDRB=0x07; TCCR0=0x01; //configura el temporizador TCNT0=0x00; TIMSK=0x01; //permite la generación de una interrupción en el desbordamiento del temporizador T0 #asm("sei ") //habilitar globalmente las interrupciones /*bucle sin fin*************************************** **************************************** *******/ mientras ( 1) (si (temp==1) (si (verde< 255) green += 1; else temp = 2;} if (temp==2) {if (red >0) rojo -= 1; else temp = 3;) if (temp==3) (if (azul< 255) blue += 1; else temp = 4;} if (temp==4) {if (green >0) verde -= 1; else temp = 5;) if (temp==5) (si (rojo< 255) red += 1; else temp = 6;} if (temp==6) {if (blue >0) azul -= 1; else temp = 1;) delay_ms(2); ); /************************************************ * **************************************** *********** ***/ ) /********************************* ************ **************************** ********************** ********/

PWM (PWM): modulación de ancho de pulso. No hay necesidad de dejarse intimidar por este término. Esta es solo una forma de regular el voltaje. Digamos que la luz de fondo del monitor es demasiado brillante, cambia el brillo. Pero ¿qué está pasando realmente en este momento?

Imaginemos que la retroiluminación del monitor son varios LED. Todo funciona con tensión constante. Pero necesitábamos reducir el brillo del monitor. Es lógico responder que esto se puede hacer con una resistencia variable. Con corrientes bajas es posible. Pero en los más grandes, la resistencia se calentará mucho. Las dimensiones, las pérdidas y el consumo de energía aumentarán significativamente.

Por lo tanto, a la gente se le ocurrió un circuito de transistores que convierte un voltaje de CC en uno pulsante. Resulta que el voltaje pulsante, dependiendo del llenado del período, será equivalente a un voltaje constante. Aquellos. Si durante un período el voltaje estuvo encendido el 50% del tiempo y apagado el 50%, entonces el voltaje CC equivalente sería igual al 50% del voltaje nominal.

En números es simple: había un voltaje de 5 V CC, lo manejamos a través de PWM y obtuvimos 2,5 V. Si el ciclo de trabajo del pulso es del 75%, entonces el voltaje de CC equivalente será de 3,75 V. Creo que la idea es clara.

Ahora vayamos a la implementación práctica. Usando un microcontrolador cambiaremos el llenado de 0 a 100%, luego de 100% a cero. El resultado final debería verse así:

Para que quede más claro, conectemos un LED. Como resultado, el LED se encenderá y apagará suavemente.

Lancemos nuestro CodeVision favorito. Creamos un proyecto usando el asistente. En la sección Temporizadores, seleccione Temporizador 2 y establezca la configuración como se muestra en la figura.

Si intenta generar un proyecto, el programa puede decir malas palabras. Estamos de acuerdo, porque tenemos el tramo 3 del puerto B que debería configurarse como salida.

Traemos el código al siguiente formulario:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #incluir void main(void) (PORTB= 0x00; DDRB= 0x08; // Inicialización del temporizador/contador 2 ASSR = 0x00; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00; TIMSK= 0x00 ; mientras (1) (); )

#incluir void main(void) ( PORTB=0x00; DDRB=0x08; // Inicialización del temporizador/contador 2 ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) ( ); )

Prestemos atención a la línea OCR2=0x00; Esta variable es precisamente responsable de la cantidad de llenado del pulso. Este valor cambia de 0 a 255(0xFF), es decir 255 corresponde al 100% de llenado (corriente constante). Por lo tanto, si necesita un 30% de relleno (255/100)*30=77. A continuación convertimos 77 a sistema hexadecimal OCR2=0x4D;

TCCR2=0x6C; Cambiando este valor podemos ajustar la frecuencia PWM. La frecuencia de funcionamiento PWM es un múltiplo de la frecuencia a la que opera el microcontrolador. El proyecto utilizó una frecuencia de microcontrolador de 8 MHz, se utilizó una frecuencia PWM de 125 kHz, por lo tanto el divisor es 8/125 = 64
0x6C en el sistema numérico binario 1101100, abra la hoja de datos en Atmega8 y vea la descripción del registro TCCR2, así que aquí está 1101 100 los últimos dígitos son 100 y son responsables de seleccionar la frecuencia de operación PWM

Vayamos directamente al programa:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #incluir #incluir void main(void) ( PORTB= 0x00 ; DDRB= 0x08 ; ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) ( while (OCR2< 0xff ) { OCR2= OCR2+ 0x01 ; delay_ms(5 ) ; } while (OCR2>0x00) (OCR2= OCR2-0x01; retardo_ms(5); )); )

#incluir #incluir void main(void) ( PORTB=0x00; DDRB=0x08; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) ( while(OCR2<0xff) { OCR2=OCR2+0x01; delay_ms(5); } while(OCR2>0x00) (OCR2=OCR2-0x01; retardo_ms(5); ) ); )

El código es increíblemente simple: primero, en un bucle, aumentamos el relleno de 0 a 255(ff), luego lo reducimos de 255 a 0.
Y por último, un vídeo de cómo debería funcionar todo. Buena suerte con sus estudios)

Figura 1

T = T0+T1. Periodo de pulso

T = 1/F

S = T/T1

Ciclo de trabajo

Factor de llenado D=1/S más o menos D = T1/T*100%

Los dispositivos digitales, por ejemplo un microcontrolador, sólo pueden funcionar con dos niveles de señal, es decir, cero y uno o encendido y apagado. Por lo tanto, puede usarlo fácilmente para monitorear el estado de la carga, como encender o apagar un LED. También puedes usarlo para controlar cualquier dispositivo eléctrico usando los controladores adecuados (transistor, triac, relé, etc. Pero a veces necesitas algo más que “encender” y “apagar” el dispositivo). Entonces, si desea controlar el brillo de un LED (o lámpara) o la velocidad de un motor de CC, entonces señales digitales Simplemente, no puedo hacerlo. Esta situación es muy común en la tecnología digital y se llama Modulación de ancho de pulso (PWM).

Casi todos los microcontroladores modernos tienen hardware especializado para generar una señal PWM. En este tutorial aprenderemos los conceptos básicos de la técnica PWM y posteriormente veremos cómo implementar PWM usando microcontroladores AVR.

Los dispositivos digitales como un microcontrolador solo pueden generar dos niveles en las líneas de salida, alto = 5 V y bajo = 0 V. Pero, ¿qué pasa si queremos obtener 2,5 o 3,1 o ​​cualquier voltaje entre 0 y 5 V? Para hacer esto, en lugar de generar un voltaje CC constante en la salida, generaremos una onda cuadrada que tiene niveles alto = 5 V y bajo = 0 V (ver Figura 1).

Figura 1

La figura muestra que la señal permanece alternativamente en niveles bajos y altos durante algún tiempo. T0 - nivel bajo, T1 - nivel alto. El período de la señal será igual a T = T0+T1. Periodo de pulso- este es el intervalo de tiempo entre dos puntos característicos de dos pulsos adyacentes. Normalmente, el período se mide entre dos subidas o bajadas de pulsos adyacentes y se indica con la letra T mayúscula.

El período de repetición del pulso está directamente relacionado con la frecuencia de la secuencia del pulso y se puede calcular mediante la fórmula: T = 1/F

Si la longitud del pulso T1 es exactamente igual a la mitad del período T, entonces dicha señal a menudo se denomina "onda cuadrada".

El ciclo de trabajo de los pulsos es la relación entre el período de repetición del pulso y su duración y se indica con la letra S: S = T/T1

El factor de trabajo es una cantidad adimensional y no tiene unidades de medida, pero puede expresarse como un porcentaje. El término se encuentra a menudo en textos en inglés. Ciclo de trabajo, este es el llamado ciclo de trabajo o valor del ciclo de trabajo PWM. El ciclo de trabajo D es el recíproco del ciclo de trabajo.

Factor de llenado Generalmente se expresa como porcentaje y se calcula mediante la fórmula: D=1/S más o menos D = T1/T*100%

En la figura anterior (Fig. 1) se puede ver que T1 = T0, esto es igual a la mitad del período de tiempo. Entonces el ciclo de trabajo de PWM es del 50%. Si la frecuencia de dichos pulsos es lo suficientemente alta (digamos, 5000 Hz), entonces obtenemos la mitad de 5 V, es decir, 2,5 V. Por lo tanto, si la salida del controlador está acoplada al motor (usando controladores apropiados), funcionará al 50% de su velocidad máxima. La técnica PWM utiliza este hecho para crear cualquier voltaje entre dos niveles (por ejemplo, entre 0-12V). El truco es que cuando el valor del ciclo de trabajo cambia entre 0 y 100%, obtenemos el mismo porcentaje de voltaje de entrada en la salida. A continuación se muestran algunos ejemplos de señales PWM con diferentes ciclos de trabajo.

Si instala un filtro R/C en la salida, puede obtener un nivel de señal de CC pura en lugar de ondas cuadradas. Pero esto no es necesario para motores con escobillas ni para controlar el brillo del LED. Para hacer esto, puede aplicar una señal PWM directamente al controlador (por ejemplo, un transistor bipolar, MOSFET, etc.).

En modo operativo de 16 bits. Se entiende por temporizador su algoritmo de conteo y el comportamiento de la salida del formador de pulsos asociado a él, el cual está determinado por una combinación de bits que especifican el modo de operación del temporizador (WGMn3-0) y el modo de generación de señal de salida (COMnx1:0). . En este caso, los bits para configurar el modo de generación de señal de salida no afectan el algoritmo de conteo, porque El algoritmo de conteo depende únicamente del estado de los bits para configurar el modo de funcionamiento del temporizador. En los modos PWM, los bits COMnx1:0 le permiten habilitar/deshabilitar la inversión en la salida PWM generada (es decir, seleccionar PWM con inversión o PWM sin inversión). Para modos que no son PWM, los bits COMnx1:0 determinan qué acción tomar cuando ocurre una coincidencia: restablecer, configurar o invertir la salida (consulte también “Bloque de acondicionamiento de señal de salida” y “Diagramas de temporización de temporizador-contador de 16 bits”) .

Operación normal

El modo de funcionamiento más sencillo es el modo normal (WGMn3-0 = 0b0000). EN este modo El contador funciona como un contador sumador (incremental) y no se reinicia. El contador se desborda al pasar por el máximo de 16 bits. valor (0xFFFF) al límite de recuento inferior (0x0000). Durante el funcionamiento normal, el indicador de desbordamiento del contador del temporizador TOVn se fijará en el mismo ciclo de reloj cuando TCNTn llegue a cero.

De hecho, el indicador de desbordamiento TOVn es el bit 17 del contador del temporizador, excepto que solo se establece y no se borra. Sin embargo, esta propiedad se puede utilizar mediante programación para aumentar la resolución del temporizador mediante una interrupción de desbordamiento del temporizador, tras la cual el indicador TOVn se restablece automáticamente. No existen situaciones especiales para el funcionamiento normal, por lo que se puede registrar un nuevo estado del medidor en cualquier momento.

En modo normal, puedes usar el bloque de captura. Sin embargo, se debe garantizar que el intervalo de tiempo máximo entre la aparición de eventos externos no supere el período de desbordamiento del contador. Si no se cumple esta condición, es necesario utilizar una interrupción de desbordamiento del contador temporizador o un preescalador.

El bloque de comparación se puede utilizar para generar interrupciones. No se recomienda utilizar la salida OCnx para generar señales en funcionamiento normal, porque en este caso, se gastará una parte importante del tiempo del procesador.

Modo de reinicio del cronómetro de partido (CTC)

En el modo CTC (WGM01, WGM00 =0b10), el registro OCR0 se utiliza para configurar la resolución del contador. Si se establece el modo CTC y el valor del contador (TCNT0) coincide con el valor del registro OCR0, el contador se reinicia a cero (TCNT0=0). Por tanto, OCR0 especifica el recuento superior del contador y, en consecuencia, su resolución. Este modo proporciona un rango más amplio de ajuste de la frecuencia de los pulsos rectangulares generados. También simplifica el funcionamiento del contador de eventos externo.

En el reinicio del temporizador en el modo de partido (WGMn3-0 = 0b0100 o 0b1100), la resolución del temporizador la establecen los registros OCRnA o ICRn. En modo CTC, el contador (TCNTn) se reinicia si su valor coincide con el valor del registro OCRnA (WGMn3-0 = 0b0100) o ICRn (WGMn3-0 = 0b1100). El valor del registro OCRnA o ICRn determina el límite superior de conteo y, por tanto, la resolución del temporizador. Este modo proporciona un rango más amplio de ajuste de la frecuencia de los pulsos rectangulares generados. También simplifica el funcionamiento del contador de eventos externo. El diagrama de tiempos de la operación del temporizador en modo CTC se muestra en la Figura 1. El contador (TCNTn) incrementa su estado hasta que ocurre una coincidencia con el valor de OCRnA o ICRn, y luego se reinicia el contador (TCNTn).

Figura 1 – Diagrama de tiempos para el modo STS

Cuando se alcanza el límite de conteo superior, se puede generar una interrupción usando los indicadores OCFnA o ICFn correspondientes a los registros utilizados para establecer el límite de conteo superior. Si la interrupción está habilitada, entonces la rutina de interrupción se puede usar para actualizar el límite de conteo superior. Sin embargo, establecer el valor superior de conteo cerca del valor límite inferior de conteo cuando el contador funciona sin preescala o con un valor de preescala pequeño se debe hacer con extrema precaución, porque No hay doble almacenamiento en búfer en el modo CTC. Si el valor escrito en OCRnA o ICRn es menor que el valor actual de TCNTn, el contador se restablecerá cuando se produzca la condición de coincidencia cuando alcance el valor máximo (0xFFFF), luego pasará a el estado inicial 0x0000 y alcanza el nuevo valor OCRnA o ICRn. En muchos casos esta situación no es deseable. Una alternativa es el modo PWM rápido, donde el registro OCRnA determina el límite de conteo superior (WGMn3-0 = 0b1111), porque en este caso, OCRnA tiene doble buffer.

Para generar una señal en modo CTC, la salida OCnA se puede usar para cambiar el nivel lógico en cada partido configurando el modo de conmutación (COMnA1, COMnA0 = 0b01). El valor OCnA estará presente en el pin del puerto sólo si esta conclusión Se especifica la dirección de salida. La frecuencia máxima de la señal generada es fOC0 = fclk_I/O/2 si OCRnA = 0x0000. Para otros valores de OCRn, la frecuencia de la señal generada se puede determinar mediante la fórmula:

donde la variable N especifica el factor de división del preescalador (1, 8, 32, 64, 128, 256 o 1024).

Al igual que con el funcionamiento normal, el indicador TOV0 se establece en el mismo tic del temporizador cuando su valor cambia de 0xFFFF a 0x0000.

Modo PWM rápido

Modo rápido modulación de ancho de pulso(PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) está diseñado para generar pulsos PWM de mayor frecuencia. A diferencia de otros modos de funcionamiento, éste utiliza una operación de contador unidireccional. El conteo se realiza en la dirección del límite de conteo inferior al superior.

Si se configura un modo de salida no inversora, cuando TCNTn y OCRnx coinciden, la señal OCnx se configura y restablece en el límite de conteo superior. Si se especifica el modo de inversión, la salida OCnx se restablece cuando coincide y se establece en el límite de conteo alto. Debido al conteo unidireccional, la frecuencia de operación para este modo es dos veces mayor en comparación con el modo PWM con corrección de fase, donde se utiliza el conteo bidireccional. La capacidad de generar señales PWM de alta frecuencia hace que el uso de este modo sea útil en tareas de estabilización de potencia, rectificación y conversión de digital a analógico. La alta frecuencia, al mismo tiempo, permite el uso elementos externos físicamente de tamaño pequeño (inductores, condensadores), lo que reduce el costo total del sistema.

La resolución PWM puede fijarse en 8, 9 o 10 bits o establecerse mediante el registro ICRn u OCRnA, pero no menos de 2 bits (ICRn u OCRnA = 0x0003) y no más de 16 bits (ICRn u OCRnA = 0xFFFF). La resolución PWM en un valor límite superior (UL) determinado se calcula de la siguiente manera:

En modo PWM rápido, el contador se incrementa hasta que su valor coincida con uno de los valores fijos 0x00FF, 0x01FF o 0x03FF (si WGMn3:0 = 0b0101, 0b0110 o 0b0111, respectivamente), el valor en ICRn (si WGMn3:0 = 0b1110) o el valor en OCRnA (si WGMn3:0 = 0b1111) y luego se reinicia en el siguiente tic del reloj del temporizador. El diagrama de tiempos para el modo PWM rápido se muestra en la Figura 2. La figura muestra el modo PWM rápido cuando se usa el registro OCRnA o ICRn para establecer el límite superior. El valor TCNTn en el diagrama de tiempos se muestra como un gráfico de función para ilustrar el conteo unidireccional. El diagrama muestra salidas PWM invertidas y no invertidas. Una línea horizontal corta muestra puntos en el gráfico TCNTn donde coinciden los valores de OCRnx y TCNTnx. El indicador de interrupción OCnx se establece cuando ocurre una coincidencia.

Figura 2: Diagrama de tiempos para el modo PWM rápido

El indicador de desbordamiento del contador del temporizador (TOVn) se activa cada vez que el contador alcanza su límite superior. Además, el mismo pulso de reloj, junto con el indicador TOVn, puede configurar los indicadores OCnA o ICFn si se usa el registro OCRnA o ICRn para establecer el límite superior, respectivamente. Si una de estas interrupciones está habilitada, la rutina de interrupción puede actualizar el límite de conteo superior y los umbrales de comparación.

Si el valor del límite de conteo superior cambia, entonces se debe cumplir la condición de que el nuevo valor del límite superior escrito sea mayor o igual a los valores en todos los registros de umbral de comparación. De lo contrario, nunca se producirá una coincidencia entre TCNTn y OCRnx. Tenga en cuenta que cuando se utilizan valores de límite superior fijos, los bits no utilizados se enmascaran a 0 al escribir en los registros OCRnx.

El mecanismo de modificación del registro ICRn difiere del OCRnA cuando se utiliza para establecer el límite superior. El registro ICRn no tiene doble buffer. Esto significa que si se escribe un valor pequeño en ICRn mientras el contador está funcionando con poco o ningún preescalado, existe el riesgo de escribir un valor en el registro ICRn que sea menor que el valor actual de TCNTn. Como resultado, en esta situación se perderá el partido que encabeza el conteo. En este caso, el contador alcanzará su valor máximo (0xFFFF), se reiniciará en 0x0000 y solo entonces generará una coincidencia. El registro OCRnA contiene un esquema de doble almacenamiento en búfer, por lo que puede modificarse en cualquier momento.

clase="eliadunit">

Si se realiza una escritura en la dirección OCRnA, el valor en realidad se coloca en el registro del búfer OCRnA. Si se produce una coincidencia entre TCNTn y la parte superior del conteo, entonces el siguiente ciclo de reloj del temporizador es la copia del registro del búfer al registro de umbral de comparación OCRnA. El registro se actualiza en el mismo ciclo de reloj en el que se restablece TCNTn y se establece el indicador TOVn.

Se recomienda utilizar el registro ICRn para establecer el límite superior si el límite de recuento superior es una constante. En este caso, el registro OCRnA también queda libre para generar una señal PWM en la salida OCnA. Sin embargo, si la frecuencia PWM cambia dinámicamente (debido al cambio del límite superior), entonces, en este caso, es más ventajoso utilizar el registro OCRnA para establecer el límite superior, porque admite doble almacenamiento en búfer.

En el modo PWM rápido, las unidades de comparación le permiten generar señales PWM en los pines OCnx. Si COMnx1:0 = 0b10, entonces se configura el modo PWM sin inversión de salida, y si COMnx1:0 = 0b11, entonces se configura el modo PWM con inversión de salida (consulte la Tabla 59). El valor real de OCnx se puede observar en el pin del puerto si está configurado en la dirección de salida (DDR_OCnx). La señal PWM se genera configurando (restableciendo) el registro OCnx cuando ocurre una coincidencia entre OCRnx y TCNTn, y restableciendo (configurando) el registro OCnx junto con el reinicio del contador (cambio del límite superior al límite inferior).

La frecuencia PWM de la señal de salida para un valor límite superior (UL) determinado está determinada por la expresión:

donde N es una variable que especifica el valor del coeficiente de predivisión (1, 8, 32, 64, 128, 256 o 1024).

La escritura de valores límite en el registro OCRnx está asociada con casos especiales en la generación de pulsos PWM. Si OCRnx se establece igual al límite inferior (0x0000), aparecerá un pulso corto en la salida cada (VP+1) ciclo de reloj del temporizador. Escribir un valor igual al límite superior de OCRnx dará como resultado el establecimiento de un nivel de registro constante. 1 o 0 en la salida (dependiendo de la polaridad de la señal de salida seleccionada mediante el bit COMnx1:0).

Si se requiere generación de onda cuadrada (pulsos rectangulares con un ciclo de trabajo de 2 o 50 % de relleno) alta frecuencia, entonces es necesario usar el modo PWM rápido con los bits COMnA1:0 = 0b01 configurados, lo que hace que el nivel lógico en la salida OCnA cambie (invierta) con cada coincidencia. Esto solo es aplicable si se utiliza OCRnA para establecer el límite superior (WGMn3-0 =0b1111). La frecuencia de onda cuadrada máxima generada en este caso es fOCnA = fclk_I/O/2, si OCRnA = 0x0000. Esta característica es similar a la conmutación OCnA en modo CTC, con la excepción del doble almacenamiento en búfer, que está presente en el modo PWM rápido.

Modo de modulación de ancho de pulso con corrección de fase (Phase Correct)

El modo de modulación de ancho de pulso con corrección de fase (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 o 0b1011) está diseñado para generar una señal PWM con corrección de fase con alta resolución. El modo PWM FC se basa en el funcionamiento bidireccional de un temporizador-contador. El contador pasa del límite inferior (0x0000) al límite superior y luego regresa del límite superior al límite inferior. Si el modo de salida del modelador de pulsos está configurado en no inversor, la salida OCnx se restablece/configura cuando los valores TCNTn y OCRnx coinciden durante el conteo ascendente/descendente. Si se configura el modo de salida inversora, por el contrario, durante el conteo directo, se produce la configuración y durante el conteo inverso, se reinicia la salida OCnx. Con el funcionamiento bidireccional, la frecuencia máxima de la señal PWM es menor que con el funcionamiento unidireccional; sin embargo, debido a características tales como la simetría en los modos PWM con funcionamiento bidireccional, se prefiere utilizar estos modos para resolver problemas de control del variador.

La resolución PWM en este modo puede ser fija (8, 9 o 10 bits) o configurarse mediante el registro ICRn u OCRnA. La resolución mínima es de 2 bits (ICRn u OCRnA = 0x0003) y la máxima es de 16 bits (ICRn u OCRnA = 0xFFFF). Si se especifica un límite superior, la resolución PWM en este modo se determina de la siguiente manera:

En modo PWM FC, el contador se incrementa hasta alcanzar uno de los valores fijos 0x00FF, 0x01FF o 0x03FF (respectivamente para WGMn3-0 = 0b0001, 0b0010 o 0b0011), así como un valor igual a ICRn (si WGMn3- 0 = 0b1010) u OCRnA (si WGMn3 :0 = 0b1011). Además, cuando se alcanza el límite superior, el contador cambia la dirección de conteo. El valor TCNTn permanece en el límite superior durante un ciclo de reloj del temporizador. El diagrama de tiempos para el modo PC PWM se muestra en la Figura 3. La figura muestra el modo PC PWM usando el registro OCRnA o ICRn para establecer el límite superior. El estado TCNTn se representa como un gráfico de función para ilustrar el conteo bidireccional. La figura muestra la salida PWM invertida y no invertida. Las líneas horizontales cortas indican puntos en el gráfico TCNTn donde se produce una coincidencia con el valor de OCRnx. El indicador de interrupción OCnx se establece cuando ocurre una coincidencia.

Figura 3 – Diagrama de tiempos para el modo PWM FC

El indicador de desbordamiento del contador del temporizador (TOVn) se activa cada vez que el contador alcanza su límite inferior. Si se utiliza el registro OCRnA o ICRn para establecer el límite superior, entonces el indicador OCnA o ICFn se configura en consecuencia con el mismo pulso de reloj en el que se actualizó el registro OCRnx desde el registro del búfer (en la parte superior del conteo). Los indicadores de interrupción se pueden utilizar para generar una interrupción cuando un contador alcanza un límite bajo o alto.

Al cambiar el valor del límite de conteo superior, debe asegurarse de que sea mayor o igual a los valores en todos los registros de comparación. De lo contrario, nunca se producirá una coincidencia entre TCNTn y OCRnx. Tenga en cuenta que cuando se utilizan valores de recuento superiores fijos, los bits no utilizados se borran a cero al escribir en los registros OCRnx. El tercer período en la Figura 53 ilustra el caso en el que un cambio dinámico en el límite de conteo superior conduce a la generación de un pulso asimétrico. Esta característica se basa en el tiempo de actualización del registro OCRnx. Dado que la actualización de OCRnx ocurre en la parte superior del conteo, el período de PWM comienza y termina en la parte superior del conteo. Esto implica que la duración de la cuenta atrás está determinada por el valor límite superior anterior y la duración del conteo directo está determinada por el nuevo valor límite superior. Si estos dos valores son diferentes, entonces la duración del conteo hacia adelante y hacia atrás también será diferente. La diferencia de duración provoca una asimetría de los impulsos de salida.

Si la tarea es cambiar el límite superior mientras el contador está funcionando, en lugar de este modo se recomienda utilizar el modo PWM PFC (corrección de fase y frecuencia). Si se utiliza un valor límite superior estático, prácticamente no hay diferencias entre estos modos.

En el modo PWM FC, las unidades de comparación le permiten generar señales PWM en los pines OCnx. Si configura COMnx1:0 = 0b10, entonces la salida PWM será sin inversión, y si COMnx1:0=0b11, entonces con inversión. El valor real de OCnx se puede observar en el pin del puerto si el registro de dirección de datos para ese pin del puerto está configurado en la dirección de salida (DDR_OCnx). La señal PWM se genera configurando (restableciendo) el registro OCnx cuando los valores de OCRnx y TCNTn coinciden durante el recuento ascendente, y restableciendo (configurando) el registro OCnx cuando hay una coincidencia entre OCRnx y TCNTn durante el recuento descendente. La frecuencia resultante de la señal PWM en modo PWM FC en un límite superior (UL) determinado se puede calcular utilizando la siguiente expresión:

La escritura de valores límite en el registro OCRnx está asociada con casos especiales en la generación de señales PWM en el modo PWM FC. Si configura el modo PWM sin inversión y configura OCRnx igual al límite inferior, entonces la salida se configurará continuamente para iniciar sesión. 0, y si es igual al límite superior, entonces siempre hay un registro presente en la salida. 1. Para PWM con inversión se deben sustituir los niveles indicados por los opuestos.

Si especifica utilizar OCnA como límite superior (WGMn3:0 = 0b1011) y establece COMnA1:0 =0b01, se generará una onda cuadrada en la salida de OCnA.

Modo de modulación de ancho de pulso con corrección de fase y frecuencia (Phase and Frequency Correct)

El modo de modulación de ancho de pulso con corrección de fase y frecuencia (PWM PFC) (WGMn3-0 = 0b1000 o 0b1001) está diseñado para generar pulsos PWM de alta resolución con corrección de fase y frecuencia. Al igual que el modo PWM FC, el modo PWM FC se basa en el funcionamiento bidireccional del contador. El contador pasa del límite inferior (0x0000) al límite superior y luego regresa del límite superior al límite inferior. Si se especifica el modo PWM no inversor, la salida OCnx se borra si ocurre una coincidencia entre TCNTn y OCRnx durante el conteo ascendente, y se configura si ocurre una coincidencia durante el conteo descendente. En modo inversor la operación es inversa. La operación bidireccional, en comparación con la operación unidireccional, se asocia con la generación de más bajas frecuencias. Sin embargo, debido a la simetría en los modos PWM con conteo bidireccional, su uso es preferible en tareas de control de accionamiento.

La principal diferencia entre los modos PWM FC y PWM FC es el momento en que el registro OCRnx se actualiza desde el registro del búfer OCRnx (consulte la Figura 3 y la Figura 4).

La resolución PWM en este modo se puede configurar usando el registro ICRn u OCRnA. La resolución mínima es de 2 bits (ICRn u OCRnA = 0x0003) y la resolución máxima es de 16 bits (ICRn u OCRnA = 0xFFFF). La resolución PWM en bits se puede calcular mediante la siguiente expresión:

En el modo PWM FCC, el contador se incrementa hasta que coincida con el valor en ICRn (WGMn3:0 = 0b1000) o en OCRnA (WGMn3:0 = 0b1001). Esto significa llegar a la cima del conteo, después de lo cual la dirección del conteo cambia. El valor de TCNTn permanece en la parte superior del recuento durante un ciclo de reloj del temporizador. El diagrama de tiempos para el modo FCC PWM se muestra en la Figura 54. La figura muestra el modo FCC PWM cuando el registro OCRnA o ICRn establece la parte superior de conteo. El valor TCNTn se muestra como un gráfico de función para ilustrar el conteo bidireccional. El diagrama muestra salidas PWM inversoras y no inversoras. Las líneas horizontales cortas indican puntos en el gráfico TCNTn donde se produce una coincidencia entre OCRnx y TCNTn. El indicador de interrupción OCnx se establece después de que ocurre una coincidencia.

Figura 4 – Diagrama de tiempos del modo PWM con corrección de fase y frecuencia

El indicador de desbordamiento del contador del temporizador (TOVn) se establece en el mismo ciclo de reloj cuando los registros se actualizan con el valor del registro del búfer (en el límite de conteo inferior). Si se utiliza el registro OCRnA o ICRn para establecer el límite superior, cuando el contador alcanza el límite superior, se establece el indicador OCnA o ICFn, respectivamente. Los indicadores de interrupción se pueden utilizar para generar una interrupción cuando un contador alcanza un límite superior o inferior.

Al cambiar el límite superior, debe asegurarse de que el nuevo valor sea mayor o igual a los valores en todos los registros de umbral de comparación. De lo contrario, si el límite superior se establece en un valor menor que cualquiera de los valores en los registros de umbral de comparación, nunca se producirá una coincidencia entre TCNTn y OCRnx.

La Figura 4 muestra que, a diferencia del modo PWM FC, la señal de salida generada es simétrica en todos los períodos. Dado que los registros OCRnx se actualizan en el límite de conteo inferior, las duraciones de los conteos hacia adelante y hacia atrás son siempre iguales. Como resultado, los pulsos de salida tienen una forma simétrica y, por tanto, una frecuencia corregida.

Se recomienda utilizar el registro ICRn para establecer el límite superior si el valor del límite superior es una constante. En este caso, el registro OCRnA también queda libre para la modulación de ancho de pulso de los pulsos en el pin OCnA. Sin embargo, si necesita cambiar dinámicamente la frecuencia PWM cambiando el límite superior, se recomienda utilizar el registro OCRnA para establecer el límite superior debido a su doble almacenamiento en búfer.

En el modo PWM, las unidades de comparación le permiten generar pulsos PWM en el pin OCnx. Si COMnx1:0 = 0b10, entonces se configura una salida PWM no inversora, y si COMnx1:0=0b11, entonces una inversora (ver tabla 60). El valor OCnx solo estará presente en el pin del puerto correspondiente si está configurado en la dirección de salida. La señal PWM se genera configurando (restableciendo) el registro OCnx en una coincidencia entre OCRnx y TCNTn durante el recuento ascendente y restableciendo (configurando) el registro OCnx en una coincidencia entre OCRnx y TCNTn durante el recuento descendente. La frecuencia PWM en este modo con un límite superior (UP) dado de conteo se determina de la siguiente manera:

donde N es el factor de división del preescalador (1, 8, 32, 64, 128, 256 o 1024).

La escritura de valores límite en el registro OCRnx está asociada con casos especiales en la generación de señales PWM en este modo. Si configura OCRnx en el límite inferior (0x0000), en el modo no inversor la salida será constantemente baja nivel lógico, y al escribir un valor igual al límite superior, un nivel lógico alto estará presente en la salida durante mucho tiempo. En el modo inversor, los niveles dados serán opuestos.

Si se utiliza OCRnA para establecer el límite superior (WGMn3:0 = 0b1001) y COMnA1:0 = 0b01, entonces se generará una onda cuadrada en la salida de OCnA.

La implementación de hardware de PWM proporciona ventajas indudables sobre el software, ya que libera al procesador de código y tiempo innecesarios y engorrosos para su mantenimiento, y también brinda más oportunidades para utilizar el trabajo con PWM. Es suficiente inicializar el temporizador/contador (ingresar los valores necesarios en los registros utilizados por el temporizador/contador) y el temporizador/contador puede funcionar independientemente del procesador, en consecuencia, el procesador puede ocuparse de otras tareas, sólo a veces; contactando en el momento necesario para ajustar o cambiar el modo u obtener resultados del cronómetro/contador.

Descripción de indicadores de interrupción

T1 puede generar una interrupción cuando:

  1. desbordamiento del registro contador TCNT1;
  2. si el registro de conteo TCNT1 y el registro de comparación OCR1A y ​​OCR1B son iguales (por separado para cada registro);
  3. mientras se almacena el registro de conteo en el registro de captura ICR1.

T2 puede generar una interrupción cuando:

  1. desbordamiento del registro contador TCNT2;
  2. cuando el registro de conteo TCNT2 y el registro de comparación OCR2 son iguales.

Los indicadores de todas las interrupciones están en el registro TIFR y la activación/desactivación de interrupciones está en el registro TIMSK.

bits de registro TIMSK
Registro7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Indicador de habilitación de interrupción para el evento “coincidencia” del cronómetro/contador T2
  • TOIE2- Indicador de habilitación de interrupción de desbordamiento del temporizador/contador T2
  • TICIE1- Bandera de habilitación de interrupción para el evento de “captura” del temporizador/contador T1
  • OCIE1A- Bandera de habilitación de interrupción para el evento “partido A” del cronómetro/contador T1
  • OCIE1B- Bandera de habilitación de interrupción para el evento “partido B” del cronómetro/contador T1
  • TOIE1- Indicador de habilitación de interrupción de desbordamiento del temporizador/contador T1
  • OCIE0*- Indicador de habilitación de interrupción para el evento de "coincidencia" del temporizador/contador T0 (* - no disponible en ATmega8)
  • TOIE0- Indicador de habilitación de interrupción de desbordamiento del temporizador/contador T0
  • OCF2- Indicador de interrupción para el evento “coincidencia” del temporizador/contador T2
  • TOV2- Indicador de interrupción de desbordamiento del temporizador/contador T2
  • ICF1- Bandera de interrupción para el evento de “captura” del temporizador/contador T1
  • OCF1A- Flag de interrupción para el evento "coincidencia A" del cronómetro/contador T1
  • OCF1B- Flag de interrupción para el evento "coincidencia B" del cronómetro/contador T1
  • TOV1- Indicador de interrupción de desbordamiento del temporizador/contador T1
  • OCF0- Flag de interrupción para el evento “coincidencia” del temporizador/contador T0
  • TOV0- Indicador de interrupción de desbordamiento del temporizador/contador T0

Descripción del funcionamiento del temporizador/contador T1 en el controlador ATmega8/16

El temporizador/contador T1 de dieciséis bits se puede utilizar para generar intervalos de tiempo, contar el número de señales externas y generar señales PWM de diferentes ciclos de trabajo y duraciones en los pines OC1A y OC1B. Además, mediante una señal externa del pin ICP1 o de un comparador analógico, T1 puede guardar su estado actual en un registro de captura ICR1 separado.

Bits de registro TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Registro7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 CIEM1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/E R/E R/E R/E R/E R/E R/E R/E
TCNT1:L R/E R/E R/E R/E R/E R/E R/E R/E
OCR1A:H R/E R/E R/E R/E R/E R/E R/E R/E
OCR1A:L R/E R/E R/E R/E R/E R/E R/E R/E
OCR1B:H R/E R/E R/E R/E R/E R/E R/E R/E
OCR1B:L R/E R/E R/E R/E R/E R/E R/E R/E
ICR1:H R/E R/E R/E R/E R/E R/E R/E R/E
ICR1:L R/E R/E R/E R/E R/E R/E R/E R/E

Cada registro de 16 bits está ubicado físicamente en dos registros de 8 bits, por lo que al leer una entrada en ellos se deben realizar dos operaciones. Al escribir se carga primero el byte alto, luego el byte bajo; al contrario, se lee primero el byte bajo y luego el byte alto;

TCCR1A: TCCR1B- Registros de control de temporizador/contador de 8 bits T1

TCNT1- Registro temporizador/contador de 16 bits T1. Dependiendo del modo de funcionamiento, el contenido de este registro se borra, incrementa (el valor aumenta en 1) o disminuye (el valor disminuye en 1) para cada pulso de la señal del temporizador/contador.

OCR1A:OCR1B- Registros de comparación de 16 bits

ICR1- Registro de captura de 16 bits, almacena el valor de TCNT1 cuando se aplica un flanco de señal activo al pin ICP1 o mediante una señal del comparador.

Asignación de bits

COM1A1:COM1A0:COM1B1:COM1B0- Estos bits determinan el comportamiento del pin OC1A:OC1B cuando el valor del registro de conteo TCNT1 y el registro de comparación OCR1A:OCR1B coinciden.

FOC1A:FOC1B- Estos bits se utilizan para forzar un cambio en el estado del pin OC1A:OC1B

ICNC1- Bit de control del circuito de interferencia, si el bit es “0” la captura será en el primer flanco activo, si es “1” la captura será después de la cuarta muestra idéntica de la señal de captura.

CIEM1- Bit para seleccionar el flanco activo de la señal, si su valor es “0”, guardar el registro de conteo TCNT1 en el registro de captura OCR1 estará en el flanco descendente de la señal, si es “1” en el flanco ascendente.

WGM13:WGM12:WGM11:WGM10- Estos bits determinan el modo de funcionamiento del temporizador/contador T1.

CS22:CS21:C20- Bits que determinan la fuente de la señal del temporizador/contador T1.

Selección del modo de funcionamiento del temporizador/contador T1
WGM13WGM12WGM11WGM10Modo operativoMódulo de cuenta (ARRIBA)
0 0 0 0 Normal $FFFF
0 0 0 1 PWM de fase correcta

8 bits

$00FF
0 0 1 0 PWM de fase correcta

9 bits

$01FF
0 0 1 1 PWM de fase correcta

10 bits

$03FF
0 1 0 0 CTC (restablecer en el partido) OCR1A
0 1 0 1 PWM rápido

8 bits

$00FF
0 1 1 0 PWM rápido

9 bits

$01FF
0 1 1 1 PWM rápido

10 bits

$03FF
1 0 0 0 ICR1
1 0 0 1 PWM correcto de fase y frecuencia OCR1A
1 0 1 0 PWM de fase correcta ICR1
1 0 1 1 PWM de fase correcta OCR1A
1 1 0 0 CTC (restablecer en el partido) ICR1
1 1 0 1 Reservado *
1 1 1 0 PWM rápido ICR1
1 1 1 1 PWM rápido OCR1A

Seleccionar una fuente de reloj

Modo normal

El modo de funcionamiento más sencillo es T1. Para cada pulso de la señal de reloj, el registro de conteo TCNT1 se incrementa (el valor aumenta en 1). Al pasar por el valor $FFFF del módulo de conteo (TOP), se produce un desbordamiento y el siguiente ciclo de reloj comienza a contar desde el valor $0000, al mismo tiempo se establece el flag TOV1=1 en el registro TIFR y se puede producir una interrupción. se generará si el indicador TOIE1=1 está configurado en el registro TIMSK. Para generar una señal de una frecuencia determinada en este modo, es necesario escribir los bits COM1A1=0:COM1A0=1 para la salida OC1A o COM1B1=0:COM1B0=1 para la salida OC1B del controlador.

Además, para cada ciclo de reloj, se realiza una comparación entre el registro de conteo TCNT1 y el registro de comparación OCR1A:OCR1B, si hay una coincidencia, se establece el indicador de interrupción OCF1A=1:OCF1B=1 y si el bit OCIE1A=1 :OCIE1B=1 del registro TIMSK, se genera una interrupción. Al mismo tiempo, el estado del pin OC1A:OC1B se puede cambiar dependiendo de la configuración de los bits COM1A1:COM1A0:COM1B1:COM1B0.

Modo CTC (reinicio en el partido)

En este modo, T1 funciona según el mismo principio que en el modo Normal. La diferencia es que el valor máximo posible del registro de conteo TCNT1 está limitado por el valor del registro de comparación OCR1A o ICR1 (consulte la tabla de selección del modo temporizador/contador). Cuando TCNT1 alcanza el valor de OCR1A o ICR1, el valor de TCNT1 se restablece a TCNT1=$0000. Al mismo tiempo, se establece el indicador TOV1=1 COM1A1:COM1A0:COM1B1:COM1B0 Determina el comportamiento del pin OC1A:OC1B cuando. hay una coincidencia.

Modo PWM rápido (PWM rápido)

Con este modo, puede generar una señal PWM de alta frecuencia. El principio y procedimiento de funcionamiento no difiere del modo Normal, excepto por la presencia de doble buffer del registro OCR1A:OCR1B, que elimina la aparición de pulsos de señal asimétricos, y también difiere en el comportamiento de los pines OC1A:OC1B ( ver tabla).


Modo PWM de corrección de fase

La diferencia entre este modo y los anteriores es que el registro de conteo funciona como un contador inverso. Dado que Atmel recomienda este modo como el más adecuado para ajustar motores, lo consideraremos con más detalle. Cuando el registro de conteo TCNT1 alcanza el valor del módulo de conteo (TOP) (o el valor del registro ICR1 o el valor del registro OCR1A, consulte la tabla de selección del modo de temporizador/contador), la dirección de conteo cambia. Cuando el registro de conteo TCNT1 alcanza el valor mínimo ($0000), la dirección de conteo también cambia y al mismo tiempo se activa el indicador de interrupción TOV1 del registro TIFR. Además, si el contenido del registro de conteo TCNT1 y el registro de comparación OCR1A:OCR1B son iguales, se establece el indicador OCF1A:OCF1B del registro TIFR y el estado de la salida OC1A:OC1B cambia, según la tabla.

Para evitar emisiones asimétricas al escribir un valor en el registro OCR1A:OCR1B, en este modo se implementa un búfer de escritura doble. Gracias a esto, el cambio real en el valor del registro cambia en el momento en que el registro contador TCNT1 alcanza el valor del módulo de conteo (TOP) (o el valor del registro ICR1 o el valor del registro OCR1A, consulte la selección del modo temporizador/contador). mesa). Por lo tanto, al principio, cuando se inicializa el temporizador/contador, el pin OC1A:OC1B no cambiará su estado al coincidir hasta que el registro alcance el valor (TOP).

Tarea: Desarrollemos un programa para controlar el brillo de una lámpara incandescente de 12 voltios usando PWM. Cuando presiona el botón "Más", el brillo de la lámpara aumenta y cuando hace clic en el botón "Menos", el brillo disminuye. El diagrama de nuestro futuro dispositivo se muestra en la figura. Como es habitual, utilizamos el microcontrolador Atmega8, que será sincronizado desde un oscilador interno con una frecuencia de 4 MHz. En realidad, obtendremos un atenuador; estos dispositivos están diseñados para ajustar el brillo de los dispositivos de iluminación. Hoy en día, los atenuadores LED son los más extendidos.

Para simplificar, también puedes conectar un LED a nuestro circuito, pero quedará más claro con una bombilla. Los botones están conectados a pines. PD0, PD1. Conectamos la carga a la salida. PB1(OC1A) a través de una resistencia y un transistor de efecto de campo MOSFET, que nos funcionará como llave (en modo de conmutación). Es preferible un transistor de efecto de campo porque su puerta está aislada de circuito de potencia y el control se realiza mediante un campo eléctrico y la corriente de control alcanza los microamperios. Esto permite, utilizando uno o dos transistores, controlar una carga de enorme potencia (hasta decenas de amperios y decenas o cientos de voltios) sin cargar el microcontrolador. Teniendo en cuenta también el hecho de que los transistores de efecto de campo se pueden conectar en paralelo (a diferencia de los bipolares), es posible obtener una cascada aún más potente de cientos de amperios.

Ahora descubramos cómo el microcontrolador implementa PWM y escribamos un programa. Como mencionamos anteriormente, nuestro MK tiene 3 temporizadores y todos ellos pueden funcionar en modo PWM. Trabajaremos con un temporizador/contador de dieciséis bits. bits WGM13-10 configuremos nuestro temporizador para que funcione FastPWM con un límite de conteo superior ICR1. El principio del programa es este: nuestro temporizador cuenta de 0 a 65535(0xFFFF), en el registro ICR1 Ingresemos el número 255, este será el límite superior del conteo del temporizador (TOP), la frecuencia de la señal PWM será constante. Además, nuestro temporizador está configurado de modo que si el registro de conteo y el registro de comparación coinciden (TCNT1 = OCR1A), la salida del controlador cambiará OC1A. El ciclo de trabajo de PWM se puede cambiar escribiendo en el registro de comparación. OCR1A un cierto número de 0 a 255, cuanto mayor sea este número, mayor será el factor de llenado y más brillante brillará la lámpara. Dependiendo del botón que se presione, la variable cambia i, y luego se escribe en el registro OCR1A.

El texto completo del programa se presenta a continuación. Los comentarios describen el funcionamiento del programa con más detalle.

/***Lección nº 8. Generando señales PWM***/ #include #incluir int main(void) ( unsigned int i=0; //definir variable i /***Configurando puertos de E/S***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // El ciclo de trabajo de PWM cambia de 255 a 0 ( i--; // disminuye i en uno (también puedes escribir esto) OCR1A = i; // escribe una variable en el registro de comparación _delay_ms(30); // retraso 30 ms ) ) ) )

¡Atención! Primero, suministramos energía al microcontrolador, luego debemos asegurarnos de que el transistor esté conectado al pin MK y solo entonces suministramos energía al circuito con la lámpara y el transistor de efecto de campo. De lo contrario podrías quemar el transistor. El hecho es que cuando se apagan, las "patas" del MK "cuelgan en el aire", no están conectadas a nada y se producen interferencias en ellas. Estas débiles interferencias son suficientes para abrir parcialmente un transistor de efecto de campo muy sensible. Luego, su resistencia entre el drenaje y la fuente caerá de varios MOhms a varios Ohms o fracciones de Ohms y una gran corriente fluirá a través de él hasta la lámpara. Pero el transistor no se abrirá por completo, porque para ello no es necesario aplicar una interferencia de 1-3 V a la puerta, sino 5 V estables, y su resistencia será mucho mayor que el mínimo. Esto provocará la liberación de una gran cantidad de calor, humeará y posiblemente se quemará.

PWM o PWM (modulación por ancho de pulso, en inglés) es una forma de controlar el suministro de energía a la carga. El control consiste en cambiar la duración del pulso a una frecuencia de repetición de pulso constante. La modulación por ancho de pulso puede ser analógica, digital, binaria o ternaria.

El uso de la modulación de ancho de pulso permite aumentar la eficiencia de los convertidores eléctricos, especialmente los convertidores de pulsos, que hoy forman la base de las fuentes de alimentación secundarias para diversos dispositivos electrónicos. Los convertidores de pulso de retorno y avance de ciclo único, push-pull y medio puente, así como los de puente, se controlan hoy con la participación de PWM, esto también se aplica a los convertidores resonantes.

La modulación de ancho de pulso le permite ajustar el brillo de la luz de fondo de las pantallas de cristal líquido de teléfonos celulares, teléfonos inteligentes y computadoras portátiles. PWM se implementa en inversores de automóviles, cargadores, etc. Cualquier cargador hoy en día utiliza PWM en su funcionamiento.

Los transistores bipolares y de efecto de campo que funcionan en modo de conmutación se utilizan como elementos de conmutación en los convertidores de alta frecuencia modernos. Esto significa que parte del período el transistor está completamente abierto y parte del período está completamente cerrado.

Y como en estados transitorios que duran sólo decenas de nanosegundos la potencia liberada en el interruptor es pequeña en comparación con la potencia conmutada, la potencia media liberada en forma de calor en el interruptor resulta finalmente insignificante. En este caso, en el estado cerrado, la resistencia del transistor como interruptor es muy pequeña y la caída de voltaje a través de él se acerca a cero.

En estado abierto, la conductividad del transistor es cercana a cero y prácticamente no fluye corriente a través de él. Esto permite crear convertidores compactos con alta eficiencia, es decir, con bajas pérdidas térmicas. Y los convertidores resonantes con conmutación a corriente cero ZCS (conmutación de corriente cero) permiten reducir estas pérdidas al mínimo.


En los generadores PWM de tipo analógico, la señal de control es generada por un comparador analógico cuando, por ejemplo, se suministra una señal triangular o en diente de sierra a la entrada inversora del comparador y una señal continua moduladora a la entrada no inversora.

Se obtienen los pulsos de salida, su frecuencia de repetición es igual a la frecuencia de la sierra (o señal triangular), y la duración de la parte positiva del pulso está asociada con el tiempo durante el cual el nivel de la señal constante moduladora suministrada al La entrada no inversora del comparador es mayor que el nivel de la señal de la sierra, que se suministra a la entrada inversora. Cuando el voltaje de la sierra es mayor que la señal moduladora, la salida tendrá una parte negativa del pulso.

Si la sierra se alimenta a la entrada no inversora del comparador y la señal moduladora se suministra a la entrada inversora, entonces los pulsos rectangulares de salida tendrán un valor positivo cuando el voltaje de la sierra sea mayor que el valor de la señal moduladora suministrada. a la entrada inversora, y negativo cuando el voltaje de la sierra es menor que la señal moduladora. Un ejemplo de generación PWM analógica es el microcircuito TL494, que se utiliza ampliamente en la actualidad en la construcción de fuentes de alimentación conmutadas.


El PWM digital se utiliza en tecnología digital binaria. Los pulsos de salida también toman solo uno de dos valores (encendido o apagado) y el nivel de salida promedio se acerca al nivel deseado. Aquí la señal en diente de sierra se obtiene utilizando un contador de N bits.

Los dispositivos digitales con PWM también funcionan a una frecuencia constante, que necesariamente excede el tiempo de respuesta del dispositivo controlado; este enfoque se llama sobremuestreo. Entre los flancos del reloj, la salida PWM digital permanece estable, ya sea alta o baja, dependiendo del estado actual de la salida del comparador digital, que compara los niveles de señal en el contador y el digital aproximado.

La salida se sincroniza como una secuencia de pulsos con los estados 1 y 0; cada estado del reloj puede cambiar o no al opuesto. La frecuencia de los pulsos es proporcional al nivel de la señal que se aproxima, y ​​las unidades que se suceden pueden formar un pulso más amplio y más largo.

Los pulsos resultantes de ancho variable serán un múltiplo del período del reloj y la frecuencia será igual a 1/2NT, donde T es el período del reloj, N es el número de ciclos del reloj. Aquí se puede lograr una frecuencia más baja en relación con la frecuencia del reloj. El circuito de generación digital descrito es una modulación PCM codificada por impulsos, PWM, de un bit o de dos niveles.

Esta modulación codificada por pulsos de dos niveles es esencialmente una serie de pulsos con una frecuencia de 1/T y un ancho de T o 0. El sobremuestreo se utiliza para promediar durante un período de tiempo mayor. Se puede lograr una PWM de alta calidad utilizando modulación de densidad de pulso de un bit, también llamada modulación de frecuencia de pulso.

Con la modulación digital por ancho de pulso, los subpulsos rectangulares que llenan un período pueden caer en cualquier lugar del período, y entonces solo su número afecta el valor promedio de la señal durante el período. Entonces, si divide el período en 8 partes, las combinaciones de pulsos 11001100, 11110000, 11000101, 10101010, etc. darán el mismo valor promedio para el período; sin embargo, las unidades separadas hacen que el modo de funcionamiento del transistor clave sea más pesado.

Las luminarias de la electrónica, hablando de PWM, dan la siguiente analogía con la mecánica. Si utiliza un motor para hacer girar un volante pesado, dado que el motor se puede encender o apagar, el volante girará y continuará girando, o se detendrá debido a la fricción cuando se apague el motor.

Pero si el motor se enciende durante unos segundos por minuto, entonces la rotación del volante se mantendrá, por inercia, a una determinada velocidad. Y cuanto más tiempo esté encendido el motor, mayor será la velocidad a la que girará el volante. Lo mismo ocurre con PWM, la señal de encendido y apagado (0 y 1) llega a la salida y, como resultado, se logra el valor promedio. Al integrar el voltaje del pulso en el tiempo, obtenemos el área bajo los pulsos, y el efecto en el cuerpo de trabajo será idéntico al trabajo con un valor de voltaje promedio.

Así funcionan los convertidores, donde las conmutaciones se producen miles de veces por segundo y las frecuencias alcanzan varios megahercios. Los controladores PWM especiales se utilizan ampliamente para controlar balastos de lámparas de bajo consumo, fuentes de alimentación, etc.


La relación entre la duración total del período del pulso y el tiempo de encendido (la parte positiva del pulso) se denomina ciclo de trabajo del pulso. Entonces, si el tiempo de encendido es de 10 μs y el período dura 100 μs, entonces a una frecuencia de 10 kHz el ciclo de trabajo será igual a 10 y escriben que S = 10. El ciclo de trabajo inverso se llama el ciclo de trabajo por pulsos, en inglés Duty Cycle, o abreviado como DC.

Entonces, para el ejemplo dado, DC = 0,1, ya que 10/100 = 0,1. Con la modulación de ancho de pulso, al ajustar el ciclo de trabajo del pulso, es decir, al variar la CC, se logra el valor promedio requerido en la salida de un dispositivo electrónico u otro dispositivo eléctrico, como un motor.



gastrogurú 2017