⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 锂电池充电器.c

📁 用atmega16做的一个锂电池充电器程序,包含了AD采集,PWM控制等基本模块.
💻 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 + -