Menú
gratis
Registro
Hogar  /  Navegantes/ SoftwarePWM (PWM). Software multicanal PWM en AVR Software PWM con ajuste avr

SoftwarePWM (PWM). Software multicanal PWM en AVR Software PWM con ajuste avr

Temporizadores PWM (Conferencia)

Obviamente, necesitamos algún tipo de contador externo que funcione independientemente del funcionamiento del procesador, y que el procesador pueda ver en cualquier momento lo que está funcionando en él. O para que el contador genere eventos de desbordamiento o desbordamiento insuficiente: levante la bandera o genere una interrupción. Y el procesador lo verá y lo procesará. Y no existe tal contador, ni siquiera uno: estos son temporizadores periféricos. Un AVR puede tener varios de ellos con diferentes profundidades de bits. ATmega16 tiene tres, ATmega128 tiene cuatro. Además, un temporizador puede ser más que un simple contador; un temporizador es uno de los dispositivos periféricos más multifuncionales (en términos de funciones alternativas).

¿Qué pueden hacer los temporizadores?

· Funciona desde cuarzo externo a 32768 Hz.

· Genera varios tipos de señal PWM.

· Emitir interrupciones (media docena de eventos diferentes) y establecer banderas

Fuente de tic del temporizador

El temporizador/contador (en adelante denominado TC) cuenta los pulsos de reloj del generador de reloj incorporado o de la entrada de conteo. Con la configuración adecuada, el vehículo contará el borde anterior (borde de 0-1) o el borde posterior (borde de 1-0) de los pulsos que llegan a las entradas. Lo principal es que la frecuencia de los pulsos entrantes no exceda la frecuencia de reloj del procesador, de lo contrario no tendrá tiempo de procesar los pulsos.

Además, algunos temporizadores son capaces de funcionar en modo asíncrono. Es decir, el TS no cuenta los pulsos de reloj del procesador, sino los pulsos de su propio generador, alimentado por un cuarzo separado. Para ello, el vehículo dispone de entradas separadas en las que se puede conectar un resonador de cuarzo. ¿Por qué es esto necesario? Al menos para organizar un reloj en tiempo real. Les colgué un reloj de cuarzo a 32768 Hz y puedes medir el tiempo: se producirán 128 desbordamientos por segundo (si el vehículo es de ocho bits). Entonces un desbordamiento es 1/128 de segundo. Además, el temporizador no se detiene mientras se procesa la interrupción de desbordamiento; también continúa contando;

Predivisor

Si el temporizador cuenta los impulsos de un generador de reloj o de su interno, aún pueden pasar a través de un preescalador. Es decir, incluso antes de ingresar al registro de conteo, se dividirá la frecuencia del pulso. Puedes dividir por 8, 32, 64, 128, 256, 1024. Entonces, si cuelgas un reloj de cuarzo en el vehículo y lo pasas por el preescalador por 128, el cronómetro contará a una velocidad de una vez por segundo. También es conveniente usar un preescalador cuando solo necesita obtener un intervalo grande, y la única fuente de conteo es el generador de reloj del procesador, y contar estos megahercios es difícil, pero si lo pasa por un preescalador, entonces todo es más fácil. . Sin embargo, si ejecuta un TS con un preescalador, el primer tick no necesariamente llegará al registro de conteo después del número requerido de pulsos.

Depende del estado en el que se encontraba el preescalador, ¿y si al momento de encenderlo ya hubiera contado casi hasta valor establecido? Esto significa que habrá un tic inmediatamente. El preescalador funciona todo el tiempo, independientemente de si el temporizador está encendido o no. Por lo tanto, los preescaladores pueden y deben restablecerse. También es necesario tener en cuenta que el preescalador es el mismo para todos los contadores, por lo que al restablecerlo es necesario tener en cuenta el hecho de que otro temporizador tendrá un retraso hasta el siguiente tic.

Por ejemplo, el primer temporizador funciona en el pin 1:64 y el segundo en el pin 1:1024 del preescalador. El segundo casi alcanzó 1024 en el preescalador y ahora debería haber un tic del temporizador, pero luego reiniciaste el preescalador para iniciar el primer temporizador exactamente desde cero. ¿Qué pasará? Para el segundo, el divisor se restablecerá inmediatamente a 0 (el preescalador es el mismo, tiene un registro) y el segundo temporizador tendrá que esperar otros 1024 ciclos de reloj para recibir un impulso. Y si reinicia el preescalador en el bucle, en beneficio del primer temporizador, más de una vez cada 1024 ciclos de reloj, el segundo temporizador nunca funcionará. Para restablecer los preescaladores, simplemente escriba el bit PSR10 en el registro SFIOR. El bit PSR10 se restablecerá automáticamente en el siguiente ciclo de reloj.

registro de cuenta

El conteo completo se acumula en el registro de conteo TCNTx, donde x es el número del temporizador. Puede ser de 8 o 16 bits, en cuyo caso consta de dos registros TCNTxH y TCNTxL: los bytes alto y bajo, respectivamente.

Y aquí hay un problema. Y el punto es que el temporizador cuenta independientemente del procesador, por lo que podemos poner un byte primero, comenzará a contar, luego el segundo, y el recálculo comenzará teniendo en cuenta el segundo byte. El temporizador es un dispositivo preciso, por lo que sus registros de conteo deben cargarse al mismo tiempo. ¿Pero cómo? Y los ingenieros de Atmel resolvieron el problema de forma sencilla: la escritura en el registro alto (TCNTxH) se realiza primero en el registro TEMP. Este registro es puramente oficial y de ningún modo es accesible para nosotros.

¿Cuál es el resultado? Escribimos el byte alto en el registro TEMP (para nosotros sigue siendo TCNTxH) y luego escribimos el byte bajo. En este momento se introduce el valor previamente registrado en el TCNTxH real. Es decir, ¡dos bytes, alto y bajo, se escriben simultáneamente! ¡No puedes cambiar el orden! Se parece a esto:

¿Por qué desactivar las interrupciones? Sí, para que después de escribir el primer byte, el programa no salga accidentalmente sin interrupción.

Todo se lee de la misma forma, sólo que en orden inverso. Primero el byte bajo (con el byte alto en TEMP), luego el byte alto. Esto asegura que estamos contando exactamente el byte que estaba en en este momento en el registro contable.

Registros de control

La función principal del temporizador es contar. El registro principal es TCCRx. Para TC0 este es TCCR0, para otros temporizadores TCCR norte respectivamente. Los primeros 3 bits de este registro: CSx2..CSx0 son responsables de configurar el preescalador y la fuente de la señal del reloj en lugar de x, se sustituye el número del temporizador; Los diferentes temporizadores son ligeramente diferentes, por lo que describiremos los bits CS02...CS00 solo para el temporizador0.

· 000 - temporizador detenido

· 001: el preescalador es igual a 1, es decir, apagado. El temporizador cuenta los pulsos del reloj.

· 010 - el preescalador es 8, la frecuencia del reloj se divide por 8

· 011 - el preescalador es 64, la frecuencia del reloj se divide por 64

· 100 - el preescalador es 256, la frecuencia del reloj se divide por 256

· 101 - el preescalador es 1024, la frecuencia del reloj se divide por 1024

· 110 - los pulsos de reloj provienen del pin T0 en la transición de 1 a 0

· 111 - los pulsos de reloj provienen del pin T0 en la transición de 0 a 1

Interrumpe

Cada evento de hardware tiene una interrupción y el temporizador no es una excepción. Tan pronto como ocurre un desbordamiento u otro evento, se genera inmediatamente una interrupción. Los registros TIMSK y TIFR son responsables de las interrupciones de los temporizadores. Y los AVR potentes, como ATMega128, también tienen ETIFR y ETIMSK, una especie de continuación, ya que TIMSK tiene más temporizadores que un registro de máscara. Es decir, los bits que contiene permiten interrupciones localmente. Si el bit está establecido, la interrupción específica está habilitada. Si el bit es cero, entonces esta interrupción no se procesa. Por defecto, todos los bits son cero. Los siguientes bits son responsables de la interrupción por desbordamiento:

· TOIE: permiso para interrumpir el desbordamiento del temporizador 0

· TOIE1: permiso para interrumpir el desbordamiento del temporizador 1

· TOIE2: permiso para interrumpir el desbordamiento del temporizador 2

El registro TIFR es directamente un registro de bandera. Cuando se activa una interrupción, se activa el indicador de interrupción. Este indicador se restablece mediante hardware cuando el programa abandona el vector. Si las interrupciones están deshabilitadas, entonces la bandera permanecerá allí hasta que se habiliten las interrupciones y el programa pase a la interrupción. Para evitar que esto suceda, la bandera se puede restablecer manualmente. Para hacer esto, ¡debes escribir 1 en TIFR!

Más sobre el temporizador A tMEGA128se discutirá más adelante.

Modulación de ancho de pulso

Modulación de ancho de pulso ( PWM - Modulación de ancho de pulso) esta es la manera de hacerlo señal analógica método digital , es decir, a partir de una salida digital que sólo proporciona ceros y unos, se pueden obtener algunos valores que cambian suavemente. Y el punto es:

Imagine un volante pesado que puede girar con un motor. Además, puedes encender o apagar el motor. Si lo enciendes constantemente, el volante girará hasta su valor máximo y seguirá girando. Si lo apagas, se detendrá debido a las fuerzas de fricción. Pero si el motor se enciende durante diez segundos cada minuto, el volante girará, pero no a toda velocidad: la alta inercia suavizará las sacudidas del motor al encenderse y la resistencia de fricción no permitirá que gire indefinidamente. Cuanto más Duración ON Cuanto mayor sea el motor por minuto, más rápido girará el volante.

En PWM enviamos una señal a la salida que consta de niveles alto y bajo (aplicable a nuestra analogía: encendemos y apagamos el motor), es decir, ceros y unos. Y luego todo esto pasa a través de una cadena integradora (por analogía, un volante). Como resultado de la integración, la salida tendrá un valor de voltaje igual al área bajo los pulsos.Cambio ciclo de trabajo(la relación entre la duración del período y la duración del pulso) puede cambiar suavemente esta área y, por lo tanto, el voltaje de salida. Por lo tanto, si la salida es 1 sólido, entonces la salida será un voltaje de alto nivel (por ejemplo, 12 voltios), si es cero, entonces cero. Y si el 50% de las veces hay alto nivel, y el 50% bajo es de 6 voltios. La cadena integradora aquí será la masa del inducido del motor, que tiene una inercia bastante grande.

¿Qué pasa si tomas y das? PWM- la señal no es de cero a máximo, sino de menos a más. Digamos de +12 a -12. ¡Y puedes configurar una señal variable! Cuando hay cero en la entrada, entonces la salida es -12V, cuando hay uno, entonces +12V. Si el ciclo de trabajo es del 50%, entonces la salida es 0V. Si el ciclo de trabajo se cambia según una ley sinusoidal de máximo a mínimo, obtenemos una tensión alterna. Y si toma tres de estos generadores PWM y conduce sinusoides a través de ellos, desplazados 120 grados entre sí, obtendrá el voltaje trifásico más común, lo que significa hola. Motores asíncronos y síncronos sin escobillas. . Todos los accionamientos industriales modernos se basan en este principio. C.A.. Una cadena RC se puede utilizar como circuito integrador de suavizado en PWM:

Implementación de hardware de PWM

En caso ATMega La forma más sencilla de hacerlo es con su generador PWM, que está integrado en los temporizadores. Además, el primer temporizador tiene dos canales. Entonces ATmega puede implementar cuatro canales simultáneamente PWM.

El temporizador tiene un registro de comparación especial. LOC. Cuando el valor en el registro del contador del temporizador alcanza el valor en el registro de comparación, pueden ocurrir los siguientes eventos de hardware:

· Interrumpir por coincidencia

· Cambiar el estado de la salida de comparación externa JEFE..

Las salidas de comparación se dirigen hacia el exterior, a los pines del microcontrolador. Supongamos que PWM- el generador está configurado así , que cuando el valor en el registro de conteo es mayor, que en el registro de comparación, entonces la salida es 1, y cuando es menor, entonces 0. ¿Qué pasará? El temporizador contará como debe, desde cero hasta 256 con una frecuencia, el cual configuraremos con los bits del preescalador del temporizador. Después del desbordamiento, se restablece a 0 y continúa contando nuevamente.

Aparecen pulsos en la salida. Si aumenta el valor en el registro de comparación, el ancho del pulso se hará más estrecho. Es decir, cambiar el valor en el registro de comparación., puedes cambiar el ciclo de trabajo PWM- señal. Y si pasas esta señal PWM a través de una cadena RC suavizante (integrador), entonces obtenemos una señal analógica.

Un temporizador puede tener cualquier número de registros de comparación. Depende del modelo MK y del tipo de temporizador. Los nuevos AVR también tienen tres registros de comparación por temporizador, lo que permite que un MK organice muchos canales PWM independientes. Hay varios modos PWM en sí:

BsLínea PWM (PWM rápido)

En este modo el contador cuenta de cero a 255 , una vez alcanzado el desbordamiento, se pone a cero y el conteo comienza de nuevo. Cuando el valor en el contador alcanza el valor del registro de comparación, la salida correspondiente OSxx se pone a cero. Cuando se reinicia el contador, este pin se establece en 1.

La frecuencia de la señal PWM resultante se determina de forma sencilla: la frecuencia del procesador es, por ejemplo, de 8 MHz, el temporizador marca 256 con una frecuencia de reloj. Esto significa que un período de PWM será igual a 8000.000/256 = 31250 Hz. No será más rápido: esta es la velocidad máxima en el interior. 8MHz generador de reloj. Todavía es posible aumentar la resolución haciendo el conteo de 8, 9, 10 bits (si la profundidad de bits del temporizador lo permite), pero debemos tener en cuenta que aumentar la profundidad de bits, junto con aumentar la discreción de la salida analógica señal, reduce drásticamente la frecuencia PWM.

PWM con corrección de fase (Phase Correct PWM)

PWM con fase precisa. Funciona de manera similar, pero aquí el contador cuenta de manera un poco diferente. Primero de 0 a 255, luego de 255 a 0. El pin OCxx se reinicia en la primera coincidencia y se configura en la segunda. Pero la frecuencia PWM al mismo tiempo se reduce a la mitad debido al plazo más largo. Su objetivo principal es generar señales PWM multifásicas, por ejemplo, una onda sinusoidal trifásica. Aquellos. coincidirán los centros de los pulsos en diferentes canales y en diferentes ciclos de trabajo.


Arroz. Modos PWM rápido y PWM con corrección de fase

Para evitar pulsos innecesarios, cualquier valor ingresa al registro de comparación a través de un registro de búfer y se ingresa solo cuando el valor en el contador alcanza su máximo. Aquellos. al comienzo de un nuevo período PWM impulso.

ReiniciarPorcoincidencia(Borrar temporizador al comparar)

Restablecer al comparar. Lo más probable es que se trate de PFM, una señal simulada de frecuencia de pulso. Funciona un poco diferente aquí que en otros modos. ¡Aquí el cronómetro de conteo no va de 0 al límite, sino de 0 al registro de comparación! Y luego se reinicia.

Como resultado, los pulsos de salida tienen siempre el mismo ciclo de trabajo, pero de diferentes frecuencias. Y la mayoría de las veces, este modo se usa cuando es necesario contar períodos con un temporizador (y generar una interrupción) con una precisión determinada.


Por ejemplo, necesitamos una interrupción cada milisegundo. Y sin duda. ¿Cómo se puede hacer esto más fácilmente? ¡A través del modo STS! Sea la frecuencia 8 MHz. El preescalador será igual a 64, por lo que la frecuencia de conteo del temporizador será 125000 Hz. Y necesitamos una interrupción con una frecuencia de 1000Hz. Por lo tanto, configuramos una interrupción para que coincida con el número 125. Cuando el conteo llega a 125, se activa la interrupción y el contador se reinicia a cero. Llegó a 125: se produjo una interrupción, se restableció a cero.

Contador temporizador 0 de 8 bits con PWM y funciones de sincronización asíncrona

Timer-counter 0 es un módulo temporizador-contador multifuncional de un solo canal de 8 bits con una salida de hardware para generar una señal PWM y un generador de reloj opcional asíncrono incorporado, que está optimizado para el uso de reloj de cuarzo (32768 Hz) para Cronometraje asíncrono con respecto a la sincronización del sistema.




Registros

Registro de contador de temporizador (TCNT0) y registro de comparación de umbral (OCR0): 8 bits. registros. Las señales de solicitud de interrupción se representan como indicadores de interrupción del temporizador en el registro TIFR. Todas las interrupciones se enmascaran individualmente utilizando el Registro de máscara de interrupción de temporizadores (TIMSK). El temporizador-contador se puede sincronizar internamente a través del preescalador o de forma asíncrona a través de los pines TOSC1/2 externos. La operación asincrónica está controlada por el registro ASSR. El bloque de reloj selecciona qué fuente de reloj se utiliza. Si no se especifica la fuente del reloj, el contador del temporizador está en un estado inactivo. La salida clkT0 es la salida de la lógica de selección de temporización.El valor del registro de umbral de comparación de doble búfer (OCR0) se compara continuamente con el valor del contador del temporizador. El resultado de la comparación se puede utilizar para generar señales de onda cuadrada de frecuencia variable o PWM en el pin OC0. Si el umbral de comparación coincide con el valor del contador del temporizador, se establece el indicador de resultado de la comparación (OCF0), que se puede utilizar para generar una solicitud de interrupción basada en el resultado de la comparación.

NP (límite inferior)

El contador llega a cero (0x00)

MÁX (valor máximo)

El contador alcanza un valor máximo de 0xFF (255 decimal)

VP (límite superior)

El contador alcanza el límite superior de conteo (count top). La parte superior del recuento puede ser el valor fijo 0xFF o el contenido del registro OCR0.

Fuentes de reloj temporizador-contador 0

TC0 puede sincronizarse internamente de forma síncrona o externamente de forma asíncrona (con respecto al reloj interno del sistema). El valor predeterminado es clkT0, que equivale a clkI/O. Si se escribe “1” en el bit AS0 del registro ASSR, entonces el generador en los pines TOSC1 y TOSC2 actúa como fuente.

Bloque de contador

La base de TC0 es un contador bidireccional programable.


Descripción de señales (señales internas):

Recuento: aumenta o disminuye TCNT0 en 1.

Dirección: establece la dirección de conteo: (+1, conteo hacia adelante) o (-1, conteo hacia atrás).

Restablecer: restablece el contenido de TCNT0 (escribiendo 0 en todos los bits).

clkT0 - Sincronización temporizador-contador.

Límite superior: establece el valor máximo en TCNT0.

Límite inferior: establece el valor mínimo en TCNT0 (0) .

Dependiendo del modo de funcionamiento seleccionado, el contador se reinicia, aumenta o disminuye en cada ciclo de reloj clkT0. La señal de reloj clkT0 puede ser interna o externa y su frecuencia se selecciona mediante los bits CS02-CS00. Si no se especifica la fuente de sincronización (CS02-CS00=0b000), el temporizador se detiene. El estado TCNT0 está disponible para la CPU independientemente del tiempo.La secuencia de conteo se determina configurando los bits WGM01 y WGM00 del registro TCCR0. Existe una relación precisa entre el comportamiento del contador y la forma de onda generada en la salida OC0. El indicador de desbordamiento de TC (TOV0) se establece de acuerdo con el modo de funcionamiento, que se selecciona mediante los bits WGM01, WGM00. El bit TOV0 se puede utilizar para generar una interrupción de la CPU.

bloque de comparación

El comparador digital de 8 bits compara continuamente el contenido del registro contador temporizador TCNT0 con el registro de umbral de comparación OCR0. Siempre que el valor de TCNT0 coincida con el valor de OCR0, el comparador establece el indicador de coincidencia OCF0 en el siguiente tic del reloj del temporizador. Si la interrupción está habilitada con el bit OCIE0=1, entonces establecer el indicador de coincidencia provoca una solicitud de interrupción. El indicador OCF0 se borra automáticamente durante el procesamiento de la interrupción. El generador de señales utiliza la señal del resultado de la comparación para generar pulsos rectangulares de acuerdo con uno de los algoritmos, que se selecciona mediante los bits de configuración del modo de funcionamiento del temporizador WGM01, WGM00 y los bits de configuración del modo de generación de señal de salida (COM01, COM00). Los límites de recuento superior e inferior se utilizan en algunos modos operativos para realizar acciones especiales.

El registro OCR0 se implementa mediante un esquema de doble almacenamiento en búfer cuando se utilizan modos de modulación de ancho de pulso (PWM). En los modos normal y CTC, el circuito de doble buffer está desactivado. El almacenamiento en búfer doble le permite sincronizar la actualización del registro de comparación OCR0 cuando se alcanza el límite de conteo superior o inferior. Esta sincronización evita la posibilidad de generar pulsos PWM desequilibrados de longitudes impares, asegurando así que la generación de ondas cuadradas no falle.Acceder al registro OCR0 puede parecer complicado, pero se hace por una razón. Una vez que se habilita el doble búfer, la CPU accede al registro de búfer OCR0 y, cuando está deshabilitado, accede directamente al registro OCR0.

Forzar resultado de comparación

En los modos de generación de impulsos sin PWM en el modelador de impulsos, el resultado de la comparación se puede configurar directamente a través del bit FOC0. Forzar el resultado de la comparación del comparador no activa el indicador OCF0 ni restablece/restablece el temporizador, pero sí afecta el estado del pin OC0, que se activará, borrará o alternará (invertirá) dependiendo de la configuración seleccionada de COM01, COM00. bits. Esta función Permite que OCR0 se establezca en el mismo valor que TCNT0 sin generar una solicitud de interrupción si el reloj del contador está habilitado.

Usando un bloque de comparación

Dado que escribir en TCNT0 bloquea cualquier acción basada en el resultado de la comparación para un ciclo de sincronización del temporizador, independientemente del modo de funcionamiento, al cambiar TCNT0 cuando se usa el canal de comparación (ya sea que la sincronización del temporizador funcione o no), se deben tener en cuenta las siguientes características. Si se escribe un valor igual a OCR0 en el registro TCNT0, ignorar la coincidencia dará como resultado la generación de una forma de onda incorrecta. Por analogía, debe evitar escribir un valor igual al límite inferior (0x00) en TCNT0 si el contador funciona como un contador sustractivo. La configuración de OC0 debe realizarse antes de configurar la línea de E/S para que salga en el registro de dirección.

Bloque de generación de señal de salida

Los bits de configuración del modo de generación de señal de salida (COM01:0) tienen un doble propósito. Por un lado, los bits COM01, COM00 son utilizados por el acondicionador de señal y determinan qué estado lógico debe estar en la salida OC0 cuando ocurre la siguiente coincidencia. Por otro lado, los bits COM01, COM00 se utilizan para habilitar/deshabilitar función alternativa salida del puerto OC0. La figura muestra una versión simplificada. circuito lógico, que se ve afectado por los bits COM01, COM00. PAG Sólo se proporcionan aquellos registros de control de puertos de E/S (DDR y PORT) que se ven afectados por los bits COM01, COM00.


La función de línea del puerto de E/S universal se reemplaza por la función de salida del acondicionador de señal OC0 si al menos uno de los bits COM01, COM00 es igual a 1. Sin embargo, el control de la dirección de salida de OC0 (entrada o salida) en este caso permanece con el bit correspondiente del registro de dirección de datos del puerto B (DDRB.4). Para que el valor del registro OC0 esté presente en el pin OC0, debe configurar esta linea a la salida (establezca DDRB.4 bit). El control de entrada de función alternativa es independiente del modo de generación de señal.

Modos de funcionamiento del contador-cronómetro 0

Modo de funcionamiento del temporizador, incl. El comportamiento del temporizador-contador y la salida del acondicionador de señal asociado se establece mediante una combinación de bits que especifican el modo de funcionamiento del temporizador (WGM01, WGM00) y el modo de generación de señal de salida (COM01, COM00). 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 de configuración del modo de temporizador. En modos con PWM, los bits COM01, COM00 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 COM01:0 determinan qué acción se debe tomar cuando se cumple la condición de comparación: restablecer, configurar o invertir la salida.

Los modos de funcionamiento del temporizador se describieron anteriormente (normal (conteo), reinicio coincidente, PWM rápido y PWM con corrección de fase).

Funcionamiento asíncrono del temporizador-contador 0

Si el temporizador-contador 0 funciona de forma asíncrona, entonces es necesario tener en cuenta algunas características. Al cambiar entre fuentes de reloj temporizador-contador asíncrono y síncrono, el contenido de los registros TCNT0, OCR0 y TCCR0 puede dañarse. Para evitar esto, se debe seguir la siguiente secuencia de conmutación segura:

1. Deshabilite las interrupciones del temporizador-contador 0 borrando los bits OCIE0 y TOIE0.

2. Seleccione la fuente de reloj requerida usando el bit AS0

3. Escriba nuevos valores en TCNT0, OCR0 y TCCR0.

4. cuando va a modo asíncrono espere hasta que se restablezcan los indicadores TCN0UB, OCR0UB y TCR0UB.

5. Restablecer temporizador-contador 0 indicadores de interrupción

6. Habilite las interrupciones si es necesario

El generador está optimizado para el uso de un resonador de cuarzo de reloj a una frecuencia de 32768 Hz. La frecuencia del reloj de la CPU debe ser al menos cuatro veces mayor que la frecuencia del generador. La escritura en TCNT0, OCR0 o TCCR0 se produce a través de dos flancos positivos de TOSC1, porque Los datos primero se colocan en un registro temporal y luego se transmiten a su destino. Cada uno de los tres registros mencionados tiene sus propios registros temporales individuales. Esto significa que, por ejemplo, escribir en TCNT0 no afecta el proceso de escritura en el registro OCR0. Para determinar en qué registro se escribió, se implementa un registro de estado asíncrono, ASSR.

Si se selecciona el funcionamiento asíncrono, entonces el generador a 32768 Hz está constantemente encendido, con excepción del modo de apagado y el modo de espera del MK.

Temporizador-Contador Preescalador 0


La fuente de reloj TC0 se denomina clkT0. De forma predeterminada, clkT0 está conectado a clkI/O. Si el bit AS0=1 en el registro ASSR, entonces TC0 se sincroniza de forma asincrónica desde el pin TOSC1. De esta manera puede utilizar TC0 como reloj de tiempo real (RTC). Si AS=1, entonces los pines TOSC1 y TOSC2 no realizan las funciones del puerto C y se puede conectar un resonador de cuarzo entre ellos como una fuente de reloj separada. No se recomienda conectar una fuente de reloj externa al pin TOSC1.El preescalador le permite seleccionar las siguientes señales de reloj: clkT0S/8, clkT0S/32, clkT0S/64, clkT0S/128, clkT0S/256 y clkT0S/1024. Es posible detener la sincronización. Si PSR0=1 en el registro SFIOR, reinicia el preescalador.

Para obtener una descripción de los registros 0 del contador temporizador de 8 bits, consulte la especificación.

Fig.1

T = T0+T1. Periodo de pulso

T = 1/F

S = T/T1

ciclo de trabajo

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

Dispositivos digitales, por ejemplo, un microcontrolador sólo puede 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 deseas controlar el brillo de un LED (o lámpara) o la velocidad de un motor corriente continua, Eso 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 ello, en lugar de crear voltaje CC La salida de CC generaremos una onda cuadrada que tiene niveles alto = 5 V y bajo = 0 V (ver Figura 1).

Fig.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 factor de trabajo D es el recíproco del ciclo de trabajo.

factor de relleno 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”) .

funcionamiento 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 utilizar 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 de conteo superior cerca del valor del límite de conteo inferior cuando el contador funciona sin preescalador o con un valor de preescalador 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 alcance el valor máximo (0xFFFF), luego vaya a 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 utilizar para cambiar el nivel lógico en cada partido configurando el modo de conmutación (COMnA1, COMnA0 = 0b01). El valor OCnA estará presente en un pin de puerto solo si se especifica la dirección de salida para ese pin. 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 hay 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 meandros ( pulsos cuadrados con un ciclo de trabajo de 2 o 50% de llenado) de 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 se encienda (invierta) cada partido. 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 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 rápido PWM.

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. Durante el funcionamiento bidireccional, la frecuencia máxima de la señal PWM es menor que durante 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 establece el 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 cuando cambio dinámico 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 regresiva 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 restablece 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 modo PWM, 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 igual al límite inferior (0x0000), entonces en el modo no inversor la salida tendrá constantemente un nivel lógico bajo, y al escribir un valor igual al límite superior, la salida tendrá un nivel lógico alto durante un 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 del 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- Indicador 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 “coincidencia B” del temporizador/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, según señal externa desde el pin ICP1 o desde un comparador analógico, T1 puede guardar su estado actual en un registro de captura separado ICR1.

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 de funcionamientoMó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 en 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 comparan 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 OCIE1A=1:OCIE1B=1 Se genera un bit 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 un 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 llega a TCNT1 valor mínimo($0000) la dirección de conteo también cambia y al mismo tiempo se establece 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 activa 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 clave (en modo de conmutación). Es preferible un transistor de efecto de campo porque su puerta está aislada del circuito de alimentación y el control se realiza 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 transistores de efecto de campo se puede conectar en paralelo (a diferencia del bipolar), 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. Nuestro temporizador también 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 "cuelga 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á.

Actualizado el 16/12/15. ciclo de trabajo Hola a todos. Habiendo abordado la última entrada sobre la memoria EEPROM, hoy hablaremos de ¿qué es PWM (PWM)? Descifrado como modulación de ancho de pulso, este es el valor de voltaje promedio que cambia según el ciclo de trabajo del pulso. Sucesivamente

esta es la duración del pulso con una cierta frecuencia de repetición. Aquellos. En palabras más simples, todo esto es un cambio en el ancho del pulso mientras su valor permanece sin cambios. ¿Por qué necesitamos esto? PWM (PWM) se utiliza en un circuito de transistores para regular el voltaje sin mecánica, controlando a su vez la potencia. Por ejemplo, controlar el brillo de los LED, controlar el brillo de la luz de fondo de un monitor LCD, controlar motores, etc. Si se muestra en la figura, la salida del microcontrolador será aproximadamente la siguiente, como en la imagen a continuación. Donde se puede ver que el ciclo de trabajo es el llenado de pulsos, si todo el ancho del pulso es de 5 V, entonces con un 30% de llenado de pulsos, en promedio obtendremos aproximadamente 1,5 V en la salida. En microcontroladores AVR

El control PWM se especifica en temporizadores/contadores de ocho bits T0/(T2) y T1 de dieciséis bits (T3 en algunos modelos). Y también hay otros modelos donde se puede configurar la profundidad de bits PWM, por ejemplo ATmega 128. Consideremos configurar un temporizador/contador T1 de dieciséis bits. Tomamos los datos de acuerdo con las tablas del libro de referencia o de la hoja de datos (literatura - artículo No. 1). En general, para un contador de este tipo en micrones, puede seleccionar tres modos: PWM rápido, PWM de fase correcta, PWM de fase y frecuencia correcta ()

depende del modelo Consideremos el segundo modo:. Aquí el registro del contador funciona como un contador ascendente/descendente, cambiando el estado de $0000 a un valor máximo y luego de regreso a $0000. Para controlar el temporizador/contador utilizamos tres registros de control TCCR1A, TCCR1B, TCCR1C. En el cual, para seleccionar el modo temporizador/contador, es necesario configurar los bits WGMn1: WGMn0 y WGMn1: WGMn0. . Dependiendo de su configuración, el valor máximo del contador (resolución de señal PWM) es un valor fijo o está determinado por el contenido de ciertos registros del temporizador/contador. Resolución está determinada por la expresión :

g = log (TOP+1)/log2, donde TOP es el módulo de conteo, seleccionado de la tabla según la resolución.

Una vez decidido el modo de funcionamiento del contador temporizador, se debe seleccionar el modo de funcionamiento del bloque de comparación COMnA1:COMnA0, COMnB1:COMnB0, COMnC1:COMnC0, que determina el comportamiento de la salida OCnx cuando ocurre el evento “Coincidencia”. .

Bueno, el último paso es decidir la frecuencia. Necesitamos configurar los bits CSn2...CSn0 del registro TCCR1B, que son responsables de determinar la fuente de la señal de reloj. Así es como se ven los ajustes del software para el control PWM en la salida OC1A. Por ejemplo:

/*Ajustes PWM */
TCCR1A=(1</*En el pin OC1A uno cuando OCR1A==TCNT1, se restablece a 0 cuando OCR1A==TCNT1 y se establece en 1 cuando se alcanza el valor máximo PWM de ocho bits, PWM correcto de fase, modo número 1. módulo de cuenta TOP $00FF*/
TCCR1B=(1<OCR1A = 50; /* con un módulo de conteo de 255 y un voltaje de 5 V en la salida del OC1A obtenemos aproximadamente 1 V */

Se puede ver en el programa que para obtener PWM utilizamos el registro de comparación OCR1A. Cuando el contador alcanza su valor máximo, en este caso 255, la dirección de conteo cambia, pero el contador permanece en este estado durante un período de señal. Esta es la frecuencia de funcionamiento más lenta en comparación con el primer modo. Pero ésta es la simetría del cambio contrario. Lo cual es más adecuado para el control del motor. En el mismo ciclo se actualiza el contenido del registro de comparación. Cuando el contador alcanza el valor mínimo, la dirección de conteo también cambia y al mismo tiempo se establece el indicador de interrupción TOV1 del registro TIFR. Si el contenido del registro de conteo y cualquier registro de comparación son iguales, se establece el indicador correspondiente OCF1A/OCF1B/OCF1C del registro TIFR. Al mismo tiempo, cambia el estado de la salida del bloque de comparación OCnx. h frecuencia de señal generada fOCn= f/(2*N*TOP), donde N es el coeficiente de división del preescalador, f es la frecuencia del cuarzo. También puedes ver más ejemplos de configuración y uso de PWM, por ejemplo.

Eso es todo por hoy. En la próxima publicación veremos controlador de máquina CNC aficionado. Intentaré utilizar publicaciones anteriores de este blog para configurar un programa como un constructor. De esta manera quedará más claro cuando lo escribas una vez y lo uses en el siguiente proyecto. Adiós a todos.

Después de hacer parpadear los LED y descubrir las fuentes de sincronización y interrupción, llegó el momento de dominar el temporizador del controlador MSP430G2553.
Un temporizador es un mecanismo de conteo vinculado a los pulsos de una señal del generador de reloj. Temporizador Timer_A es un temporizador de 16 bits. Esto significa que cuenta desde cero hasta el binario 0b1111111111111111, o el hexadecimal 0xFFFF, o el decimal 65535. El temporizador es un dispositivo periférico y también tiene sus propias interrupciones.
Timer_A tiene tres modos de funcionamiento.

Modo de conteo continuo, en el que el temporizador simplemente cuenta de 0 a 0xFFFF, luego comienza desde el principio y así hasta el infinito.

Modo de conteo directo, en el que el cronómetro funciona de la misma manera, cuenta hasta el límite superior y comienza nuevamente desde 0. Sólo en este modo puedes elegir el límite superior hasta el cual contará el cronómetro.

El modo de conteo inverso es similar al modo de conteo directo en el sentido de que puede seleccionar el valor máximo del temporizador. Su diferencia es que, al alcanzar el máximo, el temporizador comienza a contar hacia atrás, luego, al llegar a 0, comienza a contar nuevamente, etc.
En los gráficos está la designación TACCR0: este es el registro de captura de comparación. Puede haber dos (TACCR0 y TACCR1), o tres (TACCR0, TACCR1 y TACCR2) según el modelo. En este registro se pueden escribir los llamados puntos clave, al alcanzarlos el temporizador activará una interrupción.

Los registros del temporizador A se describen en detalle a continuación:
TACTO– Registro de control Timer_A, Registro de control del temporizador A Se utiliza para conectar el temporizador con señales de reloj y seleccionar modos de funcionamiento.
BORLAx Los bits 8 y 9 le indican al temporizador qué reloj usar.
IDx, los bits 6 y 7, indican qué divisor de reloj utilizar, 2, 4 u 8. Se divide la frecuencia obtenida tras aplicar el divisor en el propio generador de reloj.
MCx, los bits 4 y 5, indican el modo de funcionamiento del temporizador. Si son iguales a 0 (valor predeterminado), el cronómetro se detiene por completo.
TACLR, bit 2. Si ingresa un 1, esto restablecerá el temporizador. El microcontrolador escribe automáticamente 0 en este bit después de que se reinicia el temporizador.
TAIE y TAIFG, bits 0 y 1, respectivamente. Controlan la interrupción del temporizador, más sobre esto a continuación.
ALQUITRÁN– Registro Timer_A, registro contador Timer A, contiene el valor actual del temporizador.
TACCRx– Registros de captura/comparación del Timer_A, registros de captura/comparación del Timer A. Puede haber dos (TACCR0 y TACCR1), puede haber tres (TACCR0, TACCR1 y TACCR2) según el modelo de microcontrolador. En modo de comparación, ingresamos valores en ellos, al alcanzar los cuales el temporizador debería darnos una señal. TACCR0 se utiliza a menudo para indicar el límite superior del recuento. En el modo de captura, el procesador escribe en ellos el valor TAR actual en función de la señal de entrada.
TACCTLx– Timer_A Registros de control de captura/comparación, Registro de control de bloque de captura/comparación del temporizador A. Los modos de funcionamiento de los registros de captura/comparación dependen de su valor.
cmx, los bits 14 y 15, determinan el tipo de señal utilizada para capturar. (Al subir y bajar, ambos frentes. - Nota por.)
CCISx,Bits 12 y 13, seleccionan de dónde proviene la señal de captura.
SCS y SCCI, bits 11 y 10 respectivamente, sincronizan la señal de captura con la señal del reloj del temporizador. Normalmente, el temporizador funciona de forma independiente y asíncrona de señales externas. (Yo mismo no he entendido completamente esta función, la escribiré con más detalle en las siguientes lecciones)
TAPA, bit 8, selección del modo de funcionamiento, 1 – modo de captura, 0 – modo de comparación.
OUTMODx, bits 5-7, selección del modo de funcionamiento del módulo de salida, es decir tipo de respuesta a un evento de captura o comparación.
CCIE y CCIFG, bits 4 y 0 respectivamente, captura/compara el procesamiento de interrupciones.
CCI y FUERA, bits 3 y 2 respectivamente, capturan/comparan entrada y salida.
COV, bit 1, desbordamiento de captura. Establezca en 1 si se ha producido una segunda captura y la primera aún no se ha leído. Debe restablecerse mediante software.
TAIV– Timer_A Registro de vector de interrupción, Temporizador Un registro de vector de interrupción Dado que una interrupción del temporizador puede deberse a varios motivos diferentes, el contenido de este registro indica el motivo de la llamada de la interrupción.
TAIVx Los bits 1 a 3 contienen el tipo de interrupción que ocurrió, lo que nos permite tomar diferentes acciones para manejar diferentes causas de interrupciones.

Entonces, si solo necesita hacer parpadear un LED, o cambiar un relé, o algo similar, en ciertos intervalos, entonces configurar un temporizador en este caso es muy simple.

TACCR0 = 62499; // periodo 62.500 ciclos TACCTL0 = CCIE; // Permitir que el temporizador se interrumpa cuando se alcance el valor CCR0. TACTL = BORLA_2 + ID_3 + MC_1 + TACLR; //Configuración del modo de operación Timer_A: // TASSEL_2 - fuente de reloj SMCLK (SubMainCLocK), // configurado por defecto para operar desde DCO // ID_3 - divisor de frecuencia por 8, desde 1MHz será 125kHz // MC_1 - modo de conteo directo (hasta TACCR0) // TACLR - reinicio del temporizador inicial

Pero compliquemos un poco la tarea y hagamos que el LED se encienda y apague suavemente. Para hacer esto necesitamos usar PWM. El principio de PWM es suministrar voltaje en pulsos con una frecuencia fija y un ciclo de trabajo variable. PWM se caracteriza por un parámetro como el ciclo de trabajo: este es el recíproco del ciclo de trabajo y es igual a la relación entre la duración del pulso y su período.

Para que quede más claro, la siguiente figura muestra señales PWM para el ciclo de trabajo: a – 25%; b – 50%; c – 75%; gramos – 100%.

t0 – tiempo de pulso;
T – período;
Al cambiar t0, puede obtener diferentes valores de voltaje promedio en toda la carga, cambiando así el brillo del LED.
El período de modulación de ancho de pulso debe ser constante y mayor que el tiempo de pulso. Por tanto, anotemos TACCR0 = 600; // período 600 ciclos. Seleccioné este número de forma experimental para que el funcionamiento del temporizador pudiera verse a simple vista.
Dado que el LED debería empezar a brillar lentamente, el tiempo de impulso inicial debería ser muy corto, p. TACCR1 = 10; // tiempo de pulso 10 ciclos. TACCR1 es el segundo registro de captura/comparación del Temporizador A. Entonces, resulta que cuando se alcance el valor TACCR0 = 600, el temporizador generará una interrupción en la que configuraremos la salida del microcontrolador a uno, que será el comienzo de el pulso. En este caso, el temporizador se pone a cero y comienza a contar nuevamente desde cero hasta llegar a TACCR1 = 10, luego se generará una interrupción en el segundo registro de captura/comparación, en el cual pondremos a cero la salida del microcontrolador. Por tanto, la duración del impulso t0 durará 5 ciclos de reloj.
Para que el LED aumente la intensidad del brillo, es necesario aumentar el tiempo de pulsación. Para hacer esto, después de cada interrupción de TACCR0 agregaremos algún valor al valor actual de TACCR1. En este caso el valor máximo que puede tener TACCR1 será igual al periodo, es decir 600. Dependiendo del valor que agreguemos dependerá la suavidad y velocidad de cambio en la intensidad del resplandor.

TACCR0 = 600; // Período TACCR1 = 5; //Tiempo de pulso TACCTL0 = CCIE; // Permitir que el temporizador se interrumpa cuando se alcance CCR0. TACCTL1 = CCIE; // Permitir que el temporizador se interrumpa cuando se alcance CCR1. TACTL = BORLA_2 + ID_3 + MC_1 + TACLR; //Configuración del modo de funcionamiento del Timer_A

Ahora necesita escribir un controlador de interrupciones para TACCR0, que establecerá el comienzo de cada nuevo período, así como sumar o restar el valor de TACCR1 para que el LED se encienda suavemente y se apague con la misma suavidad.

#pragma vector = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //vector de interrupción para TACCR0, temporizador A (P1OUT |= BIT0; // establece el bit cero en uno si (TACCR1><=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } }

La interrupción para TACCR1 se verá así.

#pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //vector de interrupción para TACCR1, temporizador A (P1OUT &= ~BIT0; // establece el bit cero del puerto P1 en cero. TAIV &= ~TA0IV_TACCR1; // restablece la interrupción bandera. )

Tenga en cuenta que en el primer caso, en el controlador de interrupciones de TACCR0, no restablecí el indicador de interrupción, pero para TACCR1 hice esto. Esto se debe a que el indicador de interrupción para TACCR0 se restablece automáticamente cuando se llama a dicha interrupción, pero para TACCR1 se debe restablecer manualmente.

Ahora puedes redactar el texto completo del programa.

#incluir /* Variables globales */ unsigned int index = 0; /* Declaración de función */ void main(void) ( WDTCTL = WDTPW + WDTHOLD; // deshabilita el temporizador de vigilancia P1DIR |= 0x01; // establece el bit cero del puerto P1 en la salida P1OUT = 0x01; // establece el cero bit del puerto P1 a uno BCSCTL1 = CALBC1_1MHZ; // Establece la frecuencia DCO DCOCTL = CALDCO_1MHZ; // Período TACCR1 = 10 // Tiempo de pulso TACCTL0 = CCIE // Habilita la interrupción del temporizador TACCTL1 = CCIE; ID_3 + MC_1 + TACLR // Configuración del modo de funcionamiento del Timer_A: // TASSEL_2 - fuente de reloj SMCLK (SubMainCLocK), // configurado por defecto para funcionar desde DCO // ID_3 - divisor de frecuencia por 8, desde 1MHz será 125kHz / / MC_1 - modo de conteo directo (hasta TACCR0) // TACLR - reinicio inicial del temporizador _enable_interrupt(); // habilita todas las interrupciones) #pragma vector = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //vector de interrupción para TACCR0, Temporizador A ( P1OUT |= BIT0; // establece el bit cero en uno if (TACCR1>=(TACCR0-5)) // si TACCR1 es mayor que TACCR0, entonces disminuye TACCR1 (indeX=1; ) si (TACCR1<=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } } #pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //вектор прерывания для TACCR1, Таймера А { P1OUT &= ~BIT0; // устанавливаем нулевой бит порта Р1 в ноль. TAIV &= ~TA0IV_TACCR1; //сбрасываем флаг прерывания. }

Entonces, parpadeamos el controlador, iniciamos el programa y vemos que el LED rojo se enciende lentamente y se apaga, se enciende y se apaga.
Este programa es muy conveniente de usar en la práctica. Digamos que necesita cambiar el brillo de una lámpara de diodo o la velocidad de rotación de un motor de CC, todas estas cosas se pueden implementar perfectamente usando PWM, que se puede controlar usando un temporizador disponible en el controlador MSP430G2553. Definitivamente aparecerá una serie de artículos sobre el control de un motor de CC usando PWM en nuestro sitio web, donde aplicaremos estas habilidades en la práctica.

No entraré en detalles sobre qué es PWM y cómo funciona; puedes encontrar información fácilmente en Internet. Tocaré sólo conceptos generales. PWM es Modulación de ancho de pulso (en inglés PWM - Modulación de ancho de pulso), por el nombre mismo está claro que hay algo que ver con los pulsos y su ancho. Si cambia el ancho (duración) de los pulsos de frecuencia constante, puede controlar, por ejemplo, el brillo de la fuente de luz, la velocidad de rotación del eje del motor eléctrico o la temperatura de un elemento calefactor. Normalmente, es con la ayuda de PWM que el microcontrolador controla dicha carga. Los microcontroladores tienen una implementación de hardware PWM, pero, desafortunadamente, la cantidad de canales de hardware PWM es limitada, por ejemplo, hay seis en ATmega88, cuatro en ATtiny2313, tres en ATmega8 y solo dos en ATtiny13. En AVR, los canales PWM utilizan temporizadores y sus registros de comparación OCRxx. Al cambiar su contenido y configurar los parámetros de los temporizadores, según las tareas, puede controlar el estado de la salida asociada con el registro: enviarle 1 o 0. Lo mismo se puede organizar mediante programación, controlando cualquier salida del controlador. y, lo más importante, implementar una mayor cantidad de canales PWM que los disponibles a bordo de las salas de control. En la práctica, el número de canales está limitado únicamente por el número de pines del microcontrolador (al menos si hablamos de las familias Mega o Tiny). Al final resultó que, el algoritmo es bastante simple, pero me tomó algún tiempo comprenderlo y comprenderlo completamente.

Este algoritmo se describe en detalle en la nota original AVR136: Software PWM multicanal de baja fluctuación. El principio de funcionamiento de la implementación del software es simular el funcionamiento de un temporizador en modo PWM. La duración del pulso requerida se establece mediante variables, respectivamente, una para cada canal (en mi código lev_ch1, lev_ch2, ​​​​lev_ch3), y también se establecen los "gemelos" de estas variables, que almacenan el valor para un período específico de operación del temporizador. (en mi código buf_lev_ch1, buf_lev_ch2, ​​buf_lev_ch3). El temporizador de ocho bits funciona a la frecuencia principal del MK y genera una interrupción por desbordamiento, es decir, cada 256 ciclos de reloj. Esto impone un límite a la duración del procedimiento de procesamiento de la interrupción: es necesario mantenerse dentro de los 256 ciclos de reloj para no perder la siguiente interrupción. Como resultado, un período PWM completo es igual a 256*256=65536 ciclos. Una variable de contador de ocho bits (contador en mi ejemplo) se incrementa en uno cada interrupción y actúa como un puntero de posición dentro del bucle PWM. Todo esto proporciona una resolución (paso mínimo) de PWM de 1/256 y una frecuencia de pulso de ƒ/(256*256), donde ƒ es la frecuencia del oscilador maestro del microcontrolador. Cabe señalar que la frecuencia de reloj del microcontrolador debe ser bastante alta. En mi ejemplo, ATtiny13 funciona a la frecuencia más alta posible, sin utilizar un generador externo: 9,6 MHz. Esto da un período de PWM de 9600000/65536≈146,5 Hz, que es suficiente en la mayoría de los casos.
Código en C, un ejemplo de implementación de la idea para el microcontrolador ATtiny13 (tres canales PWM en los pines PB0, PB1, PB2):

#define F_CPU 9600000 //fusible BAJO=0x7a #incluir #incluir uint8_t contador=0; uint8_t lev_ch1, lev_ch2, ​​​​lev_ch3; uint8_t buf_lev_ch1, buf_lev_ch2, ​​​​buf_lev_ch3; void delay_ms(uint8_t ms) //función de retardo ( while (ms) ( _delay_ms(1); ms--; ) ) int main(void) ( DDRB=0b00000111; // configurando los pines del PuertoB 0,1,2 salidas TIMSK0 = 0b00000010; // habilita la interrupción de desbordamiento del temporizador TCCR0B = 0b00000001; // configuración del temporizador, divisor apagado sei(); // habilita las interrupciones lev_ch2=64 // duración de PWM lev_ch3=128; para (uint8_t i=0;i<255;i++) { lev_ch1++; //увеличиваем значения lev_ch2++; //длительности ШИМ lev_ch3++; //каждого канала delay_ms(50); //пауза 50мс } } } ISR (TIM0_OVF_vect) //обработка прерывания по переполнению таймера { if (++counter==0) //счетчик перехода таймера через ноль { buf_lev_ch1=lev_ch1; //значения длительности ШИМ buf_lev_ch2=lev_ch2; buf_lev_ch3=lev_ch3; PORTB |=(1<Creo que todo está bastante claro y sobran explicaciones. Para los valores de duración y sus buffers, con una mayor cantidad de canales, puede ser mejor usar matrices, pero en este ejemplo no lo hice para mayor claridad.
Probado contra avr-gcc-4.7.1 y avr-libc-1.8.0. Compilando y obteniendo el archivo de firmware:
avr-gcc -mmcu=attiny13 -Wall -Wstrict-prototypes -Os -mcall-prologues -std=c99 -o softPWM.obj softPWM.c
avr-objcopy -O ihex softPWM.obj softPWM.hex
Para un funcionamiento adecuado, debe configurar los bits del fusible bajo en 0x7a (frecuencia 9,6 MHz). En avrdude, por ejemplo, esto se hace así:
avrdude -p t13 -c usbasp -U lfuse:w:0x7a:m

Mi implementación en ensamblador. El programa hace exactamente lo mismo que el código C anterior.
;para no arrastrar el archivo de inclusión.list .equ DDRB= 0x17 .equ PORTB= 0x18 .equ RAMEND= 0x009f .equ SPL= 0x3d .equ TCCR0B= 0x33 .equ TIMSK0= 0x39 .equ SREG= 0x3f ;esto es solo una demostración, porque registra y no sobra.def temp=R16 .def lev_ch1=R17 .def lev_ch2=R18 .def lev_ch3=R19 .def buf_lev_ch1=R13 .def buf_lev_ch2=R14 .def buf_lev_ch3=R15 .def counter=R20 .def demora0=R21 . def demora1=R22 .def demora2=R23 .cseg .org 0; tabla de interrupciones de la hoja de datos: rjmp RESET; Restablecer controlador rjmp EXT_INT0; Controlador IRQ0 rjmp PIN_CHG_IRQ; Controlador PCINT0 rjmp TIM0_OVF; Controlador de desbordamiento del temporizador 0 rjmp EE_RDY; Controlador listo para EEPROM rjmp ANA_COMP; Controlador de comparador analógico rjmp TIM0_COMPA; Timer0 Comparar un controlador rjmp TIM0_COMPB; Timer0 CompararB Controlador rjmp WATCHDOG; Controlador de interrupciones de vigilancia rjmp ADC_IRQ; Controlador de conversión ADC; RESET: EXT_INT0: PIN_CHG_IRQ:; TIM0_OVF: EE_RDY: ANA_COMP: TIM0_COMPA: TIM0_COMPB: WATCHDOG: ADC_IRQ: reti RESET: ldi temp,0b00000111; asignar pines PortB PB0, PB1 salida DDRB,temp; y PB2 salidas ldi temp,0; coloque todos los pines en PORTB,temp; PuertoB a 0 temperatura ldi, baja (RAMEND); inicialización fuera SPL,temp; temperatura de ldi de pila, 0b00000001; en temporizador de salida TCCR0B,temp; sin divisor ldi temp,0b00000010 ; en interrumpir TIMSK0,temp; desbordamiento del temporizador sei ; habilitar interrupciones start_pwm: ; órgano sin fin inc lev_ch1; aumentar los valores inc lev_ch2 ; Duración de PWM inc. lev_ch3; en todos los canales retardo de llamada; una breve pausa para suavizar el retardo rjmp start_pwm: ; procedimiento de retraso ldi retraso2,$01; establezca el número ldi delay1,$77; hasta que hora contar ldi delay0,$00 ; $017700 - dará un retraso de bucle de 50 ms: subi delay0,1; considere sbci delay1,0; considere el retraso de sbci2,0; considere el bucle brcc ret TIM0_OVF:; manejar la temperatura del empuje de la interrupción del temporizador; por si acaso, guardar en temp,SREG ; temp y SREG en la pila empujan el contador temp inc; contador para la transición del temporizador a través del contador de 0 ipc,0; si no es 0, marque brne ch1_off; ¿Hay algo que deba extinguirse mov buf_lev_ch1,lev_ch1 ; si el contador es 0 mov buf_lev_ch2,lev_ch2; luego configuramos new mov buf_lev_ch3,lev_ch3; Valores de duración del canal PWM ldi temp,0b00000111; habilitar todos los PORTB,temp; tres salidas ch1_off: ; ¿No deberíamos pagar cp counter,buf_lev_ch1; primer canal? brne irq_end; no, es demasiado pronto: nos dirigimos hacia la salida de interrupción cbi PORTB,2; sí, extinguir irq_end: ; temperatura pop de la pila; SREG y temp out SREG,temp pop temp reti ;interrupción de salida
Se compila con avra o tavrasm. No se olvide de las puntas de fusible (ver arriba).