📄 adc.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 + -