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

📄 adc.c

📁 充电器源代码 才有AVR CPU 控制 可以对大部分电池充电
💻 C
字号:
/******************************************************************************
*  name: adc.c
*  author: fengzai(panda)
*  date: 2007.1.14
*  decribe: 测量监控模块,包括测量电池电压和充电电流两个功能
******************************************************************************/


#include <avr/io.h>
#include <util/delay.h>

#define uchar	unsigned char
#define uint	unsigned int
#define BIT(x)	(1<<(x))
#define NOP()	asm("nop")
#define WDR() 	asm("wdr")


unsigned int vol;

/*-----------------------------------------------------------------------------
* 发送unsigned int 到串口,转化为ASCII,OK!
*-----------------------------------------------------------------------------*/
void send_int(unsigned int i)
{
 unsigned char a,b,c,d;
 a = i/1000;
 b = i/100 - a*10;
 c = i/10 - a*100 - b*10;
 d = i - a*1000 - b*100 - c*10;
 put_c(a+48);
 put_c(b+48);
 put_c(c+48);
 put_c(d+48);
 put_c('\n');
}


/*-----------------------------------------------------------------------------
*  电流检测模块,用来测量充电电流大小
*  包括 adc1_init();adc1_calc();charge_current();
*----------------------------------------------------------------------------*/

void adc1_init(void)     //ADC1,第二通道转化,测量充电电流
{
	//adc转换初始化
	ADCSRA	= 0x00;	//禁止AD转换
	ADMUX	= 0xC1;
	SFIOR |= 0x00;
	ACSR	= 0x80; //禁止模拟比较器
	ADCSRA	= 0xC7;
}


unsigned int adc1_calc(void)
{
	//计算实际电压
	unsigned long value=0;
	unsigned int voltage=0; //电压单位为(mV)
	adc1_init();
	value=ADCL;		 //首先读低位
	value|=(int)ADCH << 8; //然后读高位
	voltage=(value*2560)>>10;
	return voltage;
}

unsigned int charge_current()
{
 unsigned int current=0;
 uchar i;
 adc1_init();
 vol = adc1_calc(); //第一转换结果是错的
 _delay_ms(100);
 for(i=0;i<16;i++)
 {
 vol = adc1_calc();
 current += vol/11*10;
 //send_int(vol);
 _delay_ms(1000);
 }
 return(current>>4);
}


/*-----------------------------------------------------------------------------------
*  电池电压检测模块,使用ADC0通道。
*  包括adc0_init(), adc0_calc(), battery_vol()三个函数,OK!
*----------------------------------------------------------------------------------*/
void adc0_init(void)
{
	//adc转换初始化
	ADCSRA	= 0x00;	//禁止AD转换
	ADMUX	= 0xC0;
	SFIOR |= 0x00;
	ACSR	= 0x80; //禁止模拟比较器
	ADCSRA	= 0xC7;
}

unsigned int adc0_calc(void)
{
	//计算实际电压
	unsigned long value=0;
	unsigned int voltage=0; //电压单位为(mV)
	adc0_init();
	value=ADCL;		 //首先读低位
	value|=(int)ADCH << 8; //然后读高位
	voltage=(value*2560)>>10;
	return voltage;
}

unsigned int battery_vol(void)
{
 uchar i;
 unsigned int t=0;
 adc0_init();
 for(i=0;i<16;i++)
  {
   _delay_ms(10);
   t += adc0_calc();
  }
 return(t>>4);
}




/*------------------------------------------------------------------------------
*   end of file
*-----------------------------------------------------------------------------*/








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -