凡亿教育-思敏
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | STM32CubeMonitor实例2:实时波形检测
STM32CubeMonitor实例2:实时波形检测

我们通过第二个例程来理解direct和snapshot这两种不同的采样模式,并学习更多的节点的使用。


3331d1d075c88e6f2801e407751a5a.jpg


这个例程的MCU要完成的工作就是通过GPIO口输出一个PWM波,而我们将用CubeMonitor来实时监控这个PWM波,并且可以调节PWM波的频率和占空比。

在这一部分,我们将学习以下内容:

1.直接读写寄存器

2.对读出的变量值进行后处理

3.添加switch节点过滤输出到chart节点的变量

4.在dashboard中添加文字显示框

5.如何使用snapshot模式进行采样

6.如何保存波形


PWM波输出


7189cda85ba3990def1185c1f30ec7.jpg


可以通过CubeMX来初始化MCU输出PWM波,上图是例程中使用的配置,如果你使用的是其他的开发板则根据实际使用的定时器和GPIO口进行配置。


530a06a62ab8f4261827523676bc92.jpg


在CubeMX生成的初始化工程代码里面,还需要添加启动PWM波输出的代码,见上图。


变量节点配置


4d7779e2d5ad11eaceb2906a85f668.jpg


CubeMonitor部分,我们在第一个例程的基础上进行修改。首先先来修改myVariables变量节点的配置。

这次我们要监测的是PB14引脚输出的PWM波以及PWM波的周期和占空比寄存器配置。而当GPIO口输出PWM波的时候,从它的输入数据寄存器中,可以读到当前的高低电平值,所以这里要输入的监测变量是三个寄存器。

先删除之前添加的变量,再按照图中的步骤修改myVariables变量组,逐个添加要监控的变量地址:

添加变量PB14,地址为GPIOB_IDR寄存器的地址0x48000410

添加变量Period,地址为TIM15_ARR寄存器的地址0x4001402C

添加变量Duty,地址为TIM15_CCR1寄存器的地址0x40014034


f640ead0342aba183c6ea834f7d9b8.jpg


我们还要在程序运行的过程中实时修改PWM波的频率和占空比,也就是TIMER15的自动重载寄存器的值和捕获/比较寄存器的值。所以在myWriteVariables变量节点中,删除之前添加的变量,再修改myWriteVariables变量组,按照图中步骤添加这两个寄存器的地址。

添加变量Period,地址为TIM15_ARR寄存器的地址0x4001402C

添加变量Duty,地址为TIM15_CCR1寄存器的地址0x40014034


39c777e52026a97607acbd032c7e8a.jpg


因为PB14这个变量读出来的是PortB端口所有引脚的状态,而我们只想监测PB14这一个引脚的状态,就需要在PB14这个变量中将bit14的值提取出来。在processing节点中,利用post-processing功能,将变量PB14右移14位,其结果定义为一个新的变量PWM1,这个就是我们最终要监测的PWM波的输出。


变量输出配置


bac54711c72e0401ee97fc6f796175.jpg


现在Processing节点一共有4组变量输出,但我们只想在最终的点线图上输出PWM1一路变量的实时值。这时就可以利用switch节点来对processing节点的输出进行过滤了。如图在processing节点和chart节点之间添加一个switch节点。在switch节点中配置过滤条件:只有payload的variablename等于PWM1的消息才输出。


478eef49b0338c0938e331e6912932.jpg


对于processing节点输出中的Period和Duty这两个变量,我们希望在dashboard上显示它们当前的值,所以需要再添加两个”text”文字框节点。文字框节点的输入只需要变量的值,不需要时间戳值。Processing节点输出的消息结构不满足文字框节点的要求,所以我们还需要用”single value”子流程来进行处理,输出单个的数值到文字框节点。在“singlevalue”子流程的配置中指定要输出的变量名就可以了。“single value”子流程实际是由多个节点组成,在编辑窗口点击”编辑流程模板“就可以看到。在CubeMonitor里面,你也可以编辑自己的子流程来实现特定的功能。


5e1ff8a9cf8c6e2d63a0a3d0611835.jpg


调整dashboard的布局如图所示。


7d4f51b2def7782e26df85643ac192.jpg


重新部署运行。


a5f96603050e846485397d75e712b4.jpg


在Dashboard,点击START按键启动采样。这时就可以看到实时显示的PWM波和自动重载寄存器以及捕获/比较寄存器所配置的值。

在输入框中,可以实时修改自动重载寄存器以及捕获/比较寄存器的值来改变PWM波的周期和占空比。

snapshot


812c56951a9aade816e7f4062f6737.jpg


前面采样使用的是direct模式,这种模式下每次采样由PC触发,受PC上其他程序的影响,采样的时间间隔可能会不均匀,有延时。而snapshot模式,是通过运行在MCU的代码进行采样,可以通过定时器中断来保证采样的精确性。采样数据先保存在MCU的内存,再由 CubeMonitor 读出。但snapshot模式需要添加特定的代码到用户程序,这段特定的代码已经包含在CubeMonitor的安装包中。snapshot模式下的采样频率由调用采样函数的频率决定,但建议不要超过1KHz。


25856c5bcf1411cc1a26f9aceccd99.jpg


STM32CubeMonitor安装包中有一个snapshot_embedded_SW.zip文件,里面包含了使用snapshot模式时需要用到的MCU代码。

使用snapshot模式时,需要对用户工程做以下修改:

1.将该压缩文件中的C文件和头文件拷贝到用户工程路径下,并将其中的acqTrigger.c和dataAcq.c文件添加到用户工程。

2.在代码中调用DumpTrace函数进行采样,可用timer中断设置需要的采样频率。

3.根据实际设置的采样频率,修改dataAcq.c中的SNP_TRC_TIMESTAMP_BASE_UNIT,SNP_TRC_TIMESTAMP_VALUE和SNP_TRC_BUFFER_SIZE等参数。代码默认每次最多可以采集10个32位的变量。如果需要采集更多的变量,可以调整SNP_TRC_NB_MAX_WORD_VAR的值。

snapshot代码大约需要使用3KB的Flash, 使用SRAM的大小跟采样频率和采样的变量个数有关。


735bc75afecdbe4540d29a14d73efd.jpg


在该例程中,我们使用TIM16产生定时中断,来调用采样函数Dumptrace。TIM16的初始化代码可以通过CubeMX生成。具体配置见上图。


811a0bd06a3b437d5f3ac00c521653.jpg


然后手动添加启动TIM16的代码,TIM16中断的回调函数以及在主循环中调用采样函数的代码。


5597ac7d6ef31d612776f7bde0fc85.jpg


在CubeMonitor上需要做的配置如下:

1.因为snapshot模式下,CubeMonitor需要知道g_traceHeader变量的起始地址,所以需要在variables节点中导入添加了snapshot代码后的可执行文件。这样当选择了snapshot模式后,CubeMonitor就会自动从其中提取出该变量的起始地址。

2.在variables变量节点的配置中,选择snapshot变量采集模式。


5a56aa9686f5249344131416acda0f.jpg


我们还可以利用processing节点中的log功能,将采集的波形数据保存到本地文件。而后在Dashboard中可以随时导入log文件,在图表中显示波形。

这里还有一个小小的诀窍可以在snapshot模式下提高采样频率。在snapshot模式下关闭实时图形显示功能(断开processing节点与chart节点的连接),只开启log功能记录采集的数据。数据采集结束后再在dashboard的chart中导入log文件进行显示。实验下来,采用这种方式使用ST-LINK v2可以到2KHz的采样速度,使用ST-LINK v3可以到4KHz的采样速度。但需要注意的是,当使用超过1KHz的采样速度时,CubeMonitor的点线图中显示的每次采样的时间间隔还是由SNP_TRC_TIMESTAMP_BASE_UNIT 和SNP_TRC_TIMESTAMP_VALUE这两个宏定义决定,最小的时间间隔是1ms,所以这时波形图上显示的时间值是不对的。两个采样点之间的实际时间间隔应根据设定的采样频率计算。


a4cc020fb6434b9b82f13c0bdd3198.jpg


分别在direct模式和snapshot模式下对同样的PWM波进行采样,从采样结果可以看到,direct模式下每次采样由电脑触发,但受PC端运行的其他程序的影响,每次采样的时间间隔不确定,会有延时。snapshot模式下由运行在MCU上的代码进行采样,可以做到很精确。所以如果对采样的精度有要求,建议使用snapshot模式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论