|
/*********************************************************************************************
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, 杜汶泽)
|