示波器设计—波形快速刷新方案

发布者:Blissful5最新更新时间:2021-07-08 来源: eefocus关键字:示波器  波形 手机看文章 扫描二维码
随时随地手机看文章

第5章        示波器设计—波形快速刷新方案

本章节比较重要,推荐的波形刷新方式都经过了大量测试验证。

5.1    波形快速刷新方案

5.2    示波器背景的快速刷新

5.3    系统上电,主界面无闪烁感

5.4    测量窗口的刷新

5.5    开关对话框时,界面的刷新方式

5.6    五个数值显示窗口的快速刷新

5.7     总结

 

5.1  波形快速刷新方案选择

波形快速刷新有很多方案需要测试,由于我们的GUI是采用的emWin,所以下面的这些测试都是基于emWin实现的。


(1)选择8位色还是16位色。

(2)使能三缓冲还是窗口存储设备。

(3)选用ARGB格式的emWin库还是ABGR格式的库。

(4)将STM32F429超频后刷新是否有提升。

(5)使用存储设备函数GUI_MEMDEV_Draw绘制还是多缓冲函数GUI_MULTIBUF_Begin()和GUI_MULTIBUF_End()。

(6)使用函数GUI_DrawGraph还是GUI_DrawPolyLine绘制波形。

下面将这几个方案以此为大家做个说明。

 

5.1.1  选择8位色还是16位色

之前测试emWin刷颜色块,8位色可以跑到2亿多点每秒,而16位色是1亿多点每秒。实际测试发现8位色刷颜色块还行,刷波形却不行,比较卡,所以采用16位色。


也许有读者会问为什么不使用32位色?对于单片机来说,刷32位色比16位色要吃力。所以32位色也不考虑。

 

知识点拓展

新版emWin教程第34章:STemWin支持的颜色格式:http://forum.armfly.com/forum.php?mod=viewthread&tid=19834 。

 

5.1.2      使用三缓冲还是窗口存储设备

对于STM32F429而言,使能三缓冲是指的用户要在LCDConf_Lin_Template.c文件中配置多缓冲,并在应用程序中调用函数WM_MULTIBUF_Enable(1)来使能。


使用内存设备是调用函数WM_SetCreateFlags(WM_CF_MEMDEV)来实现。


如果emWin的配置支持多缓冲和窗口存储设备,务必优先选择使用多缓冲,实际使用STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效地降低窗口移动或者滑动时的撕裂感,并有效地提高流畅性,通过使能窗口使用内存设备是做不到的。所以我们示波器也是选择使用三缓冲。使能多缓冲方式如下:

/*


*********************************************************************************************************


*    函 数 名: MainTask


*    功能说明: GUI主函数


*    形    参: 无


*    返 回 值: 无


*********************************************************************************************************


*/


void MainTask(void)


{


    


     /* emWin初始化 */


     GUI_Init();


         


     /* 使能多缓冲 */


WM_MULTIBUF_Enable(1);


 


/* 省略 */


}


/*


*********************************************************************************************************


*    函 数 名: MainTask


*    功能说明: GUI主函数


*    形    参: 无


*    返 回 值: 无


*********************************************************************************************************


*/


void MainTask(void)


{


    


     /* emWin初始化 */


     GUI_Init();


         


     /* 使能多缓冲 */


WM_MULTIBUF_Enable(1);


 


/* 省略 */


}


5.1.3     使用ARGB格式emWin库还是ABGR格式库

由于前面我们已经选择了使用RGB565颜色格式,对于这个颜色格式,使用ARGB格式的emWin库并没有性能提升,而且实际做应用代码还要注意额外的事项。所以继续使用ABGR格式库。

 

知识点拓展

专题教程第1期:基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24位色:http://forum.armfly.com/forum.php?mod=viewthread&tid=44512 。

 

5.1.4     将STM32F429超频后刷新是否有提升

STM32F429操作自带的Flash无法实现0延迟,随着设置的主频越高,延迟参数就要设置的越大,

参数手册中给的测试结果如下:

实际测试,将其超频到216MHz并没有任何性能提升,为了稳定起见,依然使用的168MHz。至于为什么不使用F429支持的180MHz,其原因在这个帖子里面有描述:http://forum.armfly.com/forum.php?mod=viewthread&tid=16830 。

 

5.1.5     使用存储设备函数还是三缓冲函数做整体刷新

之前的一代示波器是采用下面的方式进行绘制的:

GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS);


在函数_Draw里面实现波形显示区和波形的绘制,但是速度比较慢,600*480显示区的刷新率差不多10帧左右,现在做二代示波器显然不能再使用这种方法了,速度太慢,而且实际测试发现F429使用这种方式比一代示波器中F407采用这种方式要慢一点,这样的结果显然不是我们想要的。现在的绘制方式是采用的多缓冲函数:


GUI_MULTIBUF_Begin(); 


/* 在这两个函数之间实现波形绘制 */


GUI_MULTIBUF_End();

使用这两个函数做整体刷新,可以有效的避免波形刷新时的闪烁和撕裂感。


5.1.6 使用哪个函数绘制波形

之前一代示波器中波形的绘制是采用的函数GUI_DrawPolyLine,二代示波器中也采用这个函数的话,发现速度慢了好多,而使用函数GUI_DrawGraph却不存在这个问题。而且重新优化底层,函数GUI_DrawPolyLine的性能并没有提升,估计是内部执行机制的问题。使用函数GUI_DrawPolyLine的好处就是可以实现各种波形效果,鉴于这个函数性能比较差,所以还是继续使用GUI_DrawGraph。


5.1.7 使用单图层还是双图层

由于STM32F429的硬件双图层性能有限,而且使用emWin管理比较麻烦,所以二代示波器就采用单图层来实现。


5.2  示波器背景的快速刷新

波形显示区背景是固定的,所以上电后就将其绘制到存储设备里面,以后显示背景就可以直接调用存储设备的API函数。下面是示波器背景的绘制:


/*


*********************************************************************************************************


*    函 数 名: CreateWindowAmplitude


*    功能说明: 创建幅值窗口


*    形    参: x0  左上角x坐标


*             y0  左上角y坐标


*             x1  右下角x坐标


*             y1  右下角y坐标


*    返 回 值: 无


*********************************************************************************************************


*/


void DSO_DrawBakFrame(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)


{


     uint16_t x;


     uint16_t y;


    


     /* 填充背景 */


     GUI_SetBkColor(GUI_BLACK);


     GUI_ClearRect(x0, y0, x1, y1); 


    


     GUI_SetColor(GUI_WHITE);


    


     /* 绘制水平刻度点 */


     for (y = 0; y < 9; y++)                                


     {


         for (x = 0; x < 61; x++)


         {


              GUI_DrawPoint(x0 + (x * 10), y0 + (y * 50));


         }


     }


    


     for (x = 0; x < 61; x++)


     {


         GUI_DrawPoint(x0 + (x * 10), y1);


     }


    


     /* 绘制垂直刻度点 */


     for (x = 0; x < 12; x++)                               


     {


         for (y = 0; y < 41; y++)


         {


              GUI_DrawPoint(x0 + (x * 50), y0 + (y * 10));


         }


     }


    


     for (y = 0; y < 41; y++)


     {


         GUI_DrawPixel(x1, y0 + (y * 10));


     }


    


     /* 绘制最后脚上的那个点 */


     GUI_DrawPixel(x1 - 1, y1 - 1);


    


     /* 绘制垂直中心刻度点 */


     for (y = 0; y < 41; y++)                               


     {   


         GUI_DrawPixel(x0 - 1 + (300), y0 + (y * 10));


         GUI_DrawPixel(x0 + 1 + (300), y0 + (y * 10));


     }


    


     GUI_DrawPixel(x0 - 1 + (300), y1);


     GUI_DrawPixel(x0 + 1 + (300), y1);


    


    


     /* 绘制水平中心刻度点 */


     for (x = 0; x < 61; x++)                                    


     {   


         GUI_DrawPixel(x0 + (x * 10), y0 - 1 + (200));


         GUI_DrawPixel(x0 + (x * 10), y0 + 1 + (200));


     }


      


     GUI_DrawPixel(x1, y0 - 1 + (200));


     GUI_DrawPixel(x1, y0 + 1 + (200));


}


通过下面的方式将示波器背景绘制到存储设备里面:


hMemDSO = GUI_MEMDEV_CreateFixed(0,


                                 0,


                                 600,


                                 400,


                                 GUI_MEMDEV_HASTRANS,


                                 GUI_MEMDEV_APILIST_16,


                                 GUICC_M565);


    


/* 绘制示波器窗口背景 */


GUI_MEMDEV_Select(hMemDSO);


DSO_DrawBakFrame(0,0,599,399);


GUI_MEMDEV_Select(0);


以后程序中绘制示波器背景,仅需调用如下函数就可以实现


GUI_MEMDEV_WriteAt(hMemDSO, 40, 40);

实际测试这个函数仅需9-10ms就可以完成。


5.3  系统上电,主界面无闪烁感

为了追求极致的用户体验,需要解决板子开机后存在的两个问题。


1、界面整体加载


有时候界面设计比较复杂,开机后不能保证所有的控件同时加载出来,这个时候有个非常简单的解决办法,绘制前隐藏桌面窗口,绘制完毕后显示桌面窗口。


WM_HideWin(WM_HBKWIN);



/* 初始化 DSO */


DSO_Init(1);


    


WM_ShowWin(WM_HBKWIN);


2、上电瞬间产生的高亮


这个问题不仔细注意的话,不容易看到。起初以为是软件配置问题,调试了下没有效果,后来又设置背光PWM的不同占空比,发现也不行。


后来干脆关闭PWM,而且也关闭emWin和LCD的图层,仅显示背景层,直接操作PWM引脚的高低电平。测试发现将其配置为低电平后,要延迟200ms左右再点亮LCD就没有问题了,延迟时间短了则会有个瞬间的高亮。知道了这个原因,程序中就好解决了,可以直接延迟200ms后再点亮,而这个二代示波器无需这么做,因为上电后需要将各种测量窗口的背景和波形显示区背景绘制到存储设备里面,正好用于替代者200ms延迟。


GUI_Init();


 

/* 先关闭背光 */


LCD_SetBackLight(0);


 

/* 在这里加载各种窗口背景 */


 

/* 显示出所有的窗口 */


GUI_Exec();



/* 再开启背光 */


LCD_SetBackLight(255);



/* 开启其它操作 */


通过这种方式就完美解决了瞬间高亮的问题。

5.4  测量窗口的刷新

测量功能是指的下面的水平测量和垂直测量:


测量功能的数据显示不要以窗口的形式呈现,因为将窗口显示在波形显示区上会造成波形刷新慢。当前的方案是在绘制完毕波形后,直接2D函数绘制测量窗口,这种方式的实际效果好很多。

 

5.5  开关对话框时,界面的刷新方式

二代示波器主界面上有如下五个按键,点击后会弹出一个对话框。

 

我们这里要讨论的是关闭这个对话框时存在的问题。关闭这个对话框时,为了保证主界面整体的刷新效果,需要清背景的同时,将示波器波形显示区背景也一起刷出来(文件DSO_Init.c):

GUI_SetBkColor(0x905040);


GUI_Clear();


GUI_MEMDEV_WriteAt(hMemDSO, 40, 40);

通过这种方式,关闭对话框绘制的效果就好很多。

 

5.6  五个数值显示窗口的快速刷新

五个数值显示窗口是指的下面这五个:

 

主要有幅值窗口,两个状态窗口,频率窗口和系统信息窗口。这几个窗口的创建都是以对话框的形式创建,方便管理。对话框回调函数的WM_PAINT消息里面通过大量的2D函数进行绘制,每次刷新数值还是比较影响系统性能的,为了降低影响,需要提前将其绘制到存储设备里面,跟本章节5.2小节的方法类似。我们这里以其中一个状态窗口为例进行说明,WM_PAINT消息里面要绘制如下这些图形和字符:

/*


*********************************************************************************************************


*    函 数 名: PaintDialogStatus1


*    功能说明: 状态窗口的回调函数重绘消息


*    形    参:pMsg  指针地址            


*    返 回 值: 无


*********************************************************************************************************


*/


void PaintDialogStatus1(WM_MESSAGE * pMsg)


{


     /* 清背景色 */


     GUI_SetBkColor(0x905040);


     GUI_Clear();


    


     /* 绘制填充的抗锯齿圆角矩形 */


     GUI_SetColor(GUI_BLACK);

[1] [2]
关键字:示波器  波形 引用地址:示波器设计—波形快速刷新方案

上一篇:示波器设计—主界面布局和框架
下一篇:示波器设计—双通道ADC驱动

推荐阅读最新更新时间:2024-11-06 19:52

示波器无源探头分类
示波器无源探头是使用最为广泛的示波器探头。同时,它还是最耐用和最经济的探头。无源探头中没有像晶体管或放大器这样的有源元器件,因此无需对探头上电。 无源探头分为以下不同类型:
[测试测量]
<font color='red'>示波器</font>无源探头分类
不可忽视的示波器指标:触发技术和ENOB
继力科推出WaveMaster8 Zi系列示波器后,泰克高调宣布推出业界速度最快的示波器及探头系统。双方都强调自己的产品是世界上最快的示波器,让我们甚感疑惑,不免对“最快”产生质疑,到底谁才是“最快”呢?   实际上,在销售产品时,我们都明白一个道理,即王婆卖瓜,自卖自夸,也许他们所用的衡量标准不同,角度不同,即使相同的功能产品,按销售方的推销角度来讲,说“最快”都有些道理。众所周知,通常情况下示波器的衡量指标主要为带宽、取样率和存储深度,销售和采购示波器的时候,多数都会考量这几个参数指标。此次泰克在发布DPO/DSA70000B系列示波器时,除以上几个高指标外,还将触发功能作为产品的宣传重点,此外将有效比特位(ENOB)
[测试测量]
示波器最小量程
使用示波器测试的时候,信号很小,只有几十MV。使用示波器最小档位测量,发现很多毛刺。期初,我以为是示波器的地接的太远,改了最近的地还是一样情况。然后我怀疑信号本身就有很多毛刺,可能需要滤波。可这个信号经过运放放大后的值非常稳定。 按理说如果输入信号有毛刺,输出应该也很多毛刺才对。 推测可能还是测量问题。请教了领导,示波器的最小量程20mV档已经接近极限,可能失真。也就是实际波形可能是稳定的,测量反应不出来。 原始信号 放大后
[测试测量]
<font color='red'>示波器</font>最小量程
EWB中双踪示波器的使用
在EWB中双踪示波器的使用如下 双踪示波器(Oscilloscope) 双踪示波器图标如图5.3.1所示,面板如图5.3.2所示。EWB的示波器外观及操作与实际的双踪示波器相似,可同时显示A、B两信号的幅度和频率变化,并可以分析周期信号大小、频率值以及比较两个信号的波形。 (1)示波器的连接    如图5.3.1所示:   ① A(B)通道输入:信号A(B)接入端。   ② 信号接地端:A、B两信号的公共端,如果不接,则默认该公共端接地。   ③ 外接触发端。 (2)示波器的调节。    如图5.3.2所示:   ① 时基控制(Time base),如图5.3.3所示。 ● X轴刻度(s/div):控制示波
[测试测量]
EWB中双踪<font color='red'>示波器</font>的使用
DAC产生直流电压或任意波形
大量设备都使用数/模转换器(DAC)来实现各种各样的功能。高精度、电压输出DAC的常见应用有仪器仪表、自动测试以及测试/测量设备。在这些应用中,DAC产生直流电压或任意波形。 对于这些电路,使用电压输出DAC进行设计的最具挑战的部分就是真实了解这种怪兽在其规定精度范围之内到底能够跑多快。如果某款设备的时钟频率为50MHz,那么就电压输出更新速度来说,这意味着什么?或者,除了知道时钟频率之外,还需要更多信息吗? 电压输出DAC采用FIFO方式,也就是先进先出(图1)。通常情况下,用户将DAC的输入数字数据(DIN)装载到DAC内部串行输入寄存器,而将之前的数据编码锁存到N位DAC。 图1. 高精度、电压输出DAC的通
[模拟电子]
是德科技示波器的使用与测量方法
是德科技示波器是一种把模拟电信号转化为波形显示信号图像的电子测量仪器。通过被测电路波形,我们可以观察波形的振幅、相位、频率,还可以对波形进行分析比较。虽然现在是德科技示波器的品牌、型号种类很多,功能也各式各样,但是是德科技示波器使用方法与操作过程却是基本类似的。下面为大家介绍通用是德科技示波器使用方法。 是德科技示波器是一种把模拟电信号转化为波形显示信号图像的电子测量仪器。通过被测电路波形,我们可以观察波形的振幅、相位、频率,还可以对波形进行分析比较。虽然现在是德科技示波器的品牌、型号种类很多,功能也各式各样,但是是德科技示波器使用方法与操作过程却是基本类似的。下面为大家介绍通用是德科技示波器使用方法。 一、面板介绍 1.
[测试测量]
示波器百问(五)
41. 使用优利德数字示波器UT2102CE抓一个并口的时序时,总能测到能量很强的50Hz交流,而测不到信号,但是示波器的地和所测并口的地是一致的,怎么办? 答:可以从以下几方面入手: ① 检查武汉示波器是否很好的接地或采用隔离变压器隔离; ② 附近是否有较强50Hz信号感应; ③ 在较强干扰环境下,应注意并口的驱动能力及工作频率与测试操作选择是否合适。若只看到50Hz干扰正弦波,且波形较规则,则应考虑并口可能未工作; ④ 检查一下探头尖是否损坏了; ⑤ 建议把用不着的外设都拨掉,也有可能从显示器上来的; ⑥ 如果示波器用了很久,就要考虑底线是否正常,就是那个小夹子。 把探头取下,用万用表量一量。 42.要解决抗电源干
[测试测量]
示波器在开关电源分析中的应用
电源是所有电子产品不可或缺的组成部分,电源分为 开关电源 、 线性电源 等类型,其中开关电源已经成为数字计算、网络通信系统中电源的主流架构。开关电源的好坏关系到产品的整体性能。因此,在研发和生产测试中对于电源的精确分析显得尤为重要。SIGLENT推出的SDS2000超级荧光 示波器 配备强大的电源分析模块,支持绝大部分电源性能指标的精确测试测量。下面将通过分析电源板输入模块,给大家详细介绍SDS2000的电源分析功能。 以电源演示版STBX为例,其物理视图如图1所示: 图1 STBX STBX电路原理图如图2所示:  图2 原理图 在进行操作之前,首先应检查示波器、电源演示板是否运行良好,在保证示波器、电源演示板及探头等所
[电源管理]
<font color='red'>示波器</font>在开关电源分析中的应用
小广播
最新测试测量文章
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved