pursuing 发表于 2024-2-20 11:09:15

为何ADC中断模式比查询模式误差大?

我在看冲哥的STC32视频,ADC检测16个按键那一课里,条件编译用查询模式时,没有按键按下时,一般就返回0或1,但如果改用中断模式时,没有按键按下时,我用STC8H实验箱,总是返回7左右,看了看冲哥的视频,他是返回5左右,都不是0。然后再切换回查询模式,ADC又返回0或1了,不得其解,尝试加了nop也没有用。哪位高人能帮忙回答?谢谢!

梁工 发表于 2024-2-20 13:42:25

ADC结果跟查询读取或中断读取没关系的,不按键有读数是因为有一个大的输入电阻(比如200K),对于按键识别没有影响。要小的0点读数就要用更小的输入电阻,比如10K。

pursuing 发表于 2024-2-20 15:08:25

本帖最后由 pursuing 于 2024-2-20 15:10 编辑

梁工 发表于 2024-2-20 13:42
ADC结果跟查询读取或中断读取没关系的,不按键有读数是因为有一个大的输入电阻(比如200K),对于按键识别 ...
谢谢梁工,我也觉得跟中断方式或查询方式应该没有关系。但是现在ADC一个引脚检测16个按键,电路都是一样的,只是查询模式时返回0或1,中断时就会大一点,这就不大好解释了,毕竟我也没改动电路。我用的是冲哥第17课ADC里的程序,条件编译选择用查询模式还是中断模式。(冲哥用的STC32,中断模式时,没有按键时视频里返回5,我用的STC8H实验箱,没有按键是返回7,但只要改为查询模式,没有按键按下就返回0,偶尔是个1)

神农鼎 发表于 2024-2-20 15:20:37

你用仿真功能,深入进去看下,你程序错在哪

pursuing 发表于 2024-2-21 13:38:17

我仿真了一下,除了第一次 ADCval 是个比较大的树(如0x062F)之外,其他时间几乎都是0或1,忽略第一次的话,应该都是对的,但打印出来就是7,偶尔出现8或10。

附上中断方式查询ADC的程序:



        void ADC_isr() interrupt 5
      {
                ADC_CONTR &= ~0x20; // 清空读取flag
                ADCval = (ADC_RES <<8) + ADC_RESL;// 这里高8位除第一次是0x06外,之后都是0。低8位第一次是0x2几,之后不是0就是1。
                ADC_CONTR |= 0x40;// 再次启动 AD 转换
        }

主程序中:

        while(1){
                        // 查询时的ADC:
                        //ADC_VAL = ADC_Read(0);// 查询时用的变量。通道0
                        //printf("当前 ADC 数\xfd值:%hd\t对应电压:%hd mV\r\n", ADC_VAL, ADC_CAL_Voltage(ADC_VAL));

                       
                        // 中断时的ADC(下面一句放到10ms一次的定时中断中,结果一样):
                        printf("当前 ADC 数\xfd值:%hd\t对应电压:%hd mV\r\n", ADCval, ADC_CAL_Voltage(ADCval)); // 仿真时这里ADCval一直是0或1,正确,但USB-CDC串口助手中总是返回7
        }


为何仿真时ADCval总是0,但实际打印出来是7(如图,HEX显示是0x37)?冲哥的视频中用的STC32G,返回的是5。但我查询方式时,按键不按下,返回总是0或1,显示也都正确。(我用的冲哥17课视频ADC下集里的程序)

页: [1]
查看完整版本: 为何ADC中断模式比查询模式误差大?