Saltar al contenido principal
LibreTexts Español

28.3: Modo PWM rápido

  • Page ID
    81925
  • \( \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}}\)

    Este es el modo de modulación de ancho de pulso “rápido” que puede conducir un pin de salida directamente. PWM rápido es más rápido que PWM de fase correcta porque PWM rápido realiza un recuento de pendiente única (es decir, solo ascendente). La corrección de fase PWM utiliza una técnica de conteo de doble pendiente ascendente y descendente. Aquí no examinaremos PWM de fase correcta.

    Para usar el modo PWM rápido para conducir un pin de salida, primero recuerde configurar el bit DDR correspondiente al modo de salida (consulte la Tabla 28.1.1). Después de esto, los bits WGM y COM deben establecerse de acuerdo con las Tablas 28.1.5 y 28.1.7, así como los bits CS preescaladores deseados de la Tabla 28.1.4. Finalmente, es necesario establecer un valor para los registros de comparación de salida (OCR2A y OCR2B). El valor de los registros OCR2x determinará los ciclos de trabajo de la forma de onda de pulso resultante. Básicamente, TCNT2 contará a la moda normal, desbordando y reciclando como de costumbre. Cuando el contenido de TCNT2 coincide con los de un registro de comparación de salida asociado, entonces el pin de salida correspondiente cambiará al estado apropiado. El ciclo de trabajo se define por el rango de conteo total (256) y el valor del registro de comparación más uno. Un ejemplo se ve a continuación.

    /* Waveform at external pins OC2A and OC2B (PORTB.3/PORTD.3)
       Fast PWM mode, non-inverting */
    
    void setup()
    {
        // enable output drivers for OC2A/B!
        DDRB |= 0x08;
        DDRD |= 0x08;
    
        // the following is done in two steps for clarity
        TCCR2A = (1<<WGM21) | (1<<WGM20);            // specify fast PWM
        TCCR2A|= ((1<<COM2A1) | (1<<COM2B1));        // add in non-inverting output
    
        TCCR2B = (1<<CS22);                          // prescale by 64x
        
        OCR2A = 128;    // set duty cycles (0 through 255)
        OCR2B = 100;
    }
    
    void loop()
    {
        // nothing to do here!
    }
    

    Un nuevo giro interesante aquí es que no hay nada en la función main loop ()! Una vez que el temporizador/contador está configurado, funciona sin más atención, realmente operación de “configurar y olvidar”. En este caso, la frecuencia de salida será el reloj principal de 16 MHz dividido por el preescalador 64x y luego dividido por el conteo total de 256. Esto produce aproximadamente 977 Hz. El ciclo de trabajo para la salida A es (128+1) /256 o aproximadamente 50.4%. Para la salida B el resultado es (100+1) /256 o aproximadamente 39.5%.

    El código anterior se descargó a un Arduino Uno y se adjuntó un osciloscopio a los dos pines de salida. Las formas de onda resultantes se muestran en la Figura\(\PageIndex{1}\). Observe la precisión relativa de los cálculos de tiempo en comparación con los medidos por el osciloscopio.

    Vale la pena señalar que los valores de los registros de comparación de salida podrían cambiarse programáticamente, por ejemplo a través de un potenciómetro conectado a un pin de entrada analógica. Esto recrearía efectivamente una forma alternativa de la función analogWrite ().

    Formas de onda de salida PWM rápidas.
    Figura\(\PageIndex{1}\): Formas de onda de salida PWM rápida.

    This page titled 28.3: Modo PWM rápido 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.