标题: STC8H单片机ADC采样时被其它中断打断 会导致结果不正确吗? [打印本页]

作者: cjjdemon    时间: 2021-10-18 14:44
标题: STC8H单片机ADC采样时被其它中断打断 会导致结果不正确吗?
各位大神,我用STC8H3K64S2单片机做太阳能MPPT产品,需要同时用到PWM和ADC采样。
PWM直接采用硬件16位高级PWM,生成带死区互补的PWM波形,使用到PWM中断。频率约56kHz,中断周期约18us
ADC直接采用查询方式进行,在每次PWM中断后进行一次计数,采输入电压、输入电流、输出电压。采样时间约12us。
但现在ADC返回的三个数值都是0(0~3之间波动,实际数值应该在300~1000之间,12位ADC),ADC采样程序是其它项目上正常移植过来的,应该没啥问题;输入电压、电流、输出电压用万用表测量,数值都正常;IO口上直接测量输入数值也都正确

现在怀疑PWM中断有可能会打断ADC,但这个会导致ADC读出来的数值全部是0吗?
是否一定要用ADC中断方式才可以呢?
谢谢!

作者: Y_G_G    时间: 2021-10-18 18:38
18uS就进入中断一次,如果ADC是查询方式的话,刚刚退出中断没多久又要进入中断了,程序能不能正常运行都是个问题
至于PWM,它是不会影响ADC结果的
作者: cjjdemon    时间: 2021-10-18 18:45
Y_G_G 发表于 2021-10-18 18:38
18uS就进入中断一次,如果ADC是查询方式的话,刚刚退出中断没多久又要进入中断了,程序能不能正常运行都是个问 ...

程序的PWM是正常的,互补波形也正常。现在就是ADC采集的数据不正常,所以怀疑会不会是因为这个查询方式被PWM中断打断了,导致采到的数值是0,有这个可能吗?
明天我把ADC采集改成中断方式试试看,但也可能有中断冲突的可能。
作者: liuzx66    时间: 2021-10-18 18:50
你算一下中断处理程序是多少时间,看看给主程序留了多少时间
作者: cjjdemon    时间: 2021-10-18 18:57
liuzx66 发表于 2021-10-18 18:50
你算一下中断处理程序是多少时间,看看给主程序留了多少时间

进PWM中断,就三行程序
1.软件清中断标志位
2.一个变量++1
3.一个IO口取反
应该应该非常快,不到1us应该可以出中断了。
作者: Y_G_G    时间: 2021-10-18 19:38
cjjdemon 发表于 2021-10-18 18:57
进PWM中断,就三行程序
1.软件清中断标志位
2.一个变量++1

这不是中断用时的问题,是你只给主程序18uS的时间,每18uS就要进入中断一次,主程序很有可能是一直不断的被打断
不知道你用这么高频率的PWM来干嘛,如果是驱动LED,建议用超过1KHz就可以了
如果ADC再使用中断,估计主程序都没有时间干活了,不断的在ADC和PWM之间来回的跑........
作者: cjjdemon    时间: 2021-10-18 22:08
Y_G_G 发表于 2021-10-18 19:38
这不是中断用时的问题,是你只给主程序18uS的时间,每18uS就要进入中断一次,主程序很有可能是一直不断的被 ...

高频PWM是用来做BOOST升压的,同步整流升压。
主程序就是不断地采集太阳能板的电压和电流,以便让太阳能板一直处于最大功率点工作。BOOST升压后给电池充电,或者给逆变器供电。
希望能够做到逐周期检测太阳能板的功率,以便快速调整占空比,让太阳能板最大功率运行。
作者: lkc8210    时间: 2021-10-18 22:52
有没有用过示波器观察输入电压、输入电流、输出电压的波型?
有没有机会是每次ADC开始测量时都刚好到了死区时间?
在ADC开始时罝高某脚,如P37 = 1;
在ADC结束时罝低某脚,如P37 = 0;
对比P37和输入电压、输入电流、输出电压的波型
看看ADC在测量什么

作者: wskufo    时间: 2021-10-19 09:35
AD转换的速度够不够???
作者: Y_G_G    时间: 2021-10-19 11:41
cjjdemon 发表于 2021-10-18 22:08
高频PWM是用来做BOOST升压的,同步整流升压。
主程序就是不断地采集太阳能板的电压和电流,以便让太阳能 ...

MPPT也不用每个PWM时钟都进行调节的吧?
这18uS阳光能有多大变化呢?
作者: cjjdemon    时间: 2021-10-19 21:39
lkc8210 发表于 2021-10-18 22:52
有没有用过示波器观察输入电压、输入电流、输出电压的波型?
有没有机会是每次ADC开始测量时都刚好到了死 ...

感谢老哥,今天又调试了一下,发现有个bug,现在已经搞定了。
作者: cjjdemon    时间: 2021-10-19 21:42
Y_G_G 发表于 2021-10-19 11:41
MPPT也不用每个PWM时钟都进行调节的吧?
这18uS阳光能有多大变化呢?

恩,现在改成5ms了,实际采样加计算,最快能到2.7Khz左右。不需要每周期检测也是可以的,只是波动会更大。
今天找到bug了,现在已经正常运行啦,我不是电子相关专业的,我是化学专业的,对于很多类似的原理不太了解,所以当程序不能正常运行的时候,才会有这些疑问,非常感谢各位的回答。
作者: TTQ001    时间: 2021-10-20 09:11
如果结果始终为零,则可能是由于快速中断调用而不是来自 PWM 输出的干扰。
作者: lkc8210    时间: 2021-10-20 10:26
cjjdemon 发表于 2021-10-19 21:39
感谢老哥,今天又调试了一下,发现有个bug,现在已经搞定了。

赠人玫瑰 手留余香
说一下是什么Bug
让后人参考一下
作者: wulin    时间: 2021-10-20 21:23
经实物测试,10us中断对ADC没有明显影响,测量电压偏高十几mV。
作者: cjjdemon    时间: 2021-10-21 09:01
lkc8210 发表于 2021-10-20 10:26
赠人玫瑰 手留余香
说一下是什么Bug
让后人参考一下

很低级的错误,我每次进中断要用P1.0/1.1/1.2采集数据,但采集完成后,通道没有复位为0x00,一直是0x02,写通道的操作又是|,导致除了第一次采集的数据是正确的,第二次以后全部采的是最后02通道的数据,正好最后一个通道采的是电流,系统没正常工作是没电流的,所以后面的数据一直是0,我上位机读数据又是每500ms读一下,第一组数据被漏了。
后来我改了一下程序,降低了频率,每次都上传数据,就发现这个问题啦。
作者: cjjdemon    时间: 2021-10-21 09:01
wulin 发表于 2021-10-20 21:23
经实物测试,10us中断对ADC没有明显影响,测量电压偏高十几mV。

感谢!以后就不会再怀疑中断会影响ADC啦。
作者: HAPPY3    时间: 2022-1-5 09:54
你学化学,没电类基础也会玩这个,真服你了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1