|
設(shè)計(jì)功能如下:
(1)白天狀態(tài)給電池充電。
1.1采用三段充電法,激活(5.0-5.8V),恒流(5.8-6.9V),涓流充電(6.9-7.2V)。
1.2充電狀態(tài)紅燈亮。
(2)黑天狀態(tài)給電池給負(fù)載放電。
2.1開始放電全功放電。6個(gè)小時(shí)后,半功率放電。(實(shí)驗(yàn)板上地方不夠,未做,下一版改進(jìn))
2.2電池放電保護(hù)電壓5.2V 2.3溫度補(bǔ)償。(初版地方不夠,未做)
(3)白-》黑天過渡狀態(tài)大概5分鐘,其間LEDG閃爍。
(4)按鈕模擬黑天功能。
備注:昨晚(2013.07.14)測(cè)試了一下測(cè)試按鈕,在充電狀態(tài)下按下沒問題,但是在綠燈閃爍和充電時(shí)電池開路情況下按下會(huì)對(duì)系統(tǒng)造成影響,已修改。 原理圖有個(gè)地方畫錯(cuò)了,Q3 E應(yīng)該接Q5 S的,多虧huoyubing521發(fā)現(xiàn)了,謝謝~~ robin_chen559 2013.07.23
0.png (481.03 KB, 下載次數(shù): 182)
下載附件
2016-10-12 13:26 上傳
0.png (526.64 KB, 下載次數(shù): 183)
下載附件
2016-10-12 13:26 上傳
程序框圖:
0.png (50.26 KB, 下載次數(shù): 177)
下載附件
2016-10-12 13:29 上傳
原理圖:
0.png (120.7 KB, 下載次數(shù): 183)
下載附件
2016-10-12 13:29 上傳
修改記錄:
更改項(xiàng)目
判斷天黑綠燈閃爍時(shí)按鈕按下時(shí)序混亂
充電電池開路,按鈕按下后,天黑單片機(jī)掉電
原理圖錯(cuò)誤Q3 E應(yīng)該接Q5 S端來著
源程序:
- /***********************************************************************************
- 項(xiàng)目:太陽能充放電控制器
- 功能:通過STC12C5410AD 的AD/PWM控制太陽能電池系統(tǒng)的充放電
- (1)白天狀態(tài)給電池充電。
- 1.1采用三段充電法,激活(5.0-5.8V),恒流(5.8-6.9V),涓流充電(6.9-7.2V)。
- 1.2充電狀態(tài)紅燈亮。
- (2)黑天狀態(tài)給電池給負(fù)載放電。
- 2.1開始放電全功放電。6個(gè)小時(shí)后,半功率放電。(實(shí)驗(yàn)板上地方不夠,未做,下一版改進(jìn))
- 2.2電池放電保護(hù)電壓5.2V
- (3)白-》黑天過渡狀態(tài)大概5分鐘,其間LEDG閃爍。
- (4)按鈕模擬黑天功能。
- 設(shè)計(jì):robin_chen559
- 日期:2013.07.09
- 備注:(1)晶振頻率 11.059M (2)電池6V 2.5AH鉛酸電池
- (3)太陽能電池板19V620MA 11W
- ***********************************************************************************/
- #include<STC12C5410AD.H>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LEDR = P1^7;
- sbit LEDG = P1^6;
- sbit LEDY = P1^5;
- sbit Bat_Sen_SW = P1^3;
- sbit Bat_DCH_SW = P3^5;
- sbit MUC_POWER = P3^3; //單片機(jī)供電
- sbit VINT0 = P3^2; //INT0端口
- bit Bat_CR = 0 ; //charge ready充電充滿切換窗口
- bit Bat_OP = 0 ; //open 電池過沖切換窗口
- bit LEDG_Flash = 0 ; //判斷天黑等待LEDG閃爍標(biāo)志
- bit Bat_DCH_Bit = 0; //放電標(biāo)志,防等待LEDG閃爍進(jìn)入放電狀態(tài)后還閃
- bit Bat_DCH_Wait = 0; //判斷天黑等待放電標(biāo)志
- bit SW_ON_Bit = 0 ; //按鈕按下標(biāo)志
-
- uchar Bat_CH_DCH = 0 ; //充放電轉(zhuǎn)換標(biāo)志 0充電,1放電,2按鈕按下判斷
- uchar T0_num = 0 ; //定時(shí)器1計(jì)時(shí)參數(shù)
- uint num = 0; //天黑判斷延時(shí)計(jì)數(shù)參數(shù)
- //子程序聲明
- void Delay_MS(uint MS);
- void init_AD(void);
- void Timer_init(void);
- int Get_AD(uchar channel);
- float AD_AV(uchar channel);
- void Power_Star(void);
- void Bat_Star(void);
- void Bat_CH(void);
- void init_PWM(uchar D_PWM);
- void Init_Inte(void);
- void Bat_DCH(void);
- void Power_OFF(void);
- void Bat_CH_DCH_Wait(void);
- void SW_ON_CHAR(void);
- void SW_OFF_CHAR(void);
- //子程序
- //延時(shí)子程序
- void Delay_MS(uint MS)
- {
- uint i,j;
- for(i=MS;i>0;i--)
- for(j=110;j>0;j--);
- }
- //定時(shí)器初始化子程序
- void Timer_init(void)
- {
- TMOD = 0x11; //0001 0001 定時(shí)器0/1 ,1模式16位計(jì)數(shù)
- EA = 1; //允許總中斷發(fā)生
- ET0 = 1; //允許定時(shí)器0中斷
- TR0 = 1; //定時(shí)器0開啟
- TH0 = (65536-46080)/256; //高八位裝值
- TL0 = (65536-46080)%256; //低八位裝值
- }
- //定時(shí)器0中斷子程序
- void Timer_0(void)interrupt 1
- {
- TH0 = (65536-46080)/256; //高八位裝值
- TL0 = (65536-46080)%256 ; //低八位裝值
-
- T0_num++;
- if(T0_num==10)
- {
- T0_num = 0; //計(jì)時(shí)清零
- if(LEDG_Flash == 1)
- {
- LEDG = ~LEDG; //LED_G閃爍
- }
- }
- }
- //AD初始化子程序
- void init_AD(void)
- {
- P1M0 = 0x11; //0001 0001
- P1M1 = 0xff; //1111 1111 AD4 /AD0開漏為AD輸入,其余強(qiáng)推挽輸出
- ADC_CONTR = 0xe0; //1110 0000
- Delay_MS(3);
- }
- //AD轉(zhuǎn)換
- int Get_AD(uchar channel)
- {
- uchar AD_finished = 0; //設(shè)AD轉(zhuǎn)換完成標(biāo)志
- int result;
- ADC_CONTR|=channel; //選擇AD轉(zhuǎn)換通道
- ADC_CONTR|=0x08; // 開始ad轉(zhuǎn)換
- while(AD_finished == 0) //等待AD轉(zhuǎn)換完成
- {
- AD_finished=(ADC_CONTR&0x10);
- }
- result = ADC_DATA*4+ADC_LOW2; //讀走AD轉(zhuǎn)換結(jié)果
- ADC_CONTR&=0xe0; // 1110 0000 清除轉(zhuǎn)換完成標(biāo)志,關(guān)閉AD。
- return(result); //AD轉(zhuǎn)換結(jié)果返回給函數(shù)
- }
-
- //AD轉(zhuǎn)換結(jié)果運(yùn)算子程序
- float AD_AV(uchar channel)
- {
- float VAL_AD = 0;
- uchar num ;
- for(num=100;num>0;num--)
- {
- VAL_AD+=Get_AD(channel); //100次AD轉(zhuǎn)換結(jié)果相加
- }
- VAL_AD/=100.0; //100次AD轉(zhuǎn)換平均值
- VAL_AD=VAL_AD*5/1024; //求十進(jìn)制AD值
- return(VAL_AD); //返回十進(jìn)制AD值
- }
- //開機(jī)外接電源判斷子程序
- void Power_Star(void)
- {
-
- if(AD_AV(0)<3.0) //vin大于9V,市電加載
- {
- LEDG = 0; //外接電源正常,綠色LED亮
- LEDR = 1;
- init_PWM(0xff); //PWM D=0,關(guān)閉充電
- }
-
- }
- //太陽能電池板基本無輸出,黑天
- void Power_OFF(void)
- {
-
- if(AD_AV(0)<1.0) //vin小于3V,太陽能電池板基本無輸出
- {
-
- num++; //陽光不好太陽能供電不足,充電電路拉低太陽能 板輸出電壓
- Bat_DCH_Wait = 1; //判斷天黑等待放電
- if(Bat_DCH_Bit == 0)
- {
- Bat_CH_DCH = 2; //充放電切換等待,天黑等待和放電狀態(tài)判斷條件相同
- LEDG_Flash = 1; //判斷天黑等待LEDG閃爍
- }
- }
- if(AD_AV(0)>1.0) //vin大于3V,太陽能電池板有輸出
- {
- num = 0;
- Bat_DCH_Bit = 0; //放電后重新充電
- Bat_CH_DCH = 0; //日食條件,時(shí)間大于5分鐘,太陽能電池板重新上電
- LEDG_Flash = 0; //回復(fù)充電狀態(tài),LEDG禁止閃爍
- }
-
- if(num>1512) //太陽能電池板連續(xù)一段時(shí)間電壓小于3V,252 對(duì)應(yīng)10S;14652對(duì)應(yīng)300秒(精度5S)
- {
-
- init_PWM(0xff); //PWM D=0,關(guān)閉充電
- Bat_CH_DCH = 1; //電池放電,改進(jìn)板單片機(jī)供電和放電分開
-
- // num=0不合適,否則在放電過程中手欠按下按鈕,系統(tǒng)重新進(jìn)入黑天判斷等待計(jì)數(shù)。
- }
- //如等待時(shí)間過長(zhǎng)可考慮太陽能電池板意外,不能維持單片機(jī)判斷黑天等待時(shí)間
-
- }
- //充放電切換等待子程序
- void Bat_CH_DCH_Wait(void)
- {
- LEDR = 1 ; //充電紅燈關(guān)閉,避免等待過程中切充電紅燈閃
- }
- //開機(jī)電池檢測(cè)子程序
- void Bat_Star(void)
- {
-
- Bat_Sen_SW = 1 ; //打開電池電壓檢測(cè)三極管
-
- if(AD_AV(4)<1.5) //電池未接,黃燈亮
- {
- LEDY = 0 ;
- }
- if(AD_AV(4)>1.5) //電池掛載,紅燈亮,充電
- {
- LEDR = 0 ;
- Bat_CH_DCH = 0 ; //進(jìn)入充電程序
- }
-
- }
- //PWM子程序
- void init_PWM(uchar D_PWM )
- {
- CMOD = 0x00; //設(shè)置PWM定時(shí)器
- CL = 0x00;
- CH = 0x00;
- CCAPM0 = 0x42; //PWM0設(shè)置為PWM模式
- CCAP0L = 0x10 ; //PWM0設(shè)置
- CCAP0H = D_PWM ;
- CR = 1; //開始PWM定時(shí)器
- }
- //充電程序
- void Bat_CH(void)
- {
- bit Bit_RED_ON = 0 ;
- Bat_Sen_SW = 1; //允許電池電壓檢測(cè)
- Bat_DCH_SW = 0; //放電使能關(guān)閉
- Bat_DCH_Wait = 0; //判斷天黑等待封禁
- MUC_POWER = 1; //防止電池開路時(shí)按鈕按下,天黑放電失效
- if(AD_AV(4)<1.66) //電池?cái)嚅_,充電電路不通(0.5太低)
- {
- Bat_OP = 1; //電池給單片機(jī)供電PNP管漏電過去
- init_PWM(0xff);
- }
- if((AD_AV(4)>1.66)&(AD_AV(4)<2.05)) //電池掛載,電壓范圍5.0-5.8V,PWM D=0.3
- {
-
- init_PWM(0xb3); // PWM D=0.3 0xb3 (D=0.1驅(qū)不動(dòng),表上無電流)
- Bat_CR = 0; //防沖完電后換電池
- Bat_OP = 0; // 清除電池開路標(biāo)志
- }
- //電池掛載,電壓范圍5.8-6.9V,PWM D=0.9/0.6
- if((AD_AV(4)>=2.05)&(AD_AV(4)<=2.42))
- {
-
-
- init_PWM(0x19); //PWM D=0.9 0x19
-
- Bat_OP = 0; // 清除電池開路標(biāo)志
- if(AD_AV(4)<2.27) // Vbat 6.5V,窗口下端,放電至6.5V以下,充電紅燈才會(huì)重新亮
- {
- Bit_RED_ON = 1; //紅燈亮置“1”
- }
- if(Bit_RED_ON == 1)
- {
- Bat_CR = 0; //防沖完電后換電池
- }
- }
- //電池掛載,電壓范圍6.9-8.0V,PWM D=0.3
- if((AD_AV(4)>2.42)&(AD_AV(4)<=2.80))
-
- { //窗口比較,用7.0判6.9V
- Delay_MS(10);
- if (AD_AV(4)>2.35) //確定電池基本充到6.7V(窗口)
- {
-
- Bat_OP = 0; // 清除電池開路標(biāo)志
- init_PWM(0xb3); //PWM D=0.3,絹流充電(電池老化后,維持電壓)
- }
- if (AD_AV(4)>2.40) //確定電池基本充到7.0V(窗口)
- {
-
- Bat_OP = 0; // 清除電池開路標(biāo)志
- Bit_RED_ON = 1;
- }
- if(Bit_RED_ON == 1)
- {
- Bat_CR = 1; //充電完畢,紅色指示燈關(guān)閉
- }
- if(AD_AV(4)>2.52)
- {
- init_PWM(0xff); //Vbat 7.2V PWM D=0 (電池老化后,小電流仍會(huì)使電壓虛高電壓)
- }
-
- }
- if(AD_AV(4)>2.80) //電池開路,電壓范圍8V,PWM D=0.75
- {
-
- if ( AD_AV(4)>2.80)
- {
- Bat_OP = 1; //電池開路標(biāo)志置 ‘1’
- init_PWM(0x40); //PWM 0x40 D=0.75
- }
- }
- //狀態(tài)指示燈
-
- LEDG = 0 ; //主電綠燈亮
- if (Bat_CR == 0) //充電未完成
- {
- LEDR = 0; // 指示紅燈亮
- LEDY = 1; //指示黃燈滅
- }
- if(Bat_CR == 1) //充電完成
- {
- LEDR = 1; // 指示紅燈滅
- LEDY = 0; //指示黃燈亮
- }
- if (Bat_OP == 0) //電池開路
- {
- LEDY = 1; //指示黃燈滅
- }
- if (Bat_OP == 1) //電池開路
- {
- LEDR = 1; // 指示紅燈滅
- LEDY = 0; //指示黃燈亮
- }
-
- }
-
- //中斷初始化
- void Init_Inte(void) //中斷初始化
- {
- EA = 1; //開總中斷
- IT0 = 1; //下降沿觸發(fā)中斷
- EX0 = 1; //開外部0中斷
- }
- //中斷0響應(yīng)
- void Inter0(void) interrupt 0 //外部中斷0程序
- {
- SW_ON_Bit = 1 ; //開關(guān)按下標(biāo)志置“1”
- }
- //按鍵按下判斷
- void SW_ON_CHAR(void)
- {
-
- if( SW_ON_Bit == 1) //按鈕確定按下
- {
- VINT0 = 1; //端口置“1”好判斷
- _nop_();
- _nop_();
- _nop_(); //三個(gè)空周期,待電平穩(wěn)定
- if(VINT0 == 0) //按鈕按下
- {
- Delay_MS(10);
- if(VINT0 == 0) //確定按鈕按下
- {
- Bat_CH_DCH = 1; //放電標(biāo)志置“1”
- }
- }
- }
- }
- //按鈕松開判斷
- void SW_OFF_CHAR(void)
- {
-
- if( SW_ON_Bit == 1) //確定之前有開關(guān)按下
- {
- VINT0 = 1; //端口置“1”好判斷
- _nop_();
- _nop_();
- _nop_(); //三個(gè)空周期,待電平穩(wěn)定
- if(VINT0 == 1) //INT0電平為高
- {
- Delay_MS(10);
- if(VINT0 == 1) //確定按鈕松開,放電標(biāo)志置"0"
- {
- SW_ON_Bit = 0; //按鈕按下標(biāo)志清除
- if(Bat_DCH_Wait == 0) //防止判斷天黑綠燈閃爍時(shí)按鈕按下時(shí)序混亂
- {
- Bat_CH_DCH = 0;
- }
- }
- }
- }
- }
- //放電子程序
- void Bat_DCH(void)
- {
- float VCC_DCH; //設(shè)定放電基準(zhǔn)電壓
- float DCH_AD_AV4; //放電電池采樣電壓
- Bat_Sen_SW = 1; //允許電池電壓檢測(cè)
- Bat_DCH_SW = 1; //電池放電開關(guān)開啟
- Bat_DCH_Bit = 1; //放電標(biāo)志置“1”
- init_PWM(0xff); //設(shè)置PWM后端口輸出0不好使了,避免按鈕測(cè)試放電電流有差異
- LEDG_Flash = 0; //等待狀態(tài)切換到放電狀態(tài),禁止LEDG閃爍
- LEDR = 1; //三色指示燈全滅
- LEDG = 1;
- LEDY = 1;
-
- //放電保護(hù)
- VCC_DCH = (1024*2.5)/AD_AV(2); //計(jì)算放電基準(zhǔn)電壓
- DCH_AD_AV4 = AD_AV(4)*VCC_DCH/1024; //放電基準(zhǔn)電壓下電池電壓
-
- if(DCH_AD_AV4<1.82) //電池電壓小于5.2V
- {
- Bat_DCH_SW = 0; //電池放電開關(guān)關(guān)閉,電池停止放電
- MUC_POWER = 0; //否則檢測(cè)太陽能板無電,還是繼續(xù)進(jìn)入放電狀態(tài)
- }
-
- }
- //主程序
- void main(void)
- {
- init_AD(); //AD初始化
- Timer_init(); //定時(shí)器初始化
- Init_Inte(); //中斷初始化
- Power_Star(); //開機(jī)檢測(cè)外接電源
- Bat_Star(); //開機(jī)電池檢測(cè)
-
- MUC_POWER = 1; //中斷響應(yīng),電池來不及供電
- P3M0 = 0x00; // 0000 0000
- P3M1 = 0xfb; // 1111 1011
- while(1)
- {
-
- Power_OFF(); //判斷是否黑天
- SW_ON_CHAR(); //判斷按鈕是否按下
- SW_OFF_CHAR(); //判斷按鈕是否松開
- if(Bat_CH_DCH==0)
- {
- Bat_CH(); //電池充電
- }
- if(Bat_CH_DCH==1)
- {
- Bat_DCH(); //電池放電
- }
- if(Bat_CH_DCH==2)
- {
- Bat_CH_DCH_Wait(); //充放電切換等待
- }
- }
復(fù)制代碼
全部完整代碼:
SOFT.rar
(47.09 KB, 下載次數(shù): 308)
2016-10-12 13:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
程序框圖.pdf
(36.12 KB, 下載次數(shù): 189)
2016-10-12 13:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
太陽能電池板充放電控制器 電路圖.pdf
(65.47 KB, 下載次數(shù): 252)
2016-10-12 13:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
修改記錄.pdf
(38.26 KB, 下載次數(shù): 191)
2016-10-12 13:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|