LED路灯\吸顶灯具有明显的环保节能优势,而实时的控制LED亮度和功率消耗,在节能减排方面具有重要的意义;如LED路灯可以分时间段的(白天、黄昏、晚上、深夜)、或者按天气实时明亮变化(如雷雨阴暗天气、大太阳天气等)自动调整LED输出电流功率,保持需要的输出照度,从而节省的电源的开支,减少了二氧化碳的排放。 LED驱动器一般具有PWM输入控制模式,要达到上述的工作模式,需要我们配套一支智能PWM信号发生器,PWM发生器在完成各种智能控制的时间里不允许打断PWM的连续输出,否则会产生明显的闪烁感;因此本人利用MCU的PCA模块输出PWM调制信号,可以保证PWM的连续输出,同时可以利用中断功能实现各种工作模式的控制,方便于接入网络实现上位机的实时监测。 我们可以选择具有实用于LED的有PCA模块的MCU,本人用STC公司的MCU进行的分析试验,STC公司的MCU是增强型单片机,在51工业级模式上又增加了PCA、DAC、SPI等等,使得我们的MCU系统硬件可以大大的简化,性能却非常的优秀,非常适用于高电磁干扰、环境恶劣的地方。 在生成PWM信号时我们要先了解驱动的PWM控制参数,如频率、输入阻抗、功耗等;然后确定PWM硬件电路,最后编写PWM程序。 以下是编写的程序: //--------------芯片STC12C5A60S2--晶振11.0592M---- //------------------LED日光灯PWM红外遥控接收程序------- #include <stc12c5a.h> #define uint unsigned int #define uchar unsigned char sbit LED_LE=P3^4; sbit IR_RE=P3^2; sbit p01=P0^1; //----开关检测输入 sbit p02=P0^2; //----开关检测输入 uchar pulse=0x10;//定义PWM步进变量 static uchar date[4]={0,0,0,0}; static uchar qinlong; static uchar ZKB1,ZKB2; //------------------------- void delay882() { uchar i,j; i=35; do{j=68; do{j--;} while(j); i--; }while(i); } //------------------------- void delay1000() { uchar i,j; i=39; do{j=70; do{j--;} while(j); i--; }while(i); } //------------------------- void delay2400() { uchar i,j; i=93; do{j=70; do{j--;} while(j); i--; }while(i); } //////////////////////////////////////// void delay5ms(void)//5ms去抖动延时 { unsigned int tempcyc=1000; while(tempcyc--); } //-------------------------------------- void delayya() { uint i; for(i=0;i<30000;i++); } //====================================== void sezi() { LED_LE=0; EA=1; EX0=1; //允许外部0中断 IT0=1; //外部0中断使用下降沿触发 //---------- // TMOD=0x01;//------定时器0中断设置//需要用定时中断才用,一般不需用 // TH0=0xff; //因为会有中断干扰的现象,影响PWM输出的连续性. // TL0=0xf0; // ET0=1; // TR0=1; //---------- CMOD=0x80;//------PCA模块PWM设置 CCON=0x00;//CMOD=0X84为T0为信号源,这时将T0设置段落打开//0X80时则用12分频时钟信号 CL=0x00; //CMOD=0X86使用外部脉冲信号,从P1.2脚加入信号 CH=0x00; CCAPM0=0x42; PCA_PWM0=0x00; CR=1; } //***********************************************/ //===================0.5-9.5ms的延时调光信号============= void main() { uchar j=5; sezi(); while(1) { if(qinlong==0x00) { CCAP0H=(256-250); qinlong=0xff; } else if(qinlong==0x01) { CCAP0H=(256-240); qinlong=0xff; } else if(qinlong==0x02) { CCAP0H=(256-220); qinlong=0xff; } else if(qinlong==0x03) { CCAP0H=(256-200); qinlong=0xff; } else if(qinlong==0x04) { CCAP0H=(256-180); qinlong=0xff; } else if(qinlong==0x05) { CCAP0H=(256-160); qinlong=0xff; } else if(qinlong==0x06) { CCAP0H=(256-150); qinlong=0xff; } else if(qinlong==0x07) { CCAP0H=(256-100); qinlong=0xff; } else if(qinlong==0x08) { CCAP0H=(256-50); qinlong=0xff; } else if(qinlong==0x09) { CCAP0H=(256-10); qinlong=0xff; } //------------------------------------------以下开关检测输入 else if(!p01) delay5ms(); if(!p01) { CCAP0H=CCAP0H+j; delayya(); if(CCAP0H>=250)CCAP0H=250; } //----------------- else if(!p02) delay5ms(); if(!p02) { if(CCAP0H<=10)CCAP0H=10; CCAP0H=CCAP0H-j; delayya(); } } } //=====================红外线中断========================
|