各位大侠请指点下小弟
采样函数及中断函数:
unsigned int ADC16_Sample(char ADC,unsigned int AverageNum)
{
//unsigned long int ADC_SumU=0;//无符号模式的累加值
signed long int ADC_SumS=0;//有符号模式的累加值
unsigned int *SD16CCTL; //ADCx控制寄存器选择指针
int i;
SD16CCTL=(unsigned int *)&SD16CCTL0;//指针指向ADC0控制寄存器
*SD16CCTL |=SD16IE; //打开选中的ADC的中断
_EINT(); //开总中断
P1OUT &= ~CS;
ADC16_VrefOn();
*SD16CCTL |= SD16SC; //向选中的ADC发出"开始采样"命令
for(i=0;i<AverageNum;i++) //循环连续采样
{
for(unsigned int j=0;j<10000;j++);
while(ADC_Flag==0) LPM0; //等待一次采样结束
ADC_Flag=0;
ADC_SumS+=(int)ADC_Result[ADC]; //按有符号模式累加
} //采样次数达到
ADC16_VrefOff();
P1OUT |= CS;
*SD16CCTL &=~ SD16SC; //向选中的ADC发出"停止采样"命令
*SD16CCTL &=~ SD16IE; //关闭相应ADC的中断
return(ADC_SumS>>4); //有符号数据格式平均值/AverageNum
}
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
switch (SD16IV) //判断中断类型
{
case 2: // SD16MEM Overflow
break;
case 4: // ADC0 采样结束
ADC_Result[0]=SD16MEM0+187;
if(SD16MEM0>0X7FFF)
{
Num_Flag=1;
}
else
{
Num_Flag=0;
}
break; // 保存ADC0采样结果
}
ADC_Flag=1; //ADC中断已执行标志
__low_power_mode_off_on_exit(); //唤醒CPU
}
哪位帮忙分析下什么原因,谢谢了。
问题:采集0.08v到0.4v的电压值,但是AD转换后的数据比模拟值要偏小,而且随着信号的增大,偏差越来越大。量程范围内,最大偏差10mv。 |