Dimmer LED 18F4520 - PWM por Software - Leds parpadean

Hola amigos, hace poco posteé con algo relacionado a este proyecto, pero que no tiene nada que ver con esta consulta.
Como ya he comentado estoy trabajando en un dimmer de 3 canales controlado por Bluetooth (RS232).

Todo funciona bastante bien, el problema es que cuando ejerzo control sobre el PIC para aumentar/disminuir intensidad los LEDs parpadean mucho, incluso he notado que los canales influyen entre sí.

Las salidas del PWM del pic estan conectadas a 3 MOSFET IRF634, con una Rgate=22ohm, el surtidor a tierra y la tira de LEDS entre vcc(12v) y drenador.
El programa es el siguiente:

Código:
/*******************************************************************************
********************************************************************************
Programa para PIC18F4520 en placa de desarroyo SURE DB-DP113 que controla tres
ciclos  PWM para  ajustar la intensidad de tres LEDs conectados a las entradas
RB1, RB2 y RB3.  Ademas muetra en pantalla la intensidad en % y la temperatura 
obtenida  por el  sensor de  temperatura  LM75 incluido  en la propia placa de 
desarroyo.

  El control de los ciclos PWM  se controla mediante comunicacion serie RS-232 
pines RC6 y RC7.Estos estan conectados a un modulo bluetooth HC-06, para poder 
ser controlado inalambricamente atravez de un smatphone Android.

  El  sensor de  temperatura LM75 se comunica con el PIC mediante comunicacion
I2C atravez de los pines RC3 y RC4.
********************************************************************************
*******************************************************************************/

#include "Dimmer_BT.h"

#Define led1   PIN_B1                           //salida PWM1 (LED1)      
#Define led2   PIN_B2                           //salida PWM2 (LED2)
#Define led3   PIN_B3                           //salida PWM3 (LED3)
#define L1ON   49                               //dato de control,On/Off LED1. Corresponde al caracter '1' (ASCII=>49) 
#define L2ON   50                               //dato de control,On/Off LED2. Corresponde al caracter '2' (ASCII=>50)
#define L3ON   51                               //dato de control,On/Off LED3. Corresponde al caracter '3' (ASCII=>51)
#define mas1   52                               //dato de control,aumenta ciclo LED1. Corresponde al caracter '4' (ASCII=>52)
#define menos1 53                               //dato de control,disminuye ciclo LED1. Corresponde al caracter '5' (ASCII=>53)
#define mas2   54                               //dato de control,aumenta ciclo LED2. Corresponde al caracter '6' (ASCII=>54)
#define menos2 55                               //dato de control,disminuye ciclo LED2. Corresponde al caracter '7' (ASCII=>55)                          
#define mas3   56                               //dato de control,aumenta ciclo LED3. Corresponde al caracter '8' (ASCII=>56)
#define menos3 57                               //dato de control,disminuye ciclo LED3. Corresponde al caracter '9' (ASCII=>57)

#include "lcd.c"                                //Libreria para la pantalla LCD         
#include "LM75CIM3.c"                           //Libreria para el sensor de temperatura LM75
                                                //que se comunica por I2C.

//Declaracion de  funciones

void PWM(int ciclo1, int ciclo2, int ciclo3);   //Crea tres PWM por sofware utilizando el TMR0
void entrada_de_datos();                        //Recoge el dato recibido por comunicacion serie RS-232
void control(int BTin);                         //Ejerce el control sobre los LEDs y el duty de los PWM, segun el dato recibido.
void escribir_lcd();                            //Escribe en pantalla el esado de cada LED y la temperatura                            
void enviando_estado();                         //Envia el estado del sistema por RS232.

int BTin=0, ciclo1=0, ciclo2=0, ciclo3=0, BL1=1, BL2=1, BL3=1;
int ld1,ld2,ld3;
float temp=99.9, t=0;

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||  M  A  I  N  |||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void main(){
   setup_adc_ports(NO_ANALOGS|VSS_VDD);            //Desactiva entradas analogicas
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);               
   setup_psp(PSP_DISABLED);                        //desactiva PSP
   setup_spi(SPI_SS_DISABLED);                     //Desactiva SPI
   setup_wdt(WDT_OFF);                             //Desactiva el watchDog
   setup_timer_0(RTCC_DIV_256|RTCC_8_BIT);         //Activo TMR0, con divisor 128 y que trabaje solo con 8bits
   setup_timer_1(T1_DISABLED);                     //Desactivo los demas temporizadores
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);                  //desactivo el modulo CCP
   setup_vref(FALSE);                              //desactivo tension de referencia
   DISABLE_INTERRUPTS(GLOBAL);

   escribir_lcd();                                 //Escribir LCD por primera Vez
   
   while(true){                                    //bucle infinito
      if(kbhit()){                                 //si recivo algun dato
         
         BTin=GETC();
         entrada_de_datos();                       //lo guardo en BTin
         control(BTin);                            //y segun sea, ejerzo el control pertinente
      }
      PWM(ciclo1, ciclo2, ciclo3);                 //Si no, saco los 3 PWMs por RB1, RB2 y RB3.

   }
}

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||  ENTRADA DE DATOS  ||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void entrada_de_datos() {
   delay_ms(10);
   printf("\f");
   printf("OK");
   switch(BTin){
      case  L1ON: 
               BL1=!BL1;
               break;
      case  L2ON: 
               BL2=!BL2;
               break;
      case  L3ON: 
               BL3=!BL3;
               break;
      case  mas1:
               if(ciclo1<250)
                  ciclo1=ciclo1+25;
               break;
      case menos1:
               if(ciclo1>5)
                  ciclo1=ciclo1-25;
               break;          
      case  mas2:
               if(ciclo2<250)
                  ciclo2=ciclo2+25;
               break;
      case menos2:
               if(ciclo2>5)
                  ciclo2=ciclo2-25;
               break;
      case  mas3:
               if(ciclo3<250)
                  ciclo3=ciclo3+25;
               break;
      case menos3:
               if(ciclo3>5)
                  ciclo3=ciclo3-25;
               break;
   }
   return;
}

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||  C O N T R O L  |||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void control(BTin) {
   if(BL1==1 && BTin==L1ON)
      ciclo1=0;
   else if(BL1==0 && BTin==L1ON) 
      ciclo1=255;
   
   if(BL2==1 && BTin==L2ON)
      ciclo2=0;
   else if(BL2==0 && BTin==L2ON) 
      ciclo2=255;
      
   if(BL3==1 && BTin==L3ON)
      ciclo3=0;
   else if(BL3==0 && BTin==L3ON) 
      ciclo3=255;
   
   if(ciclo1==5)      ciclo1=0;
   if(ciclo1==255)    ciclo1=250;
   if(ciclo2==5)      ciclo2=0;
   if(ciclo2==255)    ciclo2=250;   
   if(ciclo3==5)      ciclo3=0;
   if(ciclo3==255)    ciclo3=250;       
      
   escribir_lcd();
   return;
} 

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||   P  W  M   |||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void PWM(int ciclo1, int ciclo2, int ciclo3){
   if (ciclo1>get_timer0()) output_high(led1);
   else output_low(led1);
   
   if (ciclo2>get_timer0()) output_high(led2);      
   else output_low(led2);
   
   if (ciclo3>get_timer0()) output_high(led3);
   else output_low(led3);
   
   return;
}

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||| ESCRIBIR EN LCD ||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void escribir_lcd(){
   
   ld1=ciclo1*0.4;
   ld2=ciclo2*0.4;
   ld3=ciclo3*0.4;   
                                  //DESCOMENTAR SOLO SI ESTA CONECTADO EL SENSOR (LM75), SINO SE CUELGA EL PIC.
   init_temp();                   //Inicializar sensor LM75
   t=0.1*read_full_temp();        //Leer temperatura en grados farenheit
   temp=(t-32)/1.8;               //convertir a grados centigrados 
   
   lcd_init();
   lcd_gotoxy(1,1);
   printf(lcd_putc,"LD1 LD2 LD3 TEMP");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%03u %03u %03u %0.2f",ld1,ld2,ld3,temp);
   enviando_estado();   
   return;
}

/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||| ENVIAR ESTADO POR RS232 |||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
void enviando_estado(){
   printf("\f");
   printf("LED1 = %03i%% \r",ld1);
   printf("LED2 = %03i%% \r",ld2);
   printf("LED3 = %03i%% \r",ld3);
   printf("TEMP = %0.1fºC \r",temp);
   
   return;
}
Adjunto link del video del dimer en funcionamiento y el rar con el proyecto.
Video:

Ayúdenme Por favor!!
Gracias!!
 

Adjuntos

  • Dimmer BT 18F4520.rar
    1.8 MB · Visitas: 62
Pors si a alguien le interesa, lo he solucionado.
El problema estaba en que la funcion PWM no tenia prioridad, y cada vez que actuava sobre el sistema esta era desatendida, de hay los parpadeos.
La solucion ha sido hacer el PWM utilizando la interrupcion del TMR0, asi doy prioridad a la actuacion sobre las salidas.
Un saludo!
 
Hola amigo!.
Pues el modulo que he utilizado es el HC-06. Trabaja a 3.3v asi que no es recomendable conectar el Rx directamente al PIC, si este esta trabajando a 5v.
Aunque yo lo he conectado directamente y funciona a la perfeccion.
Busca el datasheet del modulo, tienes toda la informacion necesaria, incluido esquemas de como conectarlo.

Un saludo!
 
HOLA, estoy intentando compilar este programa que lo descargue desde el libro mikroC pero me marca muchos errores, alguien me podria ayudar por favor porque la verdad no se porque este mal y esque la verdad no se utilizar pwm, solo quiero que con un pudh button subir y con otro bajar el brillo de unos led. es para el pic 16f887
 

Adjuntos

  • pwm.txt
    2 KB · Visitas: 22
arturkick hola man mira pero que esto esta en mikrobasic o lo queres en mikroc??? porque con gusto te paso ejemplos de pwm pero en mikroc
 
Atrás
Arriba