搜索
bottom↓
回复: 19

求大神指导,单片机程序的实时性编程如何实现?

[复制链接]

出0入45汤圆

发表于 2021-12-28 17:15:37 | 显示全部楼层 |阅读模式
如题,最近做一个小工具,实现的功能是,MCU实时采集电位器的电压,然后将电压转换,显示到OLED屏幕上。
发现在主循环中,执行OLED显示程序非常耗时间,执行完一次最长可以达到50ms,这样一次循环,影响了ADC采样实时性,电位器转过一个位置,ADC没有连续采集到;

有什么办法,可以实现ADC采样实时性,也能保证显示效果不受影响;就是要adc采集与OLED屏显示能同时进行;

请教下这种代码应该怎么编写才合适。我以前没有做写过程序,当前这个程序也是自己摸索写出来的,功能正常,只是影响显示效果;


//主循环代码示意如下:
while(1)
{
        //主控制器是MSP430G2553,内部时钟频率12MHz;
        //2个定时器,8ch 10bit ADC;


        get_adc();                //采集一次ADC的值,us级别转换完;
        disp_adc_value();        //将采集到的ADC的值转化为需要显示的位的值,us级别转换完;

       
        OLED_line_01();        //将ADC采集并转化后的值给到0.96寸OLED屏幕需要显示的位置上;ms级别转换完;
        OLED_line_02();               //0.96寸OLED屏IO口模拟IIC,       
        OLED_line_03();
        OLED_line_04();
        OLED_line_05();
}



阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入442汤圆

发表于 2021-12-28 17:39:48 来自手机 | 显示全部楼层
adc用中断控制

出0入45汤圆

 楼主| 发表于 2021-12-28 18:05:21 | 显示全部楼层

会不会连续进中断程序处理ADC,而影响OLED显示了; 感觉做不到并行处理;

出0入0汤圆

发表于 2021-12-28 18:17:50 | 显示全部楼层
提高IIC的工作频率,或者只更新需要更新的地方,减少刷屏时间。另外,既然ad采集后是oled显示的,更新的太快了人反而看不清了。

出0入362汤圆

发表于 2021-12-28 18:19:24 | 显示全部楼层
oled不要直接写, 改成写ram缓冲区, 然后集中再从ram写到oled, 每次只写一行或一列, 试试.

出30入42汤圆

发表于 2021-12-28 18:23:17 | 显示全部楼层
这种资源受限的芯片,改成硬件IIC最合适。如果非得用软件模拟IIC,那就不能采用死延时的方式。

出0入45汤圆

 楼主| 发表于 2021-12-28 18:38:56 | 显示全部楼层
vuo50z 发表于 2021-12-28 18:17
提高IIC的工作频率,或者只更新需要更新的地方,减少刷屏时间。另外,既然ad采集后是oled显示的,更新的太 ...

当电位器快速扭动变化后,部分电压点adc就没采集到,给到OLED显示就会出现有一些空挡(现在的程序等效于50ms才采集一次);
提高IIC的工作频率,或者只更新需要更新的地方,减少刷屏时间。------------好的,这个我看下能否改的看看;

出0入45汤圆

 楼主| 发表于 2021-12-28 18:40:25 | 显示全部楼层
tomzbj 发表于 2021-12-28 18:19
oled不要直接写, 改成写ram缓冲区, 然后集中再从ram写到oled, 每次只写一行或一列, 试试. ...

这个对我这个新手有点难度,现在是直接用的厂家的例程改的,我要研究的看看;

出0入45汤圆

 楼主| 发表于 2021-12-28 18:42:08 | 显示全部楼层
PPS 发表于 2021-12-28 18:23
这种资源受限的芯片,改成硬件IIC最合适。如果非得用软件模拟IIC,那就不能采用死延时的方式。 ...

还没研究清楚怎么用硬件IIC,例程用的IO口软件模拟的,没有用延时的方式呢。那要再研究下硬件IIC,看看是否能改善;

出30入42汤圆

发表于 2021-12-28 18:52:12 | 显示全部楼层
zqbing 发表于 2021-12-28 18:42
还没研究清楚怎么用硬件IIC,例程用的IO口软件模拟的,没有用延时的方式呢。那要再研究下硬件IIC,看看是 ...

软件模拟没有用延时?那你50ms花在了哪里?

出0入0汤圆

发表于 2021-12-29 09:37:11 | 显示全部楼层
显示数据的时候,能不能只更新变化的部分,而不是整个界面重新刷一遍

出0入17汤圆

发表于 2021-12-29 09:41:08 | 显示全部楼层
如果你的屏刷新速率不够,又要实时显示,我觉得无解

出0入0汤圆

发表于 2021-12-29 10:47:36 | 显示全部楼层
zqbing 发表于 2021-12-28 18:38
当电位器快速扭动变化后,部分电压点adc就没采集到,给到OLED显示就会出现有一些空挡(现在的程序等效于5 ...

"出现有一些空挡"是什么意思?你是图像显示?如果是数字显示的话不更新就是上次采集的。

出0入45汤圆

 楼主| 发表于 2021-12-29 13:41:33 | 显示全部楼层
PPS 发表于 2021-12-28 18:52
软件模拟没有用延时?那你50ms花在了哪里?

IIC是用的OLED屏提供的demo代码,除了清屏有延时其他地方没看到有特意延时的。在while循环里执行多条OLED显示语句,再加上本身ADC采集转换,就差不多耗费了50ms了。不知道是不是还有哪里不对的;

出0入45汤圆

 楼主| 发表于 2021-12-29 13:45:24 | 显示全部楼层
vuo50z 发表于 2021-12-29 10:47
"出现有一些空挡"是什么意思?你是图像显示?如果是数字显示的话不更新就是上次采集的。 ...

不是没有图像显示,电位器我快速扭动时,对应给到MCU AD口的电压从0V-3.3V-0V这样反复变化,如果采集的快,理论上是每个点都可以连续采集到。那现在adc采集,相当于隔50ms时间才采集一次的,当电位器变化很快时,就漏了一些电压点没有采集到。然后给到显示时就相当于跳了一些点没有;

出0入45汤圆

 楼主| 发表于 2021-12-29 13:48:47 | 显示全部楼层
MYQQ2021 发表于 2021-12-29 09:41
如果你的屏刷新速率不够,又要实时显示,我觉得无解

就是当电位器快速变化,我adc都要能连续采集到,屏幕显示刷新可以慢一拍没太大关系;

出0入84汤圆

发表于 2021-12-29 20:33:01 | 显示全部楼层
AD定时中断采集,不影响显示,定时中断可以自己调节合适的采集周期

出0入16汤圆

发表于 2021-12-29 20:45:53 | 显示全部楼层
两个芯片,1个管采集,1个管显示。

出145入215汤圆

发表于 2021-12-29 23:29:23 来自手机 | 显示全部楼层
看看万用表,一秒刷新3次就算快了,你就没感觉到跳动大。实际就是做了显示算法优化,把缓冲的数据经过处理后再显示,得到一个平滑的显示过度,但是又不失真实性。

出0入0汤圆

发表于 2021-12-30 08:42:22 | 显示全部楼层
做一个循环,专门用来ADC检测,有结果就存起来;做另外一个循环,定时去将结果值拿去刷新
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 08:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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