打印
[AVR单片机]

mega8 采样电压问题请教

[复制链接]
2118|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

使用特权

评论回复
5
utterboy|  楼主 | 2010-3-10 21:18 | 只看该作者
153对应电压值3V
3 /5 ×255

使用特权

评论回复
6
utterboy|  楼主 | 2010-3-10 21:19 | 只看该作者
请各位帮帮看看,错在哪里,急吖

使用特权

评论回复
7
utterboy|  楼主 | 2010-3-11 10:54 | 只看该作者
打扰各位了,问题找到了
AD采样赋值时我怎么左移8位了,那个值相当的大吖

使用特权

评论回复
8
utterboy|  楼主 | 2010-3-11 10:54 | 只看该作者
其气死我了

使用特权

评论回复
9
liao_fangxing| | 2010-3-11 11:24 | 只看该作者
没啥可气的  谁不犯点低级错误 注意积累经验  下次小心就行

使用特权

评论回复
10
laslison| | 2010-3-13 11:04 | 只看该作者
好强啊

使用特权

评论回复
11
jack_icc| | 2010-8-3 20:46 | 只看该作者
不錯

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

305

帖子

0

粉丝