标题: 关于STC8G1K08单片机的ADC使用问题 [打印本页]

作者: zt997354616    时间: 2024-4-18 11:31
标题: 关于STC8G1K08单片机的ADC使用问题
我想请教一下各位大佬,STC8G1K08的ADC可以用定时器中断定时触发一路ADC,同时在大循环内轮询其他几路ADC吗?我这样使用发现会存在以下情况,中断里面的ADC和大循环里面的ADC会互相影响,我认为的原因是,在大循环里的ADC采样转换之后但是还没有进行赋值的时候,就进入了中断,然后中断里面的ADC值就变成了大循环的值,然后就这样互相影响。我想请教一下有什么解决办法吗

作者: a185980800    时间: 2024-4-18 13:16
要不就中段让路就是在大循环里读a dc的时候暂时关一下中断,要不就大循环避让在近中段的时候用全局变量做一个中段标记大循环里读a dc的值到变量里然后使使用这个变量的值时判断一下中断标记是否为真如果为真的话就抛弃上一次采集的a dc值
作者: a185980800    时间: 2024-4-18 14:12
忘记说了,在大循环里读ADC前把进中断标记清零,读完后查看一下中断标记为1就是进过中断了抛弃读到的ADC值。
作者: xiaobendan001    时间: 2024-4-18 14:21
为何要这样做呢?都放大循环或者都放中断不行?又或者在ADC中断里面读完了以后立刻启动下个通道?
作者: zt997354616    时间: 2024-4-18 14:41
xiaobendan001 发表于 2024-4-18 14:21
为何要这样做呢?都放大循环或者都放中断不行?又或者在ADC中断里面读完了以后立刻启动下个通道?

定时器中断的那一路是用来做PI稳住反激副边的电压,如果把所有的ADC都放一起的话PI那一路进入的时间就不确定了
作者: zt997354616    时间: 2024-4-18 14:42
a185980800 发表于 2024-4-18 13:16
要不就中段让路就是在大循环里读a dc的时候暂时关一下中断,要不就大循环避让在近中段的时候用全局变量做一 ...

好的,我试一下
作者: xiaobendan001    时间: 2024-4-18 15:35
zt997354616 发表于 2024-4-18 14:41
定时器中断的那一路是用来做PI稳住反激副边的电压,如果把所有的ADC都放一起的话PI那一路进入的时间就不 ...

所有的都放主循环,定时器只是到时间把主循环获得的值拿过来用一下这样不行?
作者: zt997354616    时间: 2024-4-18 16:18
xiaobendan001 发表于 2024-4-18 15:35
所有的都放主循环,定时器只是到时间把主循环获得的值拿过来用一下这样不行?

好的我试一下
作者: zt997354616    时间: 2024-4-18 16:25
xiaobendan001 发表于 2024-4-18 15:35
所有的都放主循环,定时器只是到时间把主循环获得的值拿过来用一下这样不行?

应该不太行呢,如果我把PI这一路的值采了之后放进一个变量,定时器时间到了就去处理这个值,然后又回到大循环采其他值,然后又第二次中断来临,但是这个时候我第一次的大循环还没有结束,也就是我的PI那一路的值并没有更新
作者: xiaobendan001    时间: 2024-4-18 16:52
zt997354616 发表于 2024-4-18 16:25
应该不太行呢,如果我把PI这一路的值采了之后放进一个变量,定时器时间到了就去处理这个值,然后又回到大 ...

大循环这么慢吗?不是定时器每次到达之前大循环其实都很多次了?哦,这看工程大小了。
要不就直接在ADC中断服务结束时再次开启,所有通道的值都在ADC中断里面处理
作者: wulin    时间: 2024-4-18 17:33
zt997354616 发表于 2024-4-18 14:41
定时器中断的那一路是用来做PI稳住反激副边的电压,如果把所有的ADC都放一起的话PI那一路进入的时间就不 ...

如果定时器中断周期有足够时间,可以把其它几路ADC都放在中断中,每次中断运行一次PI那一路,根据需求附带运行一路或几路其它ADC,避免干扰。
作者: zt997354616    时间: 2024-4-18 20:18
xiaobendan001 发表于 2024-4-18 16:52
大循环这么慢吗?不是定时器每次到达之前大循环其实都很多次了?哦,这看工程大小了。
要不就直接在ADC ...

定时器是20us触发中断,大循环大概是40-50,adc中断服务结束时再次开启是什么意思,开启转换其他的ADC吗

作者: zt997354616    时间: 2024-4-18 20:19
wulin 发表于 2024-4-18 17:33
如果定时器中断周期有足够时间,可以把其它几路ADC都放在中断中,每次中断运行一次PI那一路,根据需求附 ...

没太懂您的意思,可以详细一点吗
作者: xiaobendan001    时间: 2024-4-18 20:36
zt997354616 发表于 2024-4-18 20:18
定时器是20us触发中断,大循环大概是40-50,adc中断服务结束时再次开启是什么意思,开启转换其他的ADC吗
...

定时器20us?这么短?这,20us的话AD转换完成了吗?
作者: wulin    时间: 2024-4-18 21:03
zt997354616 发表于 2024-4-18 20:18
定时器是20us触发中断,大循环大概是40-50,adc中断服务结束时再次开启是什么意思,开启转换其他的ADC吗
...

单片机内部ADC转换电路只有一套,通过分时切换通道完成多通道转换任务,当定时器20us中断触发ADC转换时恰巧主循环正在其它通道转换中,必然会出错。20us中断周期太短,无法用上述的方案处理。建议用硬件反馈电路处理反激副边电压。
作者: zt997354616    时间: 2024-4-18 21:13
xiaobendan001 发表于 2024-4-18 20:36
定时器20us?这么短?这,20us的话AD转换完成了吗?

完成了的,stc8g1k08的ADC最快速度为500k
作者: zt997354616    时间: 2024-4-18 21:16
wulin 发表于 2024-4-18 21:03
单片机内部ADC转换电路只有一套,通过分时切换通道完成多通道转换任务,当定时器20us中断触发ADC转换时恰 ...

好的感谢您的意见
作者: a185980800    时间: 2024-4-19 01:55
wulin 发表于 2024-4-18 17:33
如果定时器中断周期有足够时间,可以把其它几路ADC都放在中断中,每次中断运行一次PI那一路,根据需求附 ...

哪有给中断里多放东西的,中断服务应该,处理越少越好,尽快退出来。
作者: xiaobendan001    时间: 2024-4-19 07:29
a185980800 发表于 2024-4-19 01:55
哪有给中断里多放东西的,中断服务应该,处理越少越好,尽快退出来。

每次中断获得结果后重新启动下一个通道也花不了多少时间的。即使有500K,你这20us也太快了,你还要好几个通道。况且500K可能是理论值,实际上可能根本不行或者效果很差。




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