用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次开始比较稳定,请教问题出在哪里?
试试舍弃第一次的采样值。 纠正错误。
1, ADMUX = (1 << REFS0); /*基准AVCC*/改为
ADMUX = 0; /*REF电压*/
实测,PA0电压为2.0v,转换出来的数值第一次为2.0V,第三次以后为3.0V,求解 这个问题好像是i*5000超范围了,结贴。
页:
[1]