📄 powermanage.c
字号:
#include "main.h"
void Read_adc(void) //A/D转化
{
ADMUX=_BV(REFS0)|0x07; //第7通道
ACSR=_BV(ACD);
ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS0);//32分频
loop_until_bit_is_set(ADCSRA,ADIF);
SetBit(ADCSRA,ADIF); //清标志位
ADMUX=_BV(REFS0)|0x07; //第7通道
ACSR=_BV(ACD);
ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS0);//32分频
loop_until_bit_is_set(ADCSRA,ADIF);
SetBit(ADCSRA,ADIF); //清标志位
ADValue=ADC;
}
struct stBC_TimeCn
{
unsigned int B;
unsigned char H;
unsigned char D;
} sBC;
unsigned char fnBCCountDown(void)
{
if (sBC.B--) return 0;
sBC.B= 36000-1 ;
if (sBC.H--) return 0;
sBC.H = 23;
if ( sBC.D--) return 0;
return 1;
}
void fn0(void)
{
Read_adc();
if(ADValue<=Batteryempty)
{
mBC_Value=0;
ClrBit(PORTA,BatteryCharger); //停止充电
ClrBit(SystemLedState,BatterDis); //电池电压指示灯灭
ClrBit(SystemLedSpring,BatterDis);
return;
}
if(bit_is_set(SystemLedState,PowerDis))// 市电标志位
{
mBC_State=1; //有电充电 没电进入备电
sBC.B = 0;
sBC.H = 0;
sBC.D = 2; //充电时间为2天
}
else
{
mBC_State=3; //3= 备电
ClrBit(PORTA,BatteryCharger); //停止充电 放电
}
}
void fn1(void) //充电处理
{
if(fnBCCountDown()) //充电时间
{
mBC_State=2; //充电时间到 什么都不做
ClrBit(PORTA,BatteryCharger); //停止充电 充电满了就等半年再充 没满就进下面程序 进行检测
sBC.B = 0;
sBC.H = 0;
sBC.D = 30*6;
return;
}
if(bit_is_clear(SystemLedState,PowerDis))// 市电标志位
{
mBC_State=3; //3= 备电
ClrBit(PORTA,BatteryCharger); //停止充电 放电
return;
}
if(mTmBC_1s) //充电0.9秒,停止充电检测电压0.1秒
{
if(++mTmBC_1s>=10)
{
ClrBit(PORTA,BatteryCharger); //停止充电 放电
mTmBC_1s=0;
}
return;
}
mTmBC_1s=1;
ClrBit(PORTA,BatteryCharger);
Read_adc();
SetBit(PORTA,BatteryCharger); //充电
if(ADValue<=Batteryempty)
{
mBC_State=0;
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
return;
}
else if(ADValue<BatteryLowkeep)//5~11v
{
mBC_Value=1;
SetBit(SystemLedState,BatterDis);
SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else if(ADValue<BatteryLow)//11.1~12.1v
{
mBC_Value=2;
SetBit(SystemLedState,BatterDis);
SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else if(ADValue<BatteryHigh)//12.1~13.8V
{
mBC_Value=3;
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else //大于13.8V
{
if(mBC_Value!=4)
{
mBC_Value=4;
if(sBC.D || sBC.H >12)
{
sBC.D=0; sBC.H =12 ; //再充电12个小时
}
}
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
}
void fn2(void) //2=Idle 什么都不做
{
if(fnBCCountDown())
{
mBC_State=1; // 0=开机 1= 充电 2=Idle 3= 备电
SetBit(PORTA,BatteryCharger); //充电
sBC.B = 0;
sBC.H = 0;
sBC.D = 2;
return;
}
if(bit_is_clear(SystemLedState,PowerDis))// 市电标志位
{
mBC_State=3;
ClrBit(PORTA,BatteryCharger); //停止充电 放电
return;
}
if(mTmBC_1s) //充电0.9秒,停止充电检测电压0.1秒
{
if(++mTmBC_1s>=10)
{
ClrBit(PORTA,BatteryCharger); //停止充电 放电
mTmBC_1s=0;
}
return;
}
mTmBC_1s=1;
ClrBit(PORTA,BatteryCharger);
Read_adc();
SetBit(PORTA,BatteryCharger); //充电
if(ADValue<=Batteryempty)
{
mBC_State=0;
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
return;
}
else if(ADValue<=BatteryLow)
{
if(mBC_Value!=2)
{
mBC_Value=2;
SetBit(SystemLedState,BatterDis);
SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
if( sBC.D >=7 )
{
sBC.B = 0;
sBC.H = 0;
sBC.D = 7;
}
}
}
else if(ADValue<= BatteryHigh) // 大于12.1V小于13.8V
{
mBC_Value=3;
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else
{
mBC_Value=4;
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
}
//***********************************************
//*******************************************************
void fn3(void) //3= 备电
{
Read_adc();
if(ADValue<BatteryLowkeep) //5~11v
{
mBC_Value=1;
SetBit(SystemLedState,BatterDis);
SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
ClrBit(PORTA,BatterySupply);//断供给
while(1); // Restart system
}
else if(ADValue<BatteryLow) //11.1~12.1v
{
mBC_Value=2;
SetBit(SystemLedState,BatterDis);
SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
SetBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else if(ADValue<BatteryHigh)// 大于12.1V小于13.8V
{
mBC_Value=3; //12.1~13.8V
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
else //大于13.8V
{
mBC_Value=4;
SetBit(SystemLedState,BatterDis);
ClrBit(SystemLedSpring,BatterDis);
ClrBit(mDvStatus,cDvSS_BtLw); //上行,低电压标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
}
if(bit_is_set(SystemLedState,PowerDis))// 市电标志位
{
mBC_State=1; //有电充电 没电进入备电
sBC.B = 0;
sBC.H = 0;
sBC.D = 2;
}
}
unsigned char Power_Rd=0x02,Power_Pre=0x02,Power_Save=0x02;
void fnPowerCheck(void)//市电检测
{
Power_Rd=PIND & 0x02;
if(Power_Rd != Power_Pre ) //除抖动
{
Power_Pre=Power_Rd;
return;
}
if( Power_Pre != Power_Save )
{
Power_Save = Power_Pre;
if(!Power_Pre ) //jump to space
{
SetBit(SystemLedState,PowerDis); //有市电电源指示灯亮
ClrBit(mDvStatus,cDvSS_BtPower); //上行,备电标志
ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtM); //下行,备电标志
return;
}
else //Release_Space
{
ClrBit(SystemLedState,PowerDis); //无市电电源指示灯灭
SetBit(mDvStatus,cDvSS_BtPower); //上行,备电标志
SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtM); //下行,备电标志
return;
}
}
else
{
if (!Power_Save ) //保持 ,Space
{
}
return;
}
}
void BatteryCharge(void)
{
switch (mBC_State)
{
case 0: fn0(); break; //0=开机
case 1: fn1(); break; //1= 充电
case 2: fn2(); break; //2=Idle 什么都不做
case 3: fn3(); break; //3= 备电
default: while(1);
}
}
void fnPowerManage(void)
{
fnPowerCheck();
BatteryCharge();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -