[AVR单片机] mega8 采样电压问题请教

[复制链接]
2742|10
 楼主| utterboy 发表于 2010-3-10 21:10 | 显示全部楼层 |阅读模式
采样得到的电压和计算出来的不一样,不知道错在哪里,请各位帮帮忙,谢谢了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| utterboy 发表于 2010-3-10 21:12 | 显示全部楼层
//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;
}
 楼主| utterboy 发表于 2010-3-10 21:13 | 显示全部楼层
说明:内部时钟8M ,每中断一次采样电池电压一次,16次软件滤波
 楼主| utterboy 发表于 2010-3-10 21:15 | 显示全部楼层
监控电压值段

if(BatteryData.volts<153)
                bitset(PORTD,3);        //green LED0_ON();
                else  bitclr(PORTD,3);//green LED0_OFF();
        if(BatteryData.volts<920)
                bitset(PORTD,2);//red
                else  bitclr(PORTD,2);//red
 楼主| utterboy 发表于 2010-3-10 21:18 | 显示全部楼层
153对应电压值3V
3 /5 ×255
 楼主| utterboy 发表于 2010-3-10 21:19 | 显示全部楼层
请各位帮帮看看,错在哪里,急吖
 楼主| utterboy 发表于 2010-3-11 10:54 | 显示全部楼层
打扰各位了,问题找到了
AD采样赋值时我怎么左移8位了,那个值相当的大吖
 楼主| utterboy 发表于 2010-3-11 10:54 | 显示全部楼层
其气死我了
liao_fangxing 发表于 2010-3-11 11:24 | 显示全部楼层
没啥可气的  谁不犯点低级错误 注意积累经验  下次小心就行
laslison 发表于 2010-3-13 11:04 | 显示全部楼层
好强啊
jack_icc 发表于 2010-8-3 20:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

305

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部