ATMega2560/Arduino连续ADC采样后复位控制标志analogRead读数异常
问题根源
你在连续采样代码中修改了ADC的核心配置,停止采样时直接将寄存器置0的操作,并没有恢复Arduino analogRead() 函数依赖的默认配置,这是读数异常的核心原因,具体涉及三处关键配置错误:
- 参考电压配置错误:
analogRead()默认使用AVCC作为参考电压,对应ADMUX寄存器的REFS0位置1。你在stopADCAcquire函数中将ADMUX置0,导致REFS0变为0,ADC参考源切换为外部AREF引脚,若该引脚无外接参考电压,读数必然出现大幅偏差。 - ADC时钟配置错误:
analogRead()默认使用128分频的ADC时钟(16MHz主频下对应125kHz采样时钟,符合ADC精度要求),你将ADCSRA置0后ADPS分频位全为0,对应2分频的过高ADC时钟,会导致采样精度严重下降。 - ADC外设被关闭:你将ADCSRA置0的同时关闭了ADC使能位
ADEN,analogRead()首次唤醒ADC时采样保持电容未完成充电,也会导致首次读数不准。
解决方法
修改stopADCAcquire函数,不要直接清空寄存器,而是主动恢复analogRead需要的默认配置:
void stopADCAcquire(){ Serial.println(""); Serial.println("Stop ADC Acquire"); cli();//关闭中断 // 清零控制寄存器 ADCSRA = 0; ADCSRB = 0; // 恢复默认配置:参考电压为AVCC、右对齐、通道默认值 ADMUX = _BV(REFS0); // 恢复默认时钟配置:使能ADC、设置128分频 ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); sei();//开启中断 // 额外加一次空读,稳定采样电容 analogRead(A2); }
如果修改后仍有轻微偏差,可在连续采样结束后连续读取2次目标引脚,丢弃第一次读数即可。
内容的提问来源于stack exchange,提问作者paulp
相关产品推荐
相关产品推荐

