大家好!我最近在Keil MDK调试TM4F123的ADC功能时,用的是PE0口作为ADC输入口,配置代码如下,
这代码主要是TI给的官方例程,12bitADC采样,3.3V供电。外部输入的电压经过采样转化,发现计算值和输入值误差很大。输入电压较低时有0.7V的误差,输入电压较高误差也有0.3v左右。很奇怪,大家帮忙看看,有什么办法提高精度?谢谢了。
int main(void)
{ unsigned long ulADC0_Value[1];
unsigned long addr;
SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);
ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH3 | ADC_CTL_IE |
ADC_CTL_END);
ADCSequenceEnable(ADC0_BASE, 3);
ADCIntClear(ADC0_BASE, 3);
while(1)
{
ADCProcessorTrigger(ADC0_BASE, 3);
while(!ADCIntStatus(ADC0_BASE, 3, false))
{
}
ADCSequenceDataGet(ADC0_BASE, 3, ulADC0_Value);
addr=ulADC0_Value[0];
SysCtlDelay(SysCtlClockGet() / 12);
}
}
Ken Wang:
Hi Paul,
你的程序中忘了定义ADC的采样速率。可以使用SysCtlADCSpeedSet() API 函数来设定。
加上这句后,再看看实验效果。谢谢!
ken
Tang:
回复 Ken Wang:
这个没有默认值吗?
Richard Ma:
楼主你好,请试着用ReferenceSet设置参考源为ADC_REF_INT
另外楼主的偏差是如何测量出来的?能不能介绍下?
paul cai:
回复 Richard Ma:
我在电压输入端和IO之间原先有个串接电阻,现在将这个电阻阻值改小后,就比较准确了。我想可能就是这个问题。谢谢上面几位的回答了,都对我设计有帮助!
Richard Ma:
回复 paul cai:
是的,这种串联电阻不能太大,否则即使电流很小,在上面的压降也会较高,会导致不准