太阳能路灯控制器程序.doc

上传人:啊飒飒 文档编号:10386276 上传时间:2021-05-13 格式:DOC 页数:24 大小:136KB
返回 下载 相关 举报
太阳能路灯控制器程序.doc_第1页
第1页 / 共24页
太阳能路灯控制器程序.doc_第2页
第2页 / 共24页
太阳能路灯控制器程序.doc_第3页
第3页 / 共24页
太阳能路灯控制器程序.doc_第4页
第4页 / 共24页
太阳能路灯控制器程序.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《太阳能路灯控制器程序.doc》由会员分享,可在线阅读,更多相关《太阳能路灯控制器程序.doc(24页珍藏版)》请在三一文库上搜索。

1、/ Config2 Code Configuration File /在硬件初始化程序中中,如果开启电源监控功能,在软调试环境(UV2)下,ADC将不工作,此项目应加以注意/该程序主要包括如下几个模块/。蓄电池电压高低检测模块/。太阳能电池组件电压高低检测模块/。负载过电流检测模块/。过载恢复处理模块/以下为主要算法说明:/。负载过电流检测算法:如果负载处于关闭状态,负载电流返回值为0;否则返回实测值。/。负载过电流处理算法:如果电流低于检测值,电流积分值清零,取消过流标志。如果电流高于检测值,/负载电流进行积分,如果积分值高于设定值,置位过流标志。/。过渡恢复处理算法:如果过流标志为0,过流

2、恢复时标清零。如果过流标志为,过流恢复时标达到设定值,负载开启,并清除过流标志。/。温度补偿的算法:温度系数为36mv/度,系统每个字对应的电压值约为32-36mv;/所以补偿工式为:用于浮充电控制的蓄电池电压实测值环境温度25度/。#include c8051f330.h/#include temperatureref243.c#define ON 0#define OFF 1#define LAMP 1#define CON 0#define SIGVOL 60.4/定义1电压对应的字数-ref 2.447V/定义负载开关值,对于发光二极管刚好相反#define LOADOFF SIGVO

3、L*11.2/定义负载关闭电压值#define LOADON SIGVOL*12.5/定义蓄电池电量恢复电压值#define SOCM SIGVOL*12.3/定义蓄电池中电量,对应黄灯点亮时的电压12.3(24.6),#define OVERVOL SIGVOL*15.3/定义过压保护值#define ACCHAR SIGVOL*12/定义交流充电的阀值/以下两条设置过流启控值和过电流积分值#define OVERCURR 50/定义过流值 约10A#define TOVERCURR 255/定义过流积分值,每0.25秒累加一次,50A可持续约0.5S,10A可持续约3S/IRF3205的导

4、通电阻大约为8.3毫欧/SMP60N06的导通电阻大约为18.3毫欧/电压值对应列表/31.915.971000/3015 939 OVERVOL,负载关/2914.5907/28.414.2 /27.613.8864 FLLO 浮充/25.412.8795 LOADON 较充足/24.812.3 776 SOCM 适中/22.411.2701 LOADOFF不足及缺电,负载关/1v 64 SIGVOL 2电压对应的字数/电压值对应列表结束/电量指示灯的点亮算法/红灯点亮点空比 红闪100% 100% 0%/绿灯点亮点空比 0% 0% 100%/蓄电池电压 11.2 11.2+10个字 约12

5、.3-0.7 12.3 12.3+0.7(0.7V约20个字)/变量定义区unsigned int ubat;/定义蓄电池电压unsigned int upv;/定义太阳能电池电压unsigned int c_load;/负载电流unsigned inttc_load;/定义过载电流的积分值unsigned intlampcon;/定义开关灯控制变量signed char tempf;/定义温度signed int ccubat=0;/蓄电池浮充电压unsigned char gled_dcode;/绿色发光二极管工作代码unsigned char code_work;/定义工作代码unsig

6、ned int lamp_time;/定义开灯时间unsigned int night_time;/定义黑夜时间/时标定义区unsigned char chekbats_t;/定义蓄电池电量检查时标unsigned char overcurr_t;/过电流检测时标unsigned char chekbatp_t;/设定蓄电池缺电检查时标unsigned char chekbath_t;/设定电量恢复检查时标unsigned char charcon_t;/设定充电控制时标unsigned char chekpvg_t;/定义计算夜间时间时标unsigned char chekpvk_t;/定义

7、计算夜间时间计数器unsigned char time1s_t;/1S时标unsigned char over_cr_t;/过电流恢复控制时标unsigned int rled_t;/过电流恢复控制时标unsigned int gled_t;/过电流恢复控制时标unsigned chardiode_t;/防反充二极管控制时标unsigned int lamp_t;/定义开灯计时器unsigned int night_time_t;/定义黑夜时间定时器unsigned intsled_t;/单绿色发光二极管时标unsigned intchekbatovh_t;/过压检测时标unsigned in

8、tchekbatovs_t;/过压恢复检测时标unsigned char rledtime;/过电流恢复控制时标unsigned char gledtime;/过电流恢复控制时标unsigned char xdata *recode;/定义事件记录的指针变量unsigned int count;/定义用于事件记录的计数器unsigned char clock_h;/定义时钟小时unsigned char clock_m;/定义时钟分钟unsigned char clock_s;/定义时钟秒bitonoff;/定义事件位/标志位定义区bit lowbat_f; /定义蓄电池缺电标志bit hig

9、bat_f;/定义蓄电池过压标志bit over_curr_f; /定义过流标志bit lowpv_f;/定义太阳能电池组件电压标志bit sys24v_f; /定义系统电压标志,当此值为1时为24系统bit pvnor_f; /定义太阳能电池组件是否达到充电条件bit lightset_f; /定义光照设置的方向标志位bit overtime_f; /定义开灯时间到的标志位bit nightrecod_f; /定义夜间时间记录标志bit calcu_f; /定义开灯时间进行计算标志/端口定义区sbit LD = P02;/定义负载sbit DGLED = P10;/定义双色发光二极管的绿灯s

10、bit DRLED = P11;/定义双色发光二极管红灯的sbit GLED = P12;/定义单色发光二极管sbit AC_C = P06;/定义交流接口控制端sbit LU_S = P13;/定义光照设置按控制键sbit LAMP_CON = P20;/定义路灯和控制器的跳线/函数定义区void bootdir(void);/启动过程指示,两灯分别显示3次了void diode_con(void);/防反充二极管定时关断函数void work_mode(void);extern unsigned int ad_iload(void);/负载电流检测函数extern void Init_De

11、vice(void);/硬件初始化函数extern unsigned int ad_ubat(void);/负载电流检测函数extern unsigned int ad_upv(void);/负载电流检测函数extern void flash_e(unsigned int addr);extern unsigned char flash_r(unsigned int addr);extern void keyflash(void);/程序代码自动锁定过程extern void flash_w(unsigned int addr,unsigned char x);extern void char

12、_contr(void);void time_t2(void) interrupt 5 /定时器2中断服务程序,每50mS中断一次,频率为20Hz,16位自动重装模式TMR2CN = 0x04; / 清除中断标志,如不清除此标志,中断将反复发生,造成不正常。charcon_t+;/修改充电控制时标overcurr_t+;/过电流检测时标time1s_t+;/1S时标加1diode_t+;/防反充二极管控制时标if(time1s_t19)time1s_t=0;chekbath_t+;/蓄电池电量恢复检查时标加1chekbatp_t+;/缺电检测时标加1 chekbats_t+;/定义蓄电池电量检

13、查时标 chekpvg_t+;/定义太阳能电池组件关灯控制时标 chekpvk_t+;/定义太阳能电池组件开灯控制over_cr_t+;/过电流恢复控制时标lamp_t+;/开灯时间定时器night_time_t+;/黑夜时间定时器chekbatovh_t+;/过压检测时标chekbatovs_t+;/过压恢复检测时标clock_s+;if(clock_s59)/以下为时钟clock_s=0;clock_m+;if(clock_m59)clock_m=0;clock_h+;if(clock_h23)clock_h=0;void time_t3(void) interrupt 14 /定时器3中

14、断服务程序,约20mS中断一次,频率约为50Hz,16位自动重装模式/用于显示发光二极管TMR3CN = 0x04; / 清除中断标志,如不清除此标志,中断将反复发生,造成不正常。gled_t+;rled_t+;sled_t+;void lightset(void)/当双色发光二极管的红管向亮的方向变化时,绿色发光二极管点亮,向暗的方向变化时熄灭/当双色发光二极管的红管亮度变化达到极值时,双色发光二极管的绿色发光二极管点亮unsigned int temp_lamp;/定义一个用于控制模拟发光二极管点亮的临时时标if(LU_S=0)lightset_f=!lightset_f;/更改按键按下后

15、的修改方向if(lightset_f=1)/执行加的操作过程while(LU_S=0)if(diode_t=1)/借用过流检测时标,每一秒修改一次值diode_t=0;lampcon+;if(lampcon400)lampcon=400;DGLED=1;/越限处理elseDGLED=0;/没有达到极值时绿色发光二极管点灭temp_lamp+;if(temp_lamp=(lampcon-30)&DRLED=0)DRLED=1;temp_lamp=0;if(temp_lamp=(400-lampcon)&DRLED=1)DRLED=0;temp_lamp=0;GLED=0;/加数提示 PCA0CP

16、H2 = 0x00;/复位看门狗else/执行减的操作过程while(LU_S=0)if(diode_t=1)/借用过流检测时标,每一秒修改一次值diode_t=0;lampcon-;if(lampcon=(lampcon-30)&DRLED=0)DRLED=1;temp_lamp=0;if(temp_lamp=(400-lampcon)&DRLED=1)DRLED=0;temp_lamp=0;GLED=1;/减数提示 PCA0CPH2 = 0x00;/复位看门狗temp_lamp=lampcon;/以下过程将lampcon保存到FLASHflash_e(0x1a00);/PCA0CPH2 =

17、 0x10;/复位看门狗flash_w(0x1a00,temp_lamp%256);/PCA0CPH2 = 0x10;/复位看门狗flash_w(0x1a01,temp_lamp/256);void pv_chek(void)/太阳能电池组件电压高低检测模块upv=ad_upv();/采集太阳能电池电压if(sys24v_f=1)upv=upv/2;/将太阳能电池组件电压规一化到12V系统,主要是考虑12V和24V系统的夜间功能if(upv=10)/白天lowpv_f=0;overtime_f=0;/清除超时标志,以备天黑时启动负载if(code_work!=8)/当控制器没有工作于控制器模式

18、时,太阳能电池电压升高关负载。LD=OFF;/当太阳能电池组件电压较高时,(UPV设置值时),关灯,设置标志位elsechekpvg_t=0; if(upvlampcon+10)if(chekpvk_t=10)/黑夜lowpv_f=1;elsechekpvk_t=0;if(lowpv_f=0)/该程序段计算黑夜时间/白天到来,如果没有进行夜间长度修正进行修正if(nightrecod_f=0)/对黑夜时间进行计算if(night_time_t3600)if(night_time_t-600night_time)night_time=night_time+600;/对黑夜时间进行修正elseif

19、(night_time_t+600LOADON)/电量恢复检测处理过程if(chekbath_t=10)lowbat_f=0;elsechekbath_t=0;calcu_f=1;/设置开灯时间需要计算标志if(ubat=10)/此时间对应报警延迟时间lowbat_f=1;LD=OFF;elsechekbats_t=0;if(ubat=5)higbat_f=0;elsechekbatovs_t=0;if(ubatOVERVOL)if(chekbatovh_t=5)/过电压检检测过程higbat_f=1;LD=OFF;elsechekbatovh_t=0;if(PCA0CPH0100)calcu

20、_f=0;AC_C=0;/当充电电流为组件输出电流的五分之二时设置电量充足标志(开灯时间不需要计算)交流电停止充电if(ubat=5)overcurr_t=0;if(c_load=OVERCURR)/当大于过流值时,过电流进行积分,当有大于时,清零tc_load=tc_load+c_load;if(tc_load=TOVERCURR)LD=OFF;over_curr_f=1;tc_load=0;/当积分值大于时,关团负载设置过流标志。elsetc_load=0;/当发生过电流后,自动恢复处理,发生过流保护后,两分钟自动恢复if(over_curr_f=0)over_cr_t=0;elseif(

21、over_cr_t=10)/此时间对应过流的恢复时暗 overcurr_t=0;/过流检测延迟时间清零/过流时间超过2分钟,开启负载,(由于前一状态是过流,所以此处可开启负载)void bat_elec_disp(void)/计算红灯的点亮时间if(LD=OFF)rledtime=30;gledtime=0;/设置慢闪elseif(ubatLOADOFF)rledtime=20;/设置快闪elseif(ubat10)rledtime=10;/rledtime=10-rledtime;/计算绿灯的点亮时间if(ubatOVERVOL)gledtime=30;elsegledtime=(ubat-

22、(SOCM-40)/4;if(gledtime10)gledtime=10;/if(rledtime=30)/红灯慢闪,大概0.5Hz,占空比25%,此时蓄电池欠压负载关断if(rled_t=150&DRLED=1)DRLED=0;rled_t=0;if(rled_t=750&DRLED=0)DRLED=1;rled_t=0;elseif(rledtime=20)/红灯快闪大概2Hz,占空比25%,此时蓄电池欠压负载即将关断if(rled_t=20&DRLED=1)DRLED=0;rled_t=0;if(rled_t=60&DRLED=0)DRLED=1;rled_t=0;else/红灯处理过

23、程if(rledtime=0)DRLED=0;elseif(rled_t=rledtime&DRLED=1)DRLED=0;rled_t=0;if(rled_t=(10-rledtime)&DRLED=0)DRLED=1;rled_t=0;/绿灯处理过程if(gledtime=0)DGLED=0;elseif(gledtime=30)/绿灯慢闪,大概0.5Hz,占空比25%(此时蓄电池过压)if(gled_t=150&DGLED=1)DGLED=0;gled_t=0;if(gled_t=750&DGLED=0)DGLED=1;gled_t=0;elseif(gled_t=gledtime&DG

24、LED=1)DGLED=0;gled_t=0;if(gled_t=(10-gledtime)&DGLED=0)DGLED=1;gled_t=0;switch(gled_dcode)/绿色发光二极管的显示过程case 1:GLED=1; /快充电常亮break;case 2:/浮充电慢闪if(sled_t=150&GLED=1)GLED=0;sled_t=0;if(sled_t=750&GLED=0)GLED=1;sled_t=0;break;case 3:GLED=0; /组件没有接入或故障灭break; /关团负载控制过程void load_off(void)if(LD=ON)switch(

25、code_work)/case 1: if(lamp_t=lamp_time)overtime_f=1;LD=OFF; break;case 2: if(lamp_t=14400)overtime_f=1;LD=OFF;/设定时间到,无条件关灯,并设置超时标志。 break;case 3: if(lamp_t=21600)overtime_f=1;LD=OFF;break;case 4: if(lamp_t=28800)overtime_f=1;LD=OFF;break;case 5:if(lamp_t=36000)overtime_f=1;LD=OFF;break;case 6:if(lam

26、p_t=21600)overtime_f=1;LD=OFF;break;/default:void load_on(void)if(code_work=7)LD=0;/进入此工作模式时,负载初始工作状态为关GLED=1;/while(code_work=7)if(LU_S=0)while(LU_S=0)PCA0CPH2 = 0x00;LD=!LD;DRLED=!LD;DGLED=DRLED;work_mode();/读取控制器的工作模式char_contr();/充电控制pv_chek();/太阳能电池组件电压高低检测diode_con();/太阳能电池组件判断和防反充二极管控制 PCA0CP

27、H2 = 0x10;/复位看门狗/负载开启控制过程if(LD=OFF)/灯是关的if(lowbat_f=0&higbat_f=0)/蓄电池不缺电if(over_curr_f=0)/没有过流switch(code_work)/case 0: if(lowpv_f=1)LD=ON;/光控开灯break;case 1: if(lowpv_f=1)LD=ON;lamp_t=0;if(calcu_f=1)/蓄电池电量不足时,开灯时间由程序计算lamp_time=216*(ubat-LOADOFF)+1800;/lamp_time=(最长开灯时间6h最小开灯时间0h21600)*(ubat-LOADOFF

28、)/1.5V“100”;elselamp_time=65000;/电量充足时,开灯时间受光照控制。 break;case 2: if(lowpv_f=1&overtime_f=0)LD=ON;lamp_t=0;/lamp_time=14400组件低且时间未到(或超过)开灯,防止时间到后再次开灯 break;case 3: if(lowpv_f=1&overtime_f=0)LD=ON;lamp_t=0;break;case 4: if(lowpv_f=1&overtime_f=0)LD=ON;lamp_t=0;break;case 5:if(lowpv_f=1&overtime_f=0)LD=

29、ON;lamp_t=0;break;case 6:if(lowpv_f=1&overtime_f=0)LD=ON;lamp_t=0;/第一次开灯if(night_time-lamp_t5;switch(temp) case 7:code_work=0; break;case 3:code_work=1; break;case 5:code_work=2; break;case 1:code_work=3; break;case 6:code_work=4; break;case 2:code_work=5; break;case 4:code_work=6; break;case 0:code

30、_work=7; break;void bootdir(void)/启动过程指示,两灯分别显示3次unsigned char i;for(i=0;i=50)rled_t=0;DGLED=DGLED;DRLED=DRLED;i+;void init_system(void)over_curr_f=0;/负载没有过流LD=ON;/负载是开着的onoff=LD;lowbat_f=0;/蓄电池不缺电tc_load=0;/初化过流积分值c_load=0;/初化负载电流lowpv_f=1;/太阳能电池组件电压(夜间功能)初始化overcurr_t=0;/过流检测延迟时间清零night_time=43200

31、;/初始化夜间长度为12个小时AC_C=0;/交流电不充电recode=0x1800;/事件存储的初地址void inver_recode(void)/开关灯事件跟踪函数,前提是在事件记录过程中不能发生负载过流,一旦发生负载过流,/过流之前的事件将被记录,之后的数据不能被记录。该函数可记录160次事件,如一天开关灯各一次,可记录80天,如控制器工作于/61模式,也可记录40天。/如需要事件被记录,需人为产生一次过流情况,并在过流恢复后断电。事件被记录在从0x1800单元,个字节为一组数据/第一个数据为小时,第二个数据为分钟,第三个数据为开关状态,为关状态,0为开状态。if(onoff!=LD)

32、onoff=!onoff;*recode=clock_h;recode+;*recode=clock_m;recode+;*recode=onoff;recode+;if(recode0x19f0)recode=0x1800;if(over_curr_f=1&recode0x19f5)/当过流并且没有写过时将数据复制到,事件记录操作recode的值 /最大到0x19f0,当复制数据后,此值会变为0x19fb,所以可以保护数据只复制一次。recode=0x1800;flash_e(0x1800);while(recode=1023)sys24v_f=1;lampcon=flash_r(0x1A0

33、0)+flash_r(0x1A01)*256;/读取开关灯的组件参数 PCA0CPL2 = 0x13;/超时周期为1000毫秒 PCA0MD |= 0x40;/启动PWMwhile(1)work_mode();/读取控制器的工作模式if(sys24v_f=1)ubat=ad_ubat()1;/采集蓄电池电压elseubat=ad_ubat();char_contr();/充电控制pv_chek();/太阳能电池组件电压高低检测overcurr_dete();/短路检测,如果存在短路,短路标志被置位bat_elec_disp();/蓄电池电量显示bat_chek();/蓄电池电量判断diode_con();/太阳能电池组件判断和防反充二极管控制lightset();/光照设置load_off();/负载关闭控制函数load_on();/负载打开控制函数 PCA0CPH2 = 0x00;/复位看门狗,超时周期为850毫秒inver_recode();/调用事件记录函数。#include c8051f330.h#define

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1