newlined 发表于 2025-1-27 21:48:02

大家好,请教一个ADC的问题

明天就是除夕了,给大家拜个早年,祝各位新春大吉,万事如意。

虽说是放假了,有一个关于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,谢谢大家。

DebugLab 发表于 2025-1-27 22:51:54

不要死等
只要ADC转换完成,标志位被置位,再读,就是准确的

newlined 发表于 2025-1-28 02:18:22

DebugLab 发表于 2025-1-27 22:51
不要死等
只要AD转换完成,标志位被置位,再读,就是准确的

谢谢版主的回复,假设我把一部分的AD口在主程序中读,另一部分在中断中读,请问哪些寄存器需要保护?另外需要注意什么?

DebugLab 发表于 2025-1-29 10:24:18

newlined 发表于 2025-1-28 02:18
谢谢版主的回复,假设我把一部分的AD口在主程序中读,另一部分在中断中读,请问哪些寄存器需要保护?另外 ...

读寄存器中的ADC值之前,不要启动新的一次转换就行,以免值被覆盖

newlined 发表于 2025-2-8 08:24:03

DebugLab 发表于 2025-1-29 10:24
读寄存器中的ADC值之前,不要启动新的一次转换就行,以免值被覆盖

谢谢版主的回复,我是担心在主程序中的ADC执行过程中,又产生中断,执行另一个ADC。看来我需要做一个标志,或者想办法采取措施。
页: [1]
查看完整版本: 大家好,请教一个ADC的问题