好了继续更帖,PWM-ADC的调试
最初的ADC算法是 15ms的PWM延时 x 16次对折逼近 ,电压输入端口直接短接为0v,最终读数640多,7个字的读数抖动范围,这稳定性真惨。。。
为什么会这样?想不通。
尝试在16次对折逼近之后 再增加2次PWM微调逼近,也就是说在最后时刻再读取两次OP07的电压比较结果,每次微调PWM增或减一个数字。
这样优化之后,抖动范围降低到了4个字。嘿嘿有效果哎?
继续增加PWM的微调次数到4次,抖动范围还是4个字.....什么情况?增加到6次微调,也还是4个字......
遇到瓶颈了,又想不通了。折腾了一整天,尝试了各种方法,毫无收获。
然后怒接示波器,一看OP07的输出波形,真相大白。。
(此图中的电压刻度乘以10才是实际值,测量点是OP07输出电阻之后的电压,也就是74HC14的输入端,被自动钳位在-0.6到5.6v之间)
OP07的输出跳变速度有快有慢,ADC过程刚开始的时候,电压区别大的时候,跳变快;到后面PWM电压越来越接近,就越来越慢了。
最慢的跳变时间都超过了20ms,都比我的PWM建立时间15ms还要慢了,只延时15ms就读OP07原来是太急了呀。
继续深入研究跳变时间,控制PWM电压在被测电压的一两个字附近调整,跳变时间居然超过了40ms.......你让我情何以堪?这么慢还怎么做ADC末位的高精度?只能是降标使用咯~~~
(此图中的电压刻度乘以10才是实际值,测量点是OP07的输出脚)
最终,为了改善PWM-ADC精度,ADC算法调整为:
在采样电容充电期间,先用STM8自带的10位ADC来预先测量电压的大概值(64次采样再求平均值)
得到低精度的内置ADC结果,保守取其8位精度,在目标电压的附近,再用PWM-ADC来进一步ADC(15ms x 8次逼近 + 60ms x 2次微调)
ADC速度为每秒2次,最终得到了抖动2个字的结果,至此,不折腾了