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