¿Cómo selecciono qué valores cargar en el registro CCPR1L (para generar la señal PWM con PIC)?

3

Necesito generar una señal PWM con el microcontrolador PIC18F2550 a cerca de 20kHz. Leí la hoja de datos, la encontré demasiado compleja y confusa, luego comencé a buscar un código de muestra en la red para finalmente ver esta herramienta PWM .

Lo usé con los parámetros \ $ F_ {OSC} \ $ = 20MHz y \ $ F_ {PWM} \ $ = 20kHz para generar estos dos códigos diferentes para los correspondientes dos porcentajes de ciclos de trabajo diferentes.

// Duty cycle = 0%
PR2 = 0b11111001 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00000000 ;
CCP1CON = 0b00001100 ;

// Duty cycle = 100%
PR2 = 0b11111001 ;
T2CON = 0b00000100 ;
CCPR1L = 0b11111001 ;
CCP1CON = 0b00111100 ;

La hoja de datos me dice que los bits 4 y 5 del registro CCP1CON son los LSB del valor del "ciclo de trabajo PWM con", y sus MSB se almacenan en el registro CCPR1L, ¿no?

Eso hace que, para un ciclo de trabajo del 0%, la temporización del ciclo de trabajo PWM de 10 bits sea,

00000000 + 00 = 0x000

Y para el ciclo de trabajo del 100%,

11111001 + 11 = 0x3E7

Entonces, de acuerdo con esta herramienta, debo establecer los valores entre 0x000 y 0x3E7 en los registros PWM relevantes para que tengan relaciones de ciclo de trabajo entre 0% y 100%. En este punto me confundo y surgen las siguientes preguntas en mi mente:

  • ¿Qué es este valor 0x3E7 ? ¿Cómo se calcula? ¿Cómo lo encontraría yo mismo si no hubiera tenido una herramienta en línea?
  • ¿Cuál es la resolución de esta señal PWM (es decir, cuál es la diferencia de tiempo de la duración de dos ciclos de trabajo para dos valores secuenciales como 0x3E6 y 0x3E7)?
  • ¿Por qué no puedo cargar valores más altos en el registro CCPR1L como todos (0xFF); eso haría 0x3FF para el valor total de la duración del ciclo de trabajo PWM. ¿Qué pasa si lo hago?
  • La herramienta dice que, puedo usar la función PWM solo con una resolución de 9 bits con los parámetros de trabajo que especifiqué. Entonces, ¿por qué el número 0x3E7 es un número de 10 bits? ¿El "9 bits" proviene de un valor truncado de enteros de \ $ log_2 (0x3E7) \ $?

Esta fue una pregunta larga, pero me ayudaría enormemente si alguien me explicara los pasos generales y la lógica de la creación de señales PWM con microcontroladores PIC.

Gracias.

    
pregunta hkBattousai

2 respuestas

2

Sé que es un poco tarde, pero acabo de tener esta duda. Después de mirar a mi alrededor, encontré este Microchip Doc que muestra algunos ejemplos.

Primero, calculamos \ $ \ text {PR2} \ $. De esta fórmula,

$$ F_ \ text {PWM} = \ dfrac {1} {(\ text {PR2} + 1) \ veces 4 \ veces T_ \ text {OSC} \ times \ text {T2CKPS}} $$

obtenemos

$$ \ text {PR2} = \ dfrac {1} {F_ \ text {PWM} \ veces 4 \ veces T_ \ text {OSC} \ times \ text {T2CKPS}} - 1 $$

donde \ $ T_ \ text {OSC} = 1 / F_ \ text {OSC} \ $, y \ $ \ text {T2CKPS} \ $ es el valor del preescalador Timer2 (1, 4 o 16).

Por lo tanto, si queremos \ $ F_ \ text {PWM} = 20 \ text {kHz} \ $, y seleccionando \ $ \ text {T2CKPS} = 1 \ $, obtenemos \ $ \ text {PR2} = 249 \ $. Deberíamos elegir valores más altos para \ $ \ text {T2CKPS} \ $ solo si \ $ \ text {PR2} \ $ excede los 8 bits (\ $ \ text {PR2} \ gt 255 \ $) para la preescala dada.

Ahora calculamos la resolución máxima de PWM para la frecuencia dada:

$$ \ text {resolución máxima de PWM} = \ log_2 (\; \ dfrac {F_ \ text {OSC}} {F_ \ text {PWM}} \;) $$

Eso nos da \ $ 9.9658 \ $ bits (lo sé, suena raro, pero lo usaremos así más adelante).

Ahora, vamos a calcular el ciclo de trabajo de PWM. Se especifica mediante el valor de 10 bits \ $ \ text {CCPRxL: DCxB1: DCxB0} \ $, es decir, \ $ \ text {CCPRxL} \ $ bits como la parte más significativa, y \ $ \ text {DCxB1} \ $ y \ $ \ text {DCxB0} \ $ (bits 5 y 4 de \ $ \ text {CCPxCON} \ $) los bits menos significativos. Llamemos a este valor \ $ \ text {DCxB9: DCxB0} \ $, o simplemente \ $ \ text {DCx} \ $. (x es el número de PCC)

En nuestro caso, dado que tenemos una resolución máxima de PWM de \ $ 9.9658 \ $ bits, el ciclo de trabajo de PWM (es decir, el valor de \ $ \ text {DCx} \ $) debe ser un valor entre \ $ 0 \ $ y \ $ 2 ^ {9.9658} - 1 = 999 \ $. Entonces, si queremos un ciclo de trabajo del 50%, \ $ \ text {DCx} = 0.5 \ veces 999 = 499.5 \ aproximadamente 500 \ $.

La fórmula dada en la hoja de datos (también en el documento vinculado),

$$ \ text {ciclo de servicio} = \ text {DCx} \ times T_ \ text {OSC} \ times \ text {T2CKPS} $$

nos da la duración del pulso, en segundos. En nuestro caso, es igual a \ $ 25 \ text {ns} \ $. Dado que \ $ T_ \ text {PWM} = 50 \ text {ns} \ $, es obvio que tenemos un ciclo de trabajo del 50%.

Dicho esto, para calcular DCx en términos del ciclo de trabajo como \ $ r \ en [0,1] \ $, lo hacemos:

$$ \ text {DCx} = \ dfrac {r \ times T_ \ text {PWM}} {T_ \ text {OSC} \ times \ text {T2CKPS}} = \ dfrac {r \ times F_ \ text { OSC}} {F_ \ text {PWM} \ times \ text {T2CKPS}} $$

Respondiendo a tus otras preguntas:

2) La resolución de su pulso PWM con el período \ $ T_ \ text {PWM} \ $ es

$$ \ dfrac {T_ \ text {PWM}} {2 ^ \ text {max PWM res}} $$

3) Porque CCPRxL, junto con DCxB1 y DCxB0, determinan la duración del pulso. Configurar CCPRxL con un valor mayor que \ $ 2 ^ \ text {max PWM res} - 1 \ $ significa una duración de pulso más alta que el período de PWM, y por lo tanto obtendrá una señal plana de $ V_ {DD} \ $. / p>     

respondido por el Gutierrez PS
1

Cuando se usa un prealario 1: 1 en TMR2, el valor CCPR1L representa el número total de ciclos de CPU de "encendido" para cada ciclo PWM. Con un prescalar de 4: 1, representa el número de incrementos de conteo de cuatro ciclos, etc.

El bit 0 del registro CCP1CON retrasa cada ciclo de apagado en 1/4 de un incremento de conteo; el bit 1 lo demora 1/2. Los efectos son acumulativos. Tenga en cuenta que en los PIC anteriores, estos bits no tienen efecto si CCPR1L es cero; si la salida nunca se enciende, retrasar el apagado no tendrá ningún efecto.

El valor en PR2 establece el intervalo entre el inicio de un ciclo de PWM y el comienzo del siguiente. Si se establece PR2 en un valor de 99 y se selecciona un valor prescalar de 1: 1, entonces se iniciará un ciclo PWM cada 100 ciclos de reloj (uno más grande que el valor programado). Si uno establece CCPR1L en 12 y establece los dos bits inferiores de CCP1CON en '1', '0', entonces cada 100 ciclos de CPU, la salida PWM será alta durante doce ciclos completos de CPU más un semiciclo adicional, para un ciclo de trabajo neto de 1/8.

    
respondido por el supercat

Lea otras preguntas en las etiquetas