沈阳航空航天大学电子信息工程学院 张维通 王润洁 康迂勇 石剑民
数字示波器是数据采集、显示与微处理器相结合的产物。因其串行处理体系结构而具备优异的捕获和显示能力,已经基本取代传统模拟示波器成为通用测试领域使用最为广泛的仪器。数字示波器对信号的采集、处理和显示有较高要求,故目前通用的数字示波器多采用DSP、内嵌微处理器型FPGA或DSP+FPGA结构。虽然这样做可以得到性能优异的数字示波器,但缺点是价格相对较高。为了更加经济地满足测量信号带宽不高,仪器数量需求较大的场合,这里给出了一种极低成本的解决方案。本方案采用恩智浦的K60嵌入式芯片为核心处理器来完成低成本示波器的设计。K60具有两个高速ADC模块和一个可编程精准延时模块,结合PIT可以精准控制触发双通道并行采集,使得整体采样率翻倍,满足本设计要求。K60芯片基于ARM Cortex-M4内核,其专门的DSP指令集配合其硬件浮点运算单元可以满足本设计的数字处理要求。EMWIN作为一款优异的嵌入式GUI可以方便地加入到K60中运行,足以胜任数字示波器的复杂显示工作。K60具有CAN总线和ENET等系统通信和网络支持模块,可以为以后数字示波器的联网操作和功能升级维护提供硬件支持。基于K60优异的性能,本设计极大地简化了硬件电路,容易制作,成品体积较小,人机交互体验良好。既满足了本设计要求,提高了系统的整体性能和可靠性,又大大降低了成本,拓展了数字示波器的功能。
本次硬件设计部分主要有前置信号放大器、无源滤波电路、K60芯片外围电路、外置SRAM电路、按键、LCD显示电路。总体方框图如图1所示,旨在保障K60芯片能够稳定高效地进行数据采集、储存、处理和显示,充分发挥其性能。
图1 系统总体框图
前置信号放大器的作用是对要采样的信号进行放大调理,使输出信号电压在AD转换器输入电压要求范围内。滤波电路保证有效的信号频率能通过而无效的信号频率得到抑制。无源滤波器结构简单、成本低廉、运行可靠性较高,将其配合运算放大器和K60本身的ADC可编程增益放大器可以得到较好的采样信号。
由于K60本身的运行内存有限,而图形库的加载将占用很大一部分的内存,这就造成了不能存储足够的采样数据。为了解决这个问题,特在芯片外围安置一块SDRAM。设计采用一块内存为262Kbyte的高速静态RAM IS61LV12816作为图形库的运行内存,把K60本身128Kbyte的运行内存作为采样数据和其它系统变量的内存。
系统硬件工作时,采样信号经过放大滤波后被K60的ADC模块采集,然后经过运算处理,借助外部SDRAM将结果通过LCD显示出来。在进行人机互动时,使用者通过按键作用于K60,处理结果同样借助外部SDRAM在LCD显示出来。
在进行嵌入式系统软件设计中充分利用相应芯片已经开发成熟的固件库无疑将极大地减少编程工作量、便于维护,得到较高的系统稳定性。
本次软件部分就是利用拉普兰德OSKinetis K60固件库V3丰富的底层模块配置函数进行编写的。此固件库基于飞思卡尔的K60固件库,包括大部分常用的固件,并配有丰富的示范例程和相关注释,足以满足数字示波器软件系统的设计要求。主要用到库文件如下:HW_MCG、LPLD_SDRAM、HW_PDB、HW_ADC、HW_DMA、HW_PIT、HW_GPIO、HW_NVIC、arm_math(DSP库)。
HW_MCG:K60各个时钟的配置模块。此处配置系统时钟SystemCoreClock为96Mhz,总线时钟bus_clock为48Mhz。
LPLD_SDRAM:利用里面的LPLD_SDRAM_Init()函数将外置的容量为262K bit的SDRAM(IS61LV12816)初始化,方便将其进一步配置成EMWIN的运行内存。
HW_PDB:可编程延时模块,此处用于ADC硬件触发配置。在PIT2中断中设置该模块先触发ADC0采集,配置PDB底层函数使精确延时1us后触发ADC1采集,整体上相当于每1us便完成一次采样,实现了双通道快速并行采样。PIT2中断周期为2us,低于此处ADC转换时间,故每个ADC单次有2us来转换,时间充足,同时也可以看出本设计中的ADC采样率实际为PDB和PIT2综合作用的结果。这样配置的好处是不仅使得整体ADC采样率达到1Msps超过了单个ADC的最高采样率818.330Ksps,还减少了ADC因软件触发给CPU带来的负担。
HW_ADC:ADC配置模块。此处配置2个ADC模块的输入时钟总线时钟(48Mhz)、单端12位精度、长时间采样、硬件触发、DMA使能等。通过手册公式conversionTime=SFCAdder+Ave rageNum*(BCT+LSTAdder+HSCAdder)计算得到ADC转换时间约为0.73us,由技术手册中K60的电气特性知其最快转换时间约为1.2us,此处实际上只要低于2us就保证了PIT2开启PDB触发新的采样时上次已转化完毕。
HW_DMA:增强型直接存储访问模块。主要利用此模块将ADC采样转换后的数据转移到RAM中保存。每转移5Kbyte数据产生一次DMA中断,当传输的总数据量达到40Kbyte时,在DMA中断里进行数据处理,比如:FFT、最大值、最小值、峰峰值、频率等计算,同时关闭PIT2中断,即停止PDB触发ADC继续采样。利用DMA转移数据配合PDB触发,在很大程度上减少了CPU的负担。
HW_PIT:周期中断定时器模块。此处PIT有3个作用:一是用PIT0每1ms产生一次中断用来给EMWIN计数,否则EMWIN无法运行;二是用PIT1定时中断来开启PIT2中断使PDB触发ADC以刷新采样数据,根据DMA每转移40Kbtye就进行数据处理来计算,设置每50ms重新开启一次PDB,也就是每秒刷新20次;三是用PIT2每2us开启一次PDB,使其控制触发ADC0和ADC1单次采样。
HW_GPIO:主要用来配置按键以及其他必要的IO口,以实现人机交互。
HW_NVIC:中断优先级配置模块。首先在系统初始化时,应将优先级分组为16个抢断优先级,无响应优先级。然后根据系统各个功能的重要程度,设置优先级。由于EMWIN的运行不能停止,故PIT0中断的优先级最高;紧接着最重要的是数据处理,故DMA中断的优先级第2;然后是PIT2的采样中断第3;其次采样数据刷新和按键谁先后都行,故PIT1中断和GPIO中断分别第4、第5;最后由于EMWIN运行时非常占用系统资源,故不设优先级,将其放在空闲时间运行,任何中断都可以打断它。
arm_math(DSP库):CMSIS为用户提供的DSP(数字信号处理)库。为了高效地进行数字信号处理,CMSIS DSP库提供了超过60多种功能的DSP算法库,并且把这些库函数设计成使用ARM汇编指令来快速地处理多种复杂的DSP函数。由于K60的内核为ARM Cortex-M4,故可将CMSIS DSP库添加到拉普兰德的固件库里,同时开启K60的硬件浮点运算单元,使得数字信号处理的速度提高5到10倍。
EMWIN是一款能解决在ROM和RAM消耗相对来说并不高的情况下进行的人机交互应用设计难题的嵌入式GUI。它与裸机和多任务环境、专用操作系统或具任何商业RTOS兼容。
图2 EMWIN软件应用架构框图
本次使用的恩智浦官方EMWIN5.38版本相比以前版本进行了很大的更新,不但性能大大改善,而且实现了很多原来不能实现的功能。它的软件应用架构如图2所示。硬件操作层指的就是K60固件库,EMWIN通过液晶驱动与硬件操作层连接,用户只需配置自己的LCD显示器的驱动部分到EMWIN预留的接口里,即可在自己的硬件上运行EMWIN的GUI应用API函数,实现设计效果。
拉普兰德库里自带了分辨率为320*240的ILI9320 LCD驱动,故在加入EMWIN库及配套文件到工程中后只需按如下步骤配置即可:
①在GUIConf.c中配置EMWIN的运行内存为外部SDRAM
GUI_NUMBYTES (1024*256) //256Kbyte运行内存
#def i ne SDRAM_ADDRESS (0x70000000)//K60的SDRAM总线基地址
#def i ne SDRAM_APP_BUF SDRAM_ADDRESS
aMemory = (U32 *)SDRAM_APP_BUF;
/* Assign memory to emWin */
GUI_ALLOC_AssignMemory(aMemory,GUI_NUMBYTES);
②在GUIConf.h中设置图层数为1
#def i ne GUI_NUM_LAYERS 1
③在LCDConf.c中配置自己的LCD参数到EMWIN中
// LCD分辨率
#def i ne XSIZE_PHYS 320
#def i ne YSIZE_PHYS 240
// 颜色格式
#def i ne COLOR_CONVERSION GUICC_M565
// 设置LCD驱动类型为自定义驱动
#def i ne DISPLAY_DRIVER GUIDRV_TEMPLATE
//设置LCD驱动类型和颜色格式到EMWIN中
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER,COLOR_CONVER
SION,0,0);
在LCD_X_DisplayDriver()中的case LCD_X_INITCONTROLLER下添加自己
的LCD初始化函数LPLD_LCD_Init()。
④在GUIDRV_Template.c中将自己的LCD驱动函数对应放入到
EMWIN的LCD驱动函数中,使EMWIN能够使用它们来操作LCD。
//向指定位置的像素写入指定颜色
LPLD_LCD_SetPoint()放入_SetPixelIndex()
//读出指定位置的像素颜色
LPLD_LCD_GetPoint()放入_GetPixelIndex()
//绘制一条指定位置和颜色的垂直直线
LPLD_LCD_DrawVLine()放入_DrawVLine()
//绘制一条指定位置和颜色的水平直线
LPLD_LCD_DrawHLine()放入_DrawHLine()
//填充形成指定位置、大小和颜色的矩形
LPLD_LCD_DrawRectangle()放入_FillRect()
⑤在GUI_X.c中设置全局变量EMWIN_RunTime为emWin提供
时钟
extern__IO int32_t EMWIN_RunTime;
其中EMWIN_RunTime在PIT0中断中每1ms增加一次。
在拉普兰德的按键示例工程中按照上述步骤添加并完成EMWIN的配置,再按照上面固件库部分的描述初始化相关的硬件配置。系统的软件运行流程图如图3所示。为进一步增加数字示波器的功能和良好的人机交互,一是可利用GUIBuilder5.32在PC端对界面进行快速高效地仿真设计,使之充分清楚地显示数据处理的结果,呈现更人性化的界面;二是充分利用按键中断,不仅可以在其中设置EMWIN的键盘API函数,以实现通过按键控制虚拟按钮的选中、转移等操作,还可以设置采样率、触发方式、ADC的采集和停止等,以配合界面更好地实现人机交互。三是在EMWIN的配置中加入LCD触摸驱动源文件,调用拉普兰德K60固件库里的嵌入式操作系统UCOS_II来管理,再加入联网功能,以实现更优的实时性处理和人机交互体验。
图3 系统软件运行流程图
本次设计的数字示波器采用的是实时采样方式,通过K60的PIT和PDB实现ADC双通道交替并行采集,使得采样率加倍,最高采样速率为1Msps,故带宽为200Khz;为提高波形捕获质量,其连续采样数据最高达到40Kbyte才进行数据处理,有利于增加异常事件的捕获概率,此时每秒钟可以刷新20次采样数据;若设置单端采集,采样信号电压范围为0-3.3V。整体上本系统具有良好的人机交互界面,功能丰富、操作方便、成本较低且容易制作,可满足一般的波形检测要求。
本次设计的数字示波器基于EMWIN和ARM Cortex-M4内核,既充分发挥了EMWIN作为当前主流嵌入式GUI在界面设计方面所独有的优异性能,使得数字示波器的界面更具人机交互体验,又很好地利用了ARM Cortex-M4的DSP(数字信号处理)库,配合K60的FPU(硬件浮点运算单元),让数字示波器在处理大量数据时更加迅速。K60丰富的资源也为后续数字示波器的联网通信等功能拓展提供强力的支持。但由于时间、能力等原因,本设计仍然存在不足之处,例如本次设计未用到操作系统,各个模块的实时性有待提高、未充分利用K60丰富的硬件资源、ADC转换速度相对还较慢等。
[1]徐宝国,宋爱国.基于UCOS和UCGUI的嵌入式数字示波器[J].测控技术,2007,26(7):7-8.
[2]程言奎.基于ARM9的数字存储示波器数据处理和GUI的设计与实现[D].无锡:江南大学,2008.
[3]杨东选,王嵩.ARM Cortex-M4自学笔记——基于Kinetis K60[M].北京:北京航空航天大学出版社,2013:89-168.
[4]Joseph Yiu.The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors(Third Edition)[M].吴常玉,曹梦娟,王丽红,译.北京:清华大学出版社,2015:157-177.
[5]李苏扬.数字示波器设计[J].设计研究,2010(36):127-129.
[6]emWin用户手册[M].Germany:SEGGER Microcontroller GmbH & Co.KG,2017.