找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1417|回复: 6
收起左侧

单片机ADC采样导致数码管变暗的问题

[复制链接]
ID:997026 发表于 2022-5-25 22:51 | 显示全部楼层 |阅读模式
之前开发一些简单的单片机程序,并没有感觉到经常提到的实时性的问题,最近需要开发一个产品,要用到ADC采样,需要采集三路ADC,我用的是ADC+DMA方式,每个通道采集10次,DMA搬运30次,采集完之后先做中位值平均滤波算法,然后在使用得到的值。

ADC采样和数据处理,滤波算法等都放在一个函数中,暂且称为采集函数,采集函数放在main中,我的产品中也有数码管显示,显示函数也放在main中,程序功能都没什么问题,代码也没啥问题,能正常采集到数据,也能正常显示。

现在的问题是,数码管亮度会变暗。当我在main中注释掉ADC采集函数后,数码管亮度恢复正常,证明是这个采集函数问题,而且我把通道采集次数放长一点,比如由10次放到20次,或更长,亮度会依次变暗,也就是说,采集次数设置的越长,亮度就越暗。

我后来仔细想了一下,怀疑是采集次数变长以后,中位值滤波算法要执行更多的计算,耗时更长,导致整个采集函数执行时间变长,而且这个执行时间明显大于main函数里面其他函数的执行时间,导致实时性变差,影响了数码管显示。目前的思路就是打算把采集函数分解开来,把ADC采样,ADC数据处理,中位值滤波等都放在不同的函数,让执行时间更均匀,但我没试过,不知道有没有效果,因为总时间好像没变。

除此之外,大家还有其他思路和框架吗?可以改善实时性问题的,谢谢
回复

使用道具 举报

ID:1027834 发表于 2022-5-25 23:11 | 显示全部楼层
把ADC采样和LED显示都使用定时器进行定时,比如DMA一直采样,但不进行计算,比如每隔500ms进行一次计算,同样的,数码管显示也是每隔一段时间进行显示刷新。
如果还想更要实时性,可以使用RTOS。
回复

使用道具 举报

ID:624769 发表于 2022-5-25 23:54 | 显示全部楼层
说明你数码管没有通过定时器中断点亮。
回复

使用道具 举报

ID:712493 发表于 2022-5-26 09:13 | 显示全部楼层
Materialism 发表于 2022-5-25 23:11
把ADC采样和LED显示都使用定时器进行定时,比如DMA一直采样,但不进行计算,比如每隔500ms进行一次计算,同 ...

会不会采集函数的算量已经在哪里了,你隔500mS  那ADC的实时性?另等500mS数据处理得完?
回复

使用道具 举报

ID:824490 发表于 2022-5-26 09:43 | 显示全部楼层
因为你的数码管是扫显,在等ADC完成的过程中,扫显停了所以就显得数码管暗了。你在ADC中插入扫显试试?
回复

使用道具 举报

ID:997026 发表于 2022-5-26 09:45 | 显示全部楼层
Materialism 发表于 2022-5-25 23:11
把ADC采样和LED显示都使用定时器进行定时,比如DMA一直采样,但不进行计算,比如每隔500ms进行一次计算,同 ...

我初步也是你这个思路,好像也只有这种思路了,但不知道是否有效,后面我会试一下,谢谢
回复

使用道具 举报

ID:401564 发表于 2022-5-26 22:21 | 显示全部楼层
不知道你用的是什么单片机
STM32的ADC如果是用DMA方式的话,是不会用到主函数的等待的,基本等于不消耗程序的效率
如果程序没有其它重要中断,ADC可以用中断的方式采样,中断函数只清除中断标志位和数据传送
主函数进行数据处理,基本也不会有太大的影响
如果是在主函数中用while来等待ADC完成,这肯定是要消耗很多时间的
一定要采用这种方式的话,数码管显示可以中定时器中断来显示
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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