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. =20MHz y =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:
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.
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 . A partir de esta fórmula,
obtenemos
dónde , y es el valor del preescalador Timer2 (1, 4 o 16).
Por lo tanto, si queremos , y eligiendo , obtenemos . Debemos elegir valores más altos para sólo si supera los 8 bits ( ) para la preescala dada.
Ahora calculamos la resolución PWM máxima para la frecuencia dada:
eso nos da 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 , eso es, bits como la parte más significativa, y y (bits 5 y 4 de ) los bits menos significativos. Llamemos a este valor , o simplemente . (x es el número del PCCh)
En nuestro caso, dado que tenemos una resolución máxima de PWM de bits, el ciclo de trabajo PWM (es decir, el valor de ) debe ser un valor entre y . Entonces, si queremos un ciclo de trabajo del 50%, .
La fórmula dada en la hoja de datos (también en el documento vinculado),
nos da la duración del pulso, en segundos. En nuestro caso, es igual a . Desde , es obvio que tenemos un ciclo de trabajo del 50 %.
Dicho esto, para calcular DCx en términos de ciclo de trabajo como , hacemos:
Respondiendo a tus otras preguntas:
2) La resolución de su pulso PWM con período es
3) Porque CCPRxL junto con DCxB1 y DCxB0 determinan la duración del pulso. Configurar CCPRxL con un valor más alto que significa una duración de pulso más alta que el período PWM y, por lo tanto, obtendrá un plano 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.
noufal
PR2
valor de registro?