Distribuir una señal PWM con el CCP2 [PIC16F887+CCS Compiller]

Muy buenas tardes compañeros del foro.

He estado intentando controlar varios LEDs con una única señal PWM pero no lo logro, para empezar explico mi circuito:

imagedata.php


Primeramente Q1 lo uso como un switch general, que envía la señal PWM al LED D2, D3, D4 o D5, dependiendo de que mofet active.

Como dato mi señal PWM es de 10kHz. Ahora mi codigo para distribuir la señal, es el siguiente:

Código:
L1=0;
L2=10000;

while(1){ 
 
   output_high(pin_d0);    // Se activa D0 para controlar el LED D2
   set_pwm2_duty(L1);      // Se actualiza el ciclo de servicio
   delay_us(500);          // Se da un retardo para entregar 5 pulsos de la PWM
                           // al LED D2
   output_low(pin_d0);     // Se apaga D0 para poder controlar el siguiente LED
   
   output_high(pin_d1);    // Se activa D1 para controlar el LED D3
   set_pwm2_duty(L2);      // Se actualiza el ciclo de servicio
   delay_us(500);          // Se da un retardo para entregar 5 pulsos de la PWM
                           // al LED D2
   output_low(pin_d1);     // Se apaga D0 para poder controlar el siguiente LED
   L1=L1+10;               // Se aumenta la señal PWM para LED D2
   L2=L2-10;               // Se decrementa la señal PWM para LED D3
}

Lo que he hecho es montarlo en un protoboar, pero no funciona, a la salida del CCP2 coloco un LED y el LED ni siquiera titila.
Por el contrario, si pongo una única señal PWM, si funciona, por ejemplo:

Código:
while(1){ 

   set_pwm2_duty(L1);      // Se actualiza el ciclo de servicio
   delay_ms(10);          

   L1=L1+10;               // Se aumenta la señal PWM para LED D2
   if(L1>=10000)L1=0;

}

Funciona al 100%.

Como dije antes, mi problema es cuando conmuto los mosfets Q2, Q3, Q4, o Q5 para controlar individualmente el brillo de los LEDs.

Espero alguién me pueda decir que es lo que estoy haciendo mal.

Muchas gracias de antemano. ...
 
Última edición:
Como dato, mi señal PWM es de 10kHz.
Supongamos que usaste el prescaler del Timer 2 en 1:1 y que tienes una FOsc. de 4 MHz.
Entonces el valor para CCPR2L con un ciclo activo del 100%, sería de 100, que viene siendo el valor máximo que se debe establecer en la instrucción set_pwm2_duty (value);
Y en tu programa estás estableciendo como máximo un valor de 10000 :eek:

Si el prescaler seleccionado fuera 1:4, el valor máximo para el ciclo activo al 100 % sería 25
Y con el prescaler a 1:16 el valor máximo sería 6

¿Cuál es la configuración que tienes para el Timer 2 y a qué frecuencia está funcionando el PIC?
 
Muy buenas tardes D@rkbytes, antes que nada muchas gracias por responder.

Respondiendo a los datos que me solicitas, el pic está a "4 MHz" y el TMR2 "setup_timer_2(T2_DIV_BY_4, 99, 1);"

Ya logre por lo menos obtener una señal en el pin de CCP2, lo logré desactivando el módulo CCP y activandolo nuevamente, tal como se ve en el código.
Código:
void main() {                 // Función principal

   set_tris_c(0b10000000);    // Se configura el puerto C cómo salida, menos el 
                              // puerto RX
   set_tris_d(0b00000000);    // Se configura el puerto d cómo salida
   
   output_d(0);               // Asegura que el puerto D esté apagado
   output_c(0);               // Asegura que el puerto C esté apagado
   
   // Se configura el TMR2 con periodo de 99, prediv de 1:4 y postdiv de 1:1
   
   setup_timer_2(T2_DIV_BY_4, 99, 1);

   set_pwm2_duty(L1);  // Inicia la señal PWM en el pin C1



/*                Inicia la generación de la señal PWM.
                  Se configura el módulo CCP2 en modo PWM
                  con TPWM = 100 us (FPWM = 10 kHz)
*/

   setup_ccp2(CCP_PWM);       // La señal PWM se genera a partir de aquí

L1=0;
L2=10000;

while(1){ 
 
   
   output_high(pin_d0);    // Se activa D0 para controlar el LED D2
   set_pwm2_duty(0);      // Se actualiza el ciclo de servicio
   delay_us(500);           // Se da un retardo para entregar 5 pulsos de la PWM
                                  // al LED D2
   output_low(pin_d0);     // Se apaga D0 para poder controlar el siguiente LED
//-----------------------------------------------------------------------------   
   setup_ccp2(CCP_OFF);    // Se apaga el módulo CCP2
   setup_ccp2(CCP_PWM);    // La señal PWM se genera a partir de aquí
//-----------------------------------------------------------------------------   
   output_high(pin_d1);    // Se activa D1 para controlar el LED D3
   set_pwm2_duty(50000);      // Se actualiza el ciclo de servicio
   delay_us(500);          // Se da un retardo para entregar 5 pulsos de la PWM
                           // al LED D2
   output_low(pin_d1);     // Se apaga D0 para poder controlar el siguiente LED
//-----------------------------------------------------------------------------   
   setup_ccp2(CCP_OFF);    // Se apaga el módulo CCP2
   setup_ccp2(CCP_PWM);    // La señal PWM se genera a partir de aquí
//-----------------------------------------------------------------------------   
   ///L1=L1+1;               // Se aumenta la señal PWM para LED D2
   //L2=L2-1;               // Se decrementa la señal PWM para LED D3
   
  

}
}

La idea de este programa en que un led incremente y el otro decremente, hablando de sus intensidades respectivas. Para despues hacer modificaciones y poder controlar mas de 2 leds con un solo CCP.

Los retardos que doy de "delay_us(500);" son para que en ese tiempo el CCP dé cinco pulsos, dado que cada pulso es de 100 us.

Pregunta, para este caso habría diferencia en aumentar la velocidad del Fosc?

Sin más de momento quedo a la espera de tus comentarios D@rkbytes.

Saludos.
 
Respondiendo a los datos que me solicitas, el PIC está a "4 MHz." y el TMR2 "setup_timer_2(T2_DIV_BY_4, 99, 1);"

Los retardos que doy de "delay_us(500);" son para que en ese tiempo el CCP dé cinco pulsos, dado que cada pulso es de 100 us.

Pregunta, para este caso habría diferencia en aumentar la velocidad del Fosc?
OK. No tiene caso, si con 4 MHz. puedes generar perfectamente 10 KHz.

Aún sigues estableciendo un valor demasiado alto para el ciclo activo.
Ya te mencioné que el valor máximo para un ciclo activo del 100 %, es 100 con 4 MHz de FOsc.

Lee la hoja de datos para que realices cálculos precisos, porque el valor que estás usando para el ciclo activo, no es correcto.
Ahora veo que lo aumentaste a 50000
 
Ok.

Leyendo el datasheet, entiendo que el ciclo activo iría de la mano con la frecuencia, por que al yo tener un ciclo activo con valor máximo de 100 mi frecuencia sería de 100 Hz, o no necesariamente? O en todo caso al ser el valor maximo de 10000 y prediv de 4, mi valor máximo sería de 2500, es decir se perdería precisión.

Ahora bien, la frecuencia la puse tan alta por que estoy dedicando 500us a un LED, para que prenda y apague con el valor del PWM en ese instante y 500us a otro LED, y así no se vea el parpadeo

En el transcurso que uno se apaga para que el otro reciba la señal PWM, con una Frecuencia de 1000 Hz, se alcanza a ver esa conmutación.

Tal vez ya me confundí un poco con lo del ciclo activo, una disculpa.
 
Leyendo el datasheet, entiendo que el ciclo activo iría de la mano con la frecuencia, por que al yo tener un ciclo activo con valor máximo de 100 mi frecuencia sería de 100 Hz, o no necesariamente? O en todo caso al ser el valor maximo de 10000 y prediv de 4, mi valor máximo sería de 2500, es decir se perdería precisión.
No. La frecuencia del oscilador si se relaciona directamente con la frecuencia PWM a generar, pero no con el ciclo activo.
De cierta forma sí, pero eso depende más que nada de los valores asignados al Timer 2 conforme a la frecuencia requerida.
Tal vez ya me confundí un poco con lo del ciclo activo.
Si, si estás algo confundido sobre lo referente al ciclo activo.

Aquí te dejo un programa que realicé hace tiempo para configurar los parámetros requeridos.
Sin embargo, si te recomiendo que leas bien la sección 11.0 CAPTURE/COMPARE/PWM MODULES (CCP1 AND CCP2)
Y en el apartado 11.5.1 encontrarás las fórmulas correspondientes.

Suerte.
 

Adjuntos

  • Setup PWM.rar
    5 KB · Visitas: 134
Última edición:
Atrás
Arriba