- 打卡等级:以坛为家I
- 打卡总天数:351
- 最近打卡:2025-05-02 07:09:45
高级会员
- 积分
- 833
|
明天就是除夕了,给大家拜个早年,祝各位新春大吉,万事如意。
虽说是放假了,有一个关于ADC的问题念念不忘:有10个模拟量需要用AD口来测,这些模拟量变化频率不高,周期都是毫秒级的,硬件设计是用10个AD口去测这些模拟量,以前的程序是在主程序中打开AD电源,选中相应的AD口,ADC_START 位置为1,
然后死等1毫秒,再去读ADC_RESL的值。但是最近需要把这部分程序改到中断中去执行,这个中断的周期是1毫秒,这样就不行了。所以我参照例程《ADC键盘扫描数码管显示键值和调整时间》,把以上程序改为:在主程序初始化时就打开AD的电源,死等1毫秒后启动一个1毫秒中断,在中断中选中要读的模拟量的端口,设置到ADC_CONTR中,执行4次 NOP,然后置位ADC_START ,然后执行如下程序:
L_WaitAdcLoop:
MOV A, ADC_CONTR
JNB ACC.5, L_WaitAdcLoop
ANL ADC_CONTR, #NOT 020H ;清除完成标志
读出ADC_RESL中的值,然后再选中下一个要读的模拟量的端口,再执行上述操作,直到把所有的AD口的值读出。在实际应用中,偶尔会发现读出的AD值不准,程序中关于AD的其他设置都是用的默认值,这段程序的核心是选中相应的AD口后,置位ADC_START,等待ADC_FLAG 变为1,完成后读出数值,后来我改为置位ADC_START后,等待ADC_START变为0也不行,难道置位ADC_START后,死等1毫秒,比置位ADC_START后,等AD完成,读出的数据准确吗?单片机用的是STC32G12K128,谢谢大家。
|
|