📄 锂电池充电器.c
字号:
#include<avr/io.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ING_1 PORTA|=_BV(7)
#define ING_0 PORTA&=~_BV(7)
#define FIR_1 PORTA|=_BV(6)
#define FIR_0 PORTA&=~_BV(6)
#define SEC_1 PORTA|=_BV(5)
#define SEC_0 PORTA&=~_BV(5)
#define THI_1 PORTA|=_BV(4)
#define THI_0 PORTA&=~_BV(4)
#define FOR_1 PORTA|=_BV(3)
#define FOR_0 PORTA&=~_BV(3)
#define OVER_1 PORTA|=_BV(2)
#define OVER_0 PORTA&=~_BV(2)
#define V3_0 0x0278
#define V4_0 0x034a//340
#define V4_23 0x036b
#define V0_35 0x0037
#define V0_065 0x0009
#define V0 0x0005
#define V4_5 0x0370
static uint g_aAdValue[30]; //A/D 转换缓冲区
/*----------------------------------------------------------------------------
延时一些时间
------------------------------------------------------------------------------*/
void delay10ms(unsigned int x)
{
unsigned char i,j,k;
for(i=0;i<x;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++);
}
void delay(unsigned int x)
{
while(x--)
{;}
}
/*----------------------------------------------------------------------------
初始化IO口
------------------------------------------------------------------------------*/
void IoInit(void)
{
DDRA=0XfC;
PORTA=0XfC;
}
//////////////////////////////////////
void InitPWM()//PWM初始化
{
TCCR1A=_BV(COM1A1)/*|_BV(COM1B1)*/|_BV(WGM10);
TCCR1B=_BV(CS11)|_BV(CS10);
TCNT1=0;
DDRD|=_BV(PD5);//OC1A pwm 输出引脚允许
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
uint AdcConvert(uchar x)//AD转换子程序
{
uchar i;
uint ret;
ADMUX=x;
ADCSRA|=0x80;
//连续转换100次
for(i=0;i<30;i++)
{
ADCSRA|=_BV(6);
delay(60);
while(ADCSRA&_BV(6))
delay(60);
ret=ADCL;
ret|=(uint)(ADCH<<8);
g_aAdValue[i]=ret;
}
ret=0;
for(i=1;i<30;i++)
ret+=g_aAdValue[i];
ret/=29;
ADCSRA=0;//关闭ADC
return ret;
}
//****************************************************************************//
// //
// 主函数 //
// //
//****************************************************************************//
int main(void)
{
int pwm=0;
uint v1,v2,v;
uchar i,l,n,sig;
uint j,t;
IoInit();
InitPWM();
while(1)
{
v1=AdcConvert(0);
v2=AdcConvert(1);
v=v1-v2;
if(v<V0)//短路处理,警示灯快闪
{
sig=0;ING_1;
l++;if(l>1){l=0;n=!n;if(n){FOR_0;}else{FOR_1;}}///////////////////////////////////////////////
pwm=0;
FIR_1;SEC_1;THI_1;OVER_1;
}
else if(v<V3_0)//电池电压低于3V时,预充电,65mA,第一个红灯亮
{
sig=1;
v2=AdcConvert(1);
if(v2>V0_065){pwm--;if(pwm<0){pwm=0;}}
if(v2<V0_065){pwm++;if(pwm>255){pwm=255;}}
FIR_0;SEC_1;THI_1;FOR_1;OVER_1;
}
else if(v<V4_0)//电池电压低于4V时,快速充电,350mA,第二个红灯亮
{
sig=1;
v2=AdcConvert(1);
if(v2>V0_35){pwm--;if(pwm<0){pwm=0;}}
if(v2<V0_35){pwm++;if(pwm>255){pwm=255;}}
FIR_0;SEC_0;THI_1;FOR_1;OVER_1;
}
else if(v<V4_5)//电池电压低于4.5V时,恒压充电,4.23V,第三个红灯亮
{
sig=1;
v2=AdcConvert(0);
if(v2>V4_23){pwm--;if(pwm<0){pwm=0;}}
if(v2<V4_23){pwm++;if(pwm>255){pwm=255;}}
t++;if(t>60000){sig=0;ING_1;FIR_0;SEC_0;THI_0;OVER_0;}//超过50分钟后,充电完毕
else{FIR_0;SEC_0;THI_0;FOR_1;OVER_1;}
}
else //电压高于4.5V时,无电池,警示灯慢闪
{
sig=0;ING_1;
l++;if(l>7){l=0;n=!n;if(n){FOR_0;}else{FOR_1;}}
pwm=0;
FIR_1;SEC_1;THI_1;OVER_1;
}
if(sig)
{
j++;
if(j>5){j=0;i=!i;if(!i){ING_0;}else{ING_1;}}
}
OCR1A=pwm;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -