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

Necesito generar una señal PWM con el microcontrolador PIC18F2550 a cerca de 20 kHz. 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 parámetros. F O S C =20MHz y F PAG W METRO =20kHz para generar estos dos códigos diferentes para dos porcentajes de ciclo de trabajo diferentes correspondientes.

// 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 "ciclo de trabajo PWM con", y sus MSB se almacenan en el registro CCPR1L, ¿no es así?

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

00000000 + 00 = 0x000

Y para un 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 tener relaciones de ciclo de trabajo entre 0% y 100%. En este punto me confundo y surgen las siguientes preguntas en mi mente:

  • ¿ Cuál es este valor 0x3E7 ? ¿Cómo se calcula? ¿Cómo lo encontraría yo mismo si no hubiera tenido esa 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 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 de 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? ¿Los "9 bits" provienen del valor entero truncado de yo o gramo 2 ( 0 X 3 mi 7 ) ?

Esta resultó ser una pregunta larga, pero me sería de gran ayuda si alguien me explicara amablemente los pasos generales y la lógica de la creación de señales PWM con microcontroladores PIC.

Gracias.

Respuestas (2)

Sé que es un poco tarde, pero tengo esta duda. Después de mirar alrededor, me encontré con este Microchip Doc que muestra algunos ejemplos.

Primero, calculamos PR2 . A partir de esta fórmula,

F PWM = 1 ( PR2 + 1 ) × 4 × T OSC × T2CKPS

obtenemos

PR2 = 1 F PWM × 4 × T OSC × T2CKPS 1

dónde T OSC = 1 / F OSC , y T2CKPS es el valor del preescalador Timer2 (1, 4 o 16).

Por lo tanto, si queremos F PWM = 20 kHz , y eligiendo T2CKPS = 1 , obtenemos PR2 = 249 . Debemos elegir valores más altos para T2CKPS sólo si PR2 supera los 8 bits ( PR2 > 255 ) para la preescala dada.

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

resolución máxima de PWM = registro 2 ( F OSC F PWM )

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

Ahora, calculemos el ciclo de trabajo de PWM. Se especifica por el valor de 10 bits CCPRxL:DCxB1:DCxB0 , eso es, CCPRxL bits como la parte más significativa, y DCxB1 y DCxB0 (bits 5 y 4 de CCPxCON ) los bits menos significativos. Llamemos a este valor DCxB9:DCxB0 , o simplemente DCx . (x es el número del PCCh)

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

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

ciclo de trabajo = DCx × T OSC × T2CKPS

nos da la duración del pulso, en segundos. En nuestro caso, es igual a 25 ns . Desde T PWM = 50 ns , es obvio que tenemos un ciclo de trabajo del 50 %.

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

DCx = r × T PWM T OSC × T2CKPS = r × F OSC F PWM × T2CKPS


Respondiendo a tus otras preguntas:

2) La resolución de su pulso PWM con período T PWM es

T PWM 2 resolución máxima de PWM

3) Porque CCPRxL junto con DCxB1 y DCxB0 determinan la duración del pulso. Configurar CCPRxL con un valor más alto que 2 resolución máxima de PWM 1 significa una duración de pulso más alta que el período PWM y, por lo tanto, obtendrá un plano V D D señal.

Cuando se usa un preescalar 1:1 en TMR2, el valor CCPR1L representa el número total de ciclos de CPU de "a tiempo" para cada ciclo de PWM. Con un preescalar 4:1, representa el número de incrementos de cuenta 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 retrasa a la mitad. Los efectos son acumulativos. Tenga en cuenta que en los PIC más antiguos, 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 PWM y el inicio del siguiente. Si se establece PR2 en un valor de 99 y se selecciona un preescalar 1:1, entonces se iniciará un ciclo PWM cada 100 ciclos de reloj (uno mayor 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 medio ciclo adicional, para un ciclo de trabajo neto de 1/8.

¿Qué significa resolución en PWM? y ¿cómo cambia como el valor del PR2valor de registro?