//AD初始化片段 250ms启动一次中断,ADC0,ADC1 ,ADC2
ADCSRA=0x00;
ADMUX=0x60; //REFS1=0 REFSO=1 模拟通道0 ADLAR=1 //左对齐
//ADMUX =(1<<REFS0)|(1<<ADLAR);//选择内部AVCC为基准,通道为1
ACSR=(1<<ACD); //关闭模拟比较器
ADCSRA=0Xe6; // 自由模式 64分频 125K@8M
ADCSRA|=(1<<ADSC); //启动AD转换
//INT0定时器0中断
ISR(TIMER0_OVF_vect)
{
unsigned char i;
TCNT0=0x00;
//bitset(PORTD,2);//red
for(i=0;i<16;i++)
{
//ADMUX=0x60;; //REFS0=1 REFSO=0 模拟通道0 ADLAR=1ADC1 0000 ADMUX=0x60;
_delay_us(40);
ADCSRA|=(1<<ADSC); //启动AD转换
while ((ADCSRA&(1<<ADIF))==0);//等待AD转换结束
voltage|=(uint16_t)(ADCH<<8);
ADCH=0;
ADCSRA|=(1<<ADIF);//写1清除标志位
_delay_us(20);
//采样充电电流。
/*
if(power_supply_type==Mains_supply)
{
// ADMUX=(0<<MUX3)|(0<<MUX2)0<<MUX1)|(1<<MUX0);//ADC1 0001
ADMUX=0x61; //REFS0=1 REFSO=0 模拟通道1 ADLAR=1 ADC1
_delay_us(10);
bitset(ADCSRA,6);//启动AD转换
while ((ADCSRA&(1<<ADIF))==0);//等待AD转换结束
charge_I|=(uint16_t)(ADCH<<8);
ADCH=0;
ADCSRA|=(1<<ADIF);//写1清除标志位
}
//采样放电电流。
if(power_supply_type== Battery_supply)
{
//ADMUX=(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);//ADC2 0010
ADMUX=0x62; //REFS0=1 REFSO=0 模拟通道2 ADLAR=1
_delay_us(10);
bitset(ADCSRA,6);//启动AD转换
while((ADCSRA&(1<<ADIF))==0);//等待AD转换结束
discharge_I|=(uint16_t)(ADCH<<8);
ADCH=0;
ADCSRA|=(1<<ADIF);//写1清除标志位;
//bitset(PORTD,2);//red
}*/
voltsbuff+=voltage;
voltage=0;
charge_Ibuff+=charge_I;
charge_I=0;
discharge_Ibuff+=discharge_I;
discharge_I=0;
}
BatteryData.volts=(voltsbuff>>4);//电池电压
voltsbuff=0;
BatteryData.charge_current=(charge_Ibuff>>4);//充电电流
charge_Ibuff=0;
BatteryData.discharge_current=(discharge_Ibuff>>4);//放电电流
discharge_Ibuff=0;
TIFR |=0x01;
}
|