找回密码
 立即注册
查看: 213|回复: 4

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

[复制链接]
  • TA的每日心情
    开心
    昨天 08:29
  • 签到天数: 137 天

    [LV.7]常住居民III

    11

    主题

    90

    回帖

    346

    积分

    中级会员

    积分
    346
    发表于 2024-2-20 11:09:15 | 显示全部楼层 |阅读模式
    我在看冲哥的STC32视频,ADC检测16个按键那一课里,条件编译用查询模式时,没有按键按下时,一般就返回0或1,但如果改用中断模式时,没有按键按下时,我用STC8H实验箱,总是返回7左右,看了看冲哥的视频,他是返回5左右,都不是0。然后再切换回查询模式,ADC又返回0或1了,不得其解,尝试加了nop也没有用。哪位高人能帮忙回答?谢谢!
    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3058

    回帖

    6895

    积分

    超级版主

    积分
    6895
    发表于 2024-2-20 13:42:25 | 显示全部楼层
    ADC结果跟查询读取或中断读取没关系的,不按键有读数是因为有一个大的输入电阻(比如200K),对于按键识别没有影响。要小的0点读数就要用更小的输入电阻,比如10K。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:29
  • 签到天数: 137 天

    [LV.7]常住居民III

    11

    主题

    90

    回帖

    346

    积分

    中级会员

    积分
    346
     楼主| 发表于 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)
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9567

    回帖

    1万

    积分

    管理员

    积分
    14057
    发表于 2024-2-20 15:20:37 | 显示全部楼层
    你用仿真功能,深入进去看下,你程序错在哪
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:29
  • 签到天数: 137 天

    [LV.7]常住居民III

    11

    主题

    90

    回帖

    346

    积分

    中级会员

    积分
    346
     楼主| 发表于 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下集里的程序)

    111.png
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-22 01:56 , Processed in 0.059606 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表