搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2013-12-30 12:54:23 | 显示全部楼层 |阅读模式
/*********************************************************************************************
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[0] = (val&0xff);
        com_output_buff.dd[1] = ((unsigned char)(val>>8)&0xff);//输出十六进制mV电压
        break;
}

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











阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-30 13:16:08 | 显示全部楼层
试试舍弃第一次的采样值。

出0入0汤圆

 楼主| 发表于 2014-1-4 10:28:29 | 显示全部楼层
纠正错误。
1, ADMUX = (1 << REFS0);                                                                /*基准AVCC*/改为
ADMUX = 0;   /*REF电压*/

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

出0入0汤圆

 楼主| 发表于 2014-9-18 11:00:55 | 显示全部楼层
这个问题好像是i*5000超范围了,结贴。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 02:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表