cclgxuanshao 发表于 2013-12-30 12:54:23

用mega32的PA0单通道测电池电压问题

/*********************************************************************************************
ADC初始化

函数说明:采样ADC通道0。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:无

*********************************************************************************************/
void ADC_init(void)
{
    DDRA = 0x00;          /*方向输入*/
    PORTA = 0xFF;                /*打开上拉*/       
}
/*********************************************************************************************
ADC采样函数

函数说明:采样ADC通道0。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:16位AD值
*********************************************************************************************/
unsigned int get_ad(void)
{

        unsigned int i;
       
        ADMUX = (1 << REFS0);                                                                /*基准AVCC*/
        ADMUX &= ~((1 << MUX2) | (1 << MUX1) | (1 << MUX0));/*通道0*/
        ADCSRA = (1 << ADEN) | (1 << ADSC)                                        /*使能、开启*/
                        | (1 << ADPS1) | (1 << ADPS0);                                /*8分频*/
        while(!(ADCSRA & (1 << ADIF)));                                                /*等待采样结束*/
        i = ADC;                                                                                        /*读取AD结果*/
        ADCSRA &= ~(1 << ADIF);                                                                /*清标志*/
        ADCSRA &= ~(1 << ADEN);                                                                /*关闭转换*/

        return i;                                                                                        /*返回结果*/
}

case 04:                                          /*测量电池*/
{   
      i=0;
      for (j=0;j<3;j++)
         {
                                                  
        delay_ms(100);               /*周期控制*/
       i = get_ad();              /*获取电压*/
       WDR();        //喂狗
          i = (unsigned int)(((unsigned long)i*5000)/1024);        /*将AD结果转成mV电压值, */                                                                                                      
       val += i;
         }
                                       
        val = (unsigned int)((float)(val)/3.0);         /*3次测量求平均值,此时val电压值为mV*/
        com_output_buff.size = com_input_buff.size;       
        com_output_buff.dd = (val&0xff);
        com_output_buff.dd = ((unsigned char)(val>>8)&0xff);//输出十六进制mV电压
        break;
}

其中外接Ref电压为2.5V,
通过串口助手发送指令,返回的 i 值 前3次各不相同,第4次开始比较稳定,请教问题出在哪里?











z7z8king 发表于 2013-12-30 13:16:08

试试舍弃第一次的采样值。

cclgxuanshao 发表于 2014-1-4 10:28:29

纠正错误。
1, ADMUX = (1 << REFS0);                                                                /*基准AVCC*/改为
ADMUX = 0;   /*REF电压*/

实测,PA0电压为2.0v,转换出来的数值第一次为2.0V,第三次以后为3.0V,求解

cclgxuanshao 发表于 2014-9-18 11:00:55

这个问题好像是i*5000超范围了,结贴。
页: [1]
查看完整版本: 用mega32的PA0单通道测电池电压问题