STM8L051,AD值误差大
金币全给了,不要嫌少,问题如下前段时间在使用STM8S在一个锂电池管理项目上,但是发现给MCU供电不是很好处理,故改用STM8L051 发现一个比较奇怪的问题!
单独转换通道 AD值还是比较准确的,但是4个通道轮番扫描一次就 ,AD值就有比较大的误差,程序如下
程序放在中断里面,无关部分省略…………
for(ADCCH=0;ADCCH<4;)
{
if(ADCCH == 0)
{
InputTep = InputTep + ADC_CONV(ADCCH);
}
if(ADCCH == 1)
{
BattTep = BattTep + ADC_CONV(ADCCH);
}
if(ADCCH == 2)
{
VBusTep = VBusTep + ADC_CONV(ADCCH);
}
if(ADCCH == 3)
{
LoadCurrTep = LoadCurrTep + ADC_CONV(ADCCH);
}
ADCCH++;
}
ADCCNT++;
if(ADCCNT == 8)
{
InputAVGOld = InputAVG;
BattAVGOld = BattAVG;
VBusAVGOld = VBusAVG;
LoadCurrAVGOld = LoadCurrAVG;
InputAVG = InputTep>>3;
BattAVG = BattTep>>3;
VBusAVG = VBusTep>>3;
LoadCurrAVG = LoadCurrTep>>3;
InputTep = 0;
BattTep = 0;
VBusTep = 0;
LoadCurrTep = 0;
ADCCNT = 0;
}
void Init_AD(void)
{
ADC1_CR2 = 0x83;
ADC1_CR3 = 0x80;
ADC1_SQR1 = 0x80;
ADC1_SQR2 = 0;
ADC1_SQR4 = 0;
}
unsigned int ADC_CONV(unsigned char ADCH)
{
unsigned int DataTep;
unsigned int DataTep1;
ADC1_SQR3 = 0x08<<ADCH;
ADC1_CR1|=0x02;
while(ADC1_SR_EOC == 0);
DataTep = ADC1_DRL;
DataTep1 = ADC1_DRH;
DataTep1 = DataTep1<<8;
DataTep = DataTep|DataTep1;
ADC1_SR_EOC = 0;
ADC1_SQR3 = 0;
return DataTep;
}
ADC_CONV函数里面可以对ADC1_CR1进行清零一下 z00 发表于 2015-2-5 10:53
ADC_CONV函数里面可以对ADC1_CR1进行清零一下
清理ADC1_CR1_CON位还是 star位ADC POWERON 模式来回切换那样采样 也还是不准确。 看看怎么能解决 建议AD转换函数里,设置完AD通道后,加少许延时(比如说加一些空指令),然后再启动AD。
试试看? 转换通道后第一次AD值应该丢弃,AVR是这样建议的,不知ST是否这样。
1、建议转换通道后连续采样多次(第一次结果丢弃),得到通道N的AD值(平均法)
2、改变通道N,进行下一个通道的AD采集。 不会帮顶 我觉得是通道需要清除,可能没清除引起的,不知道是不是,楼主现在怎么样了 楼主误差究竟多大?
页:
[1]