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:
Adjunto link del video del dimer en funcionamiento y el rar con el proyecto.
Video:
Ayúdenme Por favor!!
Gracias!!
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;
}
Video:
Ayúdenme Por favor!!
Gracias!!