数据分析

实时波形图

趋势、超调和尖峰一眼看清,不必盯着滚动的文字去读。

本页内容

实时波形图

实时波形图把设备打印的数值实时画成曲线。调电机 PID、标定传感器、检查 ADC 噪声时,趋势、超调和尖峰一眼就能看出来,不必盯着滚动的文字去读。原来给 VOFA+ 或 Arduino 串口绘图器输出数据的固件,一行都不用改。

每个连接有自己的波形图,位于该连接接收区的上方——曲线下面的文字还在,出现毛刺时可以对照原始输出。打开方式:

  • 工具 → 波形图 打开或关闭当前连接的波形图;
  • 接收区右键菜单里的波形图,对该连接起同样的作用;
  • 波形图工具栏最右侧的 ✕ 关闭波形图。

波形图直接读取收到的字节,与接收区显示文本还是十六进制无关,接收区暂停时也照常绘制。波形图只在打开期间工作:打开之前收到的数值不会补画,关闭时不做任何解析、不占资源。

主窗口中的 TCP 连接正在接收 speed:1427.5,target:1370.2 这样的数据行;接收区上方的波形图把 speed 和 target 两个通道画成蓝、红两条曲线,显示最近 600 个样本,右侧统计表列出每个通道的当前、均值、最小、最大、峰峰值和标准差,下方状态行显示 2 个通道、49 样本/秒以及 SPU 免费版剩余的绘图时间
波形图位于接收区上方。通道名取自每行数据里的标签,右侧的表格同时就是图例。

设备怎样输出数值

在波形图工具栏的第一个下拉框里选择设备发送数值的方式。

文本(CSV、FireWater、Arduino) 是默认格式,几乎所有能 printf 的固件都适用。每个样本输出一行,数值之间用逗号、空格、制表符或分号分隔,行尾是 \n、\r 或 \r\n:

设备输出 波形图的处理
1.5,-0.2,3 或 1.5 -0.2 3 三个通道,名为 CH1、CH2、CH3
temp:23.5,hum:45.2,pres:1013.2 三个通道,名为 temp、hum、pres(Arduino 串口绘图器的写法,冒号两侧有空格也可以)
pid:100.0,98.6,2.1 VOFA+ FireWater:开头唯一的标签是这一行的名字而不是通道名,所以是 CH1 到 CH3 三个通道
Motor started 或 12:30:45 boot ok 不是样本,作为普通日志跳过

所以 STM32 的速度环可以输出 printf("%.2f,%.2f,%.2f\r\n", target, speed, pwm);,Arduino 程序可以写 Serial.print("temp:"); Serial.print(t); Serial.print(",hum:"); Serial.println(h);。调试日志可以照常从同一个端口输出:凡是含有非数字内容的行都不进波形图。带标签时,每个标签第一次出现就成为一个通道;某一行可以缺少部分标签(曲线在那里断开);标签与裸数值混在一起的行(如 a:1,2,b:3)直接跳过,不去猜测。12:30 这样的时间不会被当成标签。

JustFloat(VOFA+) 适合直接发送二进制的固件:每个通道一个小端 32 位 float,每帧以 00 00 80 7F 四个字节结尾。单片机不用做格式化,几 kHz 的输出也不吃力:

float frame[3] = {angle, speed, current};
static const uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7F};
HAL_UART_Transmit(&huart1, (uint8_t *)frame, sizeof frame, 10);
HAL_UART_Transmit(&huart1, tail, sizeof tail, 10);

从数据流中途接入或丢了字节时,波形图会自己重新找到帧边界;连接打开后的第一帧用于对齐,不绘制。

正则表达式 适合无法修改的输出格式,例如 T=23.5C H=45%。在格式旁边出现的输入框里写正则表达式:

  • 每个捕获组是一个通道,命名组的名字就是通道名:T=(?<T>[-\d.]+).*H=(?<H>[-\d.]+) 得到 T 和 H 两个通道;
  • 没有捕获组时,行内每一处匹配都是一个通道:-?\d+\.?\d* 会画出这一行里的所有数字。

表达式无效时文字变红,悬停提示会说明错在哪里。

切换格式会清空波形图,因为旧样本与新的数据流对不上。每个波形图最多 32 个通道。

查看曲线

  • 横轴:样本序号按样本计数,固件按固定频率输出时最准确,不受线路传输时序影响,与 VOFA+ 和 Arduino 绘图器一致;时间显示从开始绘图算起的秒数,按数据到达的时间计。串口数据是一批一批到达的,同一批里的样本会均匀分布在这段间隔内。
  • 显示范围:旁边的下拉框可选 100 到 50,000 个样本,时间轴下为 1 到 300 秒,以及全部。在图上滚动鼠标滚轮也可以缩放这个范围。
  • 纵轴:自动 Y 打开时,纵轴范围跟随可见数据。在图上按住 Ctrl 滚动滚轮可以以指针为中心设定固定范围;关闭自动 Y 时保留当前屏幕上的范围。
  • 暂停冻结画面,样本仍在记录。拖动图形可以往回翻看历史,同时也会暂停。双击回到实时并恢复自动 Y。
  • 鼠标悬停在图上时,显示该位置每个通道的数值。
  • 清除清空所有样本。重新建立连接不会清空,设备复位重连后曲线接着画。
  • 弹出把波形图移到独立窗口(标题带连接名),可以拖到第二块屏幕上;关闭这个窗口,波形图回到接收区上方。

波形图下方的状态行显示通道数、每秒样本数、已缓存的样本数,以及「已跳过 N 行非数据」(JustFloat 为「已跳过 N 个错误帧」)。每个连接的波形图保留最近 100,000 个样本,更早的依次丢弃。可见范围里有几万个样本时画面依然流畅,只有一个样本的尖峰也不会被抽稀丢掉。

通道与统计

波形图右侧的表格既是图例也是统计表。每个通道显示当前、均值、最小、最大、峰峰值和标准差,统计范围是当前可见的样本。把曲线缩放或暂停在某一段上,这些数字就只描述这一段:传感器放在基准点时的均值、空闲 ADC 通道的噪声(看标准差)、电源纹波(看峰峰值)。

  • 取消勾选某个通道即隐藏其曲线,重新勾选即恢复。
  • 双击通道名可以重命名,例如把 CH2 改成 speed_rpm;把名字清空,就恢复数据流里的名字。

用游标测量

打开测量后,在图上单击放置游标 A,再单击放置游标 B;之后的单击移动离得较近的那个游标,右键清除两个游标。读数框显示两个游标的位置,以及每个可见通道在 A、B 处的数值和差值。在时间轴下还会显示两者的时间差 Δt 和 1/Δt(Hz),振荡的周期和频率、阶跃响应的上升时间都能直接从曲线上读出。

保存与分享

  • 导出 → 导出 CSV... 保存波形图缓存的全部样本:样本序号、到达时间(秒),以及每个通道一列、以通道名为列名。文件为带 BOM 的 UTF-8,Excel 打开时中文通道名不会乱码。
  • 导出 → 保存图片... 把屏幕上的波形图保存为 PNG,便于放进报告或发给同事。
  • 波形图的设置按连接随 .spu 工程保存:是否打开、格式与表达式、横轴、显示范围、纵轴范围、通道名和隐藏的通道。没有打开工程时,第一个连接的波形图设置保存在本机。样本本身不保存,要留下一次运行的数据请导出 CSV。

回放窗口也能绘制录制文件里的数据:每个端口的视图菜单和右键菜单里都有波形图,无论以什么速度回放,曲线都按录制时的时间间隔绘制。

Free 与 SPU Pro

波形图在 Free 里用于确认它能用在你的设备上:

  • 绘制前 2 个通道;其余通道照常解析并列在统计表中,标为 Pro;
  • 每次运行共 120 秒绘图时长,所有连接共用,重启 SPU 后重新计算;回放窗口里的绘图不计入。只有收到新样本的秒数才计入,所以在空闲端口上开着波形图不会消耗时长。状态行显示「SPU 免费版:本次运行还可绘图 N 秒」;用完后所有波形图停在最后一帧,仍可查看,直到 SPU 重启;
  • 保存图片免费;导出 CSV 和测量需要 SPU Pro。

SPU Pro 没有这些限制,激活后立即生效,无需重启。

这篇文档是否有帮助?