Saltar al contenido principal
LibreTexts Español

28.1: Introducción

  • Page ID
    81931
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Prácticamente todos los microcontroladores contienen uno o más bloques de función temporizador/contador de hardware. Estos se pueden usar para una variedad de funciones que incluyen generar retardos de tiempo, contar eventos de entrada, generar formas de onda simples de pulso o PWM y activar interrupciones de software. En general, existen múltiples formas de configurar estos bloques. A menudo, se configuran como simples contadores que son cronometrados por el reloj del sistema. En algunos casos, pueden ejecutarse asincrónicamente desde una fuente de reloj externa.

    El ATMega 328P contiene tres de estos bloques: dos unidades de ocho bits denominadas TC0 y TC2 (Contador Temporizador 0 y 2), y una unidad de 16 bits, TC1. Un diagrama de bloques funcional de una unidad de ocho bits se muestra en la Figura\(\PageIndex{1}\). La unidad de 16 bits es similar pero ofrece habilidades extendidas.

    Diagrama de bloques funcionales temporizador/contador (ocho bits).
    Figura\(\PageIndex{1}\): Diagrama de bloques funcionales temporizador/contador (ocho bits).

    Primero, hay un par de registros utilizados para programar el funcionamiento del bloque. Estos son TccRNA y TcCRnB (Timer Counter Control Register A y B) donde n es el número de temporizador/contador (0, 1 o 2 aquí, aunque otros microcontroladores de la serie pueden tener más). Estos bits suelen ser “establecidos y olvidados”, es decir, se configuran/borran para un uso determinado y no se vuelven a tocar a menos que la unidad necesite ser reprogramada para un uso diferente. Se presentará momentáneamente más detalle sobre estos. También hay dos registros que se utilizan con interrupciones de software, TiFRN y TimSKN (TimsKN (Timer Interrupt Flag Register y TimTimer Interrupt Mask register) que no se muestran aquí. Los examinaremos en la sección sobre interrupciones de software. Los otros registros clave son TCNTx (Timer CounT) junto con ocRNA y ocrNB (Output Compare Register A y B).

    En su operación más básica la unidad incrementa el registro TCnTn con cada tick del reloj del sistema. Eventualmente, este registro alcanzará su valor máximo y desbordamiento, resultando en cero, restableciendo efectivamente el registro y el conteo continúa hacia arriba a partir de ahí. Este valor máximo es 255 para una unidad de ocho bits (es decir, 11111111 binaria) y 65535 para una unidad de 16 bits. Opcionalmente, la unidad puede programarse para inspeccionar los valores contenidos en los registros OCRN y compararlos con los contenidos actuales de TCnTn para ver si coinciden. Tanto el desbordamiento como la coincidencia de comparación se pueden usar para activar alguna acción, por ejemplo, un cambio de nivel de forma de onda o una interrupción de software. La sección de comparación de coincidencia alimenta un generador de onda de pulso que a su vez alimenta un pin de salida. Esta sección se muestra en la Figura\(\PageIndex{2}\).

    Temporizador/contador compara circuitos de salida coincidentes.
    Figura\(\PageIndex{2}\): Circuito de salida de coincidencia de comparación de temporizador/contador.

    La caja marcada como “OCNx Pin” es un pin físico en el microcontrolador. Como no sería práctico tener pines de propósito único para cada función en el microcontrolador, la función de forma de onda se mapea en los pines IO de propósito general. Compare esta sección con el diagrama de bloques GPIO discutido en el capítulo 19. Tenga en cuenta los flip-flops PORT y DDR en particular. El generador de forma de onda alimenta un flip flop que luego alimenta un multiplexor junto con el flip flop PORT. Esta señal se alimenta entonces a una memoria intermedia de tres estados controlada por el DDR que conduce al pin de salida físico. Como hay tres temporizador/contadores y cada uno tiene dos registros de comparación, hay un total de seis pines de salida físicos disponibles para la generación de formas de onda. Las asignaciones de mapeo se muestran en la Tabla\(\PageIndex{1}\).

    Tabla\(\PageIndex{1}\): Asignaciones de pines de forma de onda.
    OCNx Port.bit Pin Arduino
    OC0A D.6 6
    OC0B D.5 5
    OC1A B.1 9
    OC1B B.2 10
    OC2A B.3 11
    OC2B D.3 3

    La siguiente discusión se centrará en el temporizador/contador número dos. Esto se debe a que las unidades temporizadoras/contadoras cero y una ya se utilizan para llamadas comunes al sistema Arduino como delay (). La reprogramación del temporizador/contadores podría alterar el funcionamiento de esas funciones y procedimientos. El temporizador/contador número dos es un poco más seguro para experimentar en ese sentido aunque tenga en cuenta que las tres unidades se utilizan para cubrir los seis pines de salida con capacidad PWM en el Uno (es decir, vía AnalogWrite ()).

    Los dos registros de control (TCCRNa/b) indican el modo de operación. Los registros se muestran en Tablas\(\PageIndex{2}\) y\(\PageIndex{3}\) para la unidad número dos. Los registros de control para las otras unidades temporizadoras/contadores son similares y los detalles se pueden encontrar en el Apéndice.

    Tabla\(\PageIndex{2}\): Registro TCCR2A (Atmel 2014).
    Bit 7 6 5 4 3 2 1 0
    Función COM2A1 COM2A0 COM2B1 COM2B0 - - WGM21 WGM20
    Tabla\(\PageIndex{3}\): Registro TCCR2B (Atmel 2014).
    Bit 7 6 5 4 3 2 1 0
    Función FOC2A FOC2B - - WGM22 CS22 CS21 CS20

    Los primeros elementos de interés son los bits CS. Estos son los bits de PreScale de Reloj y permiten periodos de temporizador más largos dividiendo el reloj del sistema antes de que alimente el contador. Por ejemplo, si el controlador está funcionando a 16 MHz, entonces cada tick de reloj representa 1/16 MHz o 62.5 nanosegundos. Contar de 0 a 255 produciría un retraso máximo de solo 62.5 nanosegundos por 256, o 16 microsegundos. Si el preescalador se establece en ocho, cada tick se estira en un factor de ocho produciendo un retraso máximo de 128 microsegundos en este ejemplo. Los ajustes del preescalador para TC2 se muestran en la Tabla\(\PageIndex{4}\).

    Tabla\(\PageIndex{4}\): Ajustes de preescalador para TC2.
    CS22 CS21 CS20 Dividir por
    0 0 0 TC detenido
    0 0 1 1 (sin preescala)
    0 1 0 8
    0 1 1 32
    1 0 0 64
    1 0 1 128
    1 1 0 256
    1 1 1 1024

    Pasando a los bits del modo de generación de forma de onda (WGM), hay modo normal, un modo de comparación (CTC o Clear Timer on Compare) y dos formas de modulación de ancho de pulso. Examinaremos los modos PWM Normal y Rápido aquí y el modo CTC en el capítulo que cubre las interrupciones. Obsérvese que los bits WGM están dispersos en ambos registros de control en lugar de residir en un solo registro. Los bits WGM se detallan en la Tabla\(\PageIndex{5}\).

    Tabla\(\PageIndex{5}\): Bits de modo generación de forma de onda para TC2.
    WGM22 WGM21 WGM20 Modo
    0 0 0 Normal
    0 0 1 Fase correcta PWM, Top=0xFF
    0 1 0 CTC
    0 1 1 PWM rápido, Top=0xFF
    1 0 0 Reservado
    1 0 1 Fase correcta PWM, arriba=OCRA
    1 1 0 Reservado
    1 1 1 PWM rápido, arriba=OCRA

    Finalmente consideremos los bits de Comparar Modo de Salida (COM) que se encuentran en TCCR2A. Hay dos bits para OC2A y dos para OC2B, y aunque los ajustes son similares no son idénticos (para más detalles, consulte la documentación de Atmel). Los ajustes para OC2A se encuentran en Tablas\(\PageIndex{6}\) a través de tres modos\(\PageIndex{8}\) de generación de formas de onda y describen cómo responde la señal pin de salida. Tenga en cuenta que en estos tres modos si ambos bits COM están claros, entonces el pin de salida, OC2A, se desconecta del temporizador/contador y opera en forma IO ordinaria. Con otros ajustes de los bits COM, OC2A es controlado por el generador de forma de onda. Es importante tener en cuenta que el DDR asociado aún debe establecerse para el modo de salida para que la forma de onda alcance el pin de salida. Examine el diagrama de bloques de la Figura\(\PageIndex{2}\) para su verificación.

    Tabla\(\PageIndex{6}\): No PWM, Comparar el modo de salida para TC2.
    COM2A1 COM2A0 Descripción
    0 0 Normal, OC2A desconectado
    0 1 Alternar OC2A en Comparar coincidencia
    1 0 Borrar OC2A en la coincidencia de comparación
    1 1 Establecer OC2A en Comparar partido
    Tabla\(\PageIndex{7}\): PWM rápido, Comparar el modo de salida para TC2.
    COM2A1 COM2A0 Descripción
    0 0 Normal, OC2A desconectado
    0 1 WGM22=0: Normal, OC2A desconectado
    WGM22=1: Alternar OC2A al comparar coincidencia
    (Operación reservada para OC2B)
    1 0 Borrar OC2A al comparar coincidencia, establecer OC2A en 0x00 (modo no inversor)
    1 1 Establecer OC2A en Comparar coincidencia, Borrar OC2A en 0x00 (modo de inversión)
    Tabla\(\PageIndex{8}\): Fase correcta PWM, Comparar el modo de salida para TC2.
    COM2A1 COM2A0 Descripción
    0 0 Normal, OC2A desconectado
    0 1 WGM22=0: Normal, OC2A desconectado
    WGM22=1: Alternar OC2A al comparar coincidencia
    (Operación reservada para OC2B)
    1 0 Borrar OC2A en Comparar partido al contar hacia arriba, Establecer al contar hacia abajo
    1 1 Establecer OC2A en Comparar coincidencia al contar hacia arriba, Establecer al contar hacia abajo

    This page titled 28.1: Introducción is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.