本项目参加 DigiKey 与 EEPW 联合举办的 2026 年第 3 期活动,主题是“基于边缘 AI 的电机状态检测”。测试的目标不追求复杂模型,而是验证一条完整链路:用三轴加速度传感器采集电机振动数据,在 NanoEdge AI Studio 中完成训练和模型选择,最后把生成的静态库部署到 NUCLEO-C562RE,让单片机直接输出电机当前状态。
需要识别的状态共有四类:停止 STOP、低速 SLOW、中速 MEDIUM、高速 FAST。整个流程分为五步:Project Settings、Signals、Benchmark、Validation 和 Deployment。
一、选定开发板与传感器
NanoEdge AI Studio 5.2.0 的 Project Settings 用来确定目标硬件和传感器类型。
本项目选择的目标板是 NUCLEO-C562RE,MCU 为 STM32C562RET6,Cortex-M33 内核,板载资源为 128 KB RAM 和 512 KB Flash。NanoEdge 会根据目标板自动带出模型体积和 RAM 的上限。
传感器选择 Time Series 下的 Accelerometer,三轴模式,对应实际使用的 LIS3DHTR 三轴加速度传感器。传感器通过 I2C1 与主控连接,SCL 接 PB6,SDA 接 PB7,通信速率为 400 kHz。初始化时会读取 WHO_AM_I 寄存器,确认返回值为 0x33 后,再配置为 1.344 kHz 高分辨率、三轴使能、BDU 和 ±2 g 量程。

二、按四种状态分别采集数据
Signals 页面将电机状态转换为可训练的数据窗口。NanoEdge 提供文件导入、串口实时采集和创建数据采集器三种方式,本例使用串口实时采集。
采集参数设置为:
串口:COM3 波特率:921600 数据格式:8N1 Buffer size:3 × 256 Number of axes:3 Values separator:space 每类行数:200
每个窗口包含 256 个采样点和 3 个轴,共 768 个数值。每行数据按照采样顺序交错排列:
x1 y1 z1 x2 y2 z2 ... x256 y256 z256
数据采集过程中不能混入启动信息、时间戳或状态文字,否则 NanoEdge 会把文字误当成信号数据。为此,固件在训练模式下只输出 768 列数值,每一行对应一个完整窗口。
四个状态通过开发板 B1 手动切换,状态顺序为:
SLOW → MEDIUM → FAST → STOP → SLOW
每次采集只保持一个状态,录满 200 行后停止并保存;然后按 B1 切换状态,再采集下一组数据。最终得到四个独立文件,每个文件都是 200 行 × 768 列。
数据检查结果显示,四类样本数量平衡,没有 NaN、Inf、全零行或常量行。各状态 X 轴振动标准差中位数约为:
SLOW: 1786 MEDIUM: 1190 FAST: 1062 STOP: 66
从数据可以看出,电机转动和停止之间的差异非常明显,三种转速的振动强度也随着速度提高而发生变化。Signals 页面可以同时查看四个类别的时域波形和 FFT 频谱,方便检查各状态是否具有可区分性。

三、一键搜索最优模型
进入 Benchmark 后,NanoEdge 会自动搜索整条机器学习流水线,包括是否去趋势、是否归一化、是否使用 STFT、是否提取特征、是否进行 PCA,以及使用 SVM、CNN、LSTM、随机森林等模型。
本项目的初次 Benchmark 最终选中 Library 45,模型类型为 SVM,指标如下:
Quality Index: 99.0 pts Balanced Accuracy: 100.00% RAM: 0.9 KB Flash: 2.6 KB Execution Time: 0.1 ms
从资源占用来看,这个模型非常适合 STM32C562RE。整个模型只占用不到 1 KB RAM 和约 2.6 KB Flash,单次推理时间约 0.1 ms。
不过,Benchmark 中的 100% 准确率只代表模型能够区分当前训练数据,并不能直接证明实机运行一定会稳定。边缘 AI 项目还需要检查采样窗口与电机换相之间的时序关系。

四、Validation 与模型验证
Validation 页面会把候选模型排成一张成绩单,列出 Library ID、Quality Index、Balanced Accuracy、RAM、Flash、Execution Time 和模型类型。本项目初次尝试的三个候选模型都取得了 100% Balanced Accuracy 和 99.0 分的 Quality Index,因此最终需要根据 RAM、Flash 和推理时间选择。
在 NanoEdge Emulator 中,可以直接加载生成的 libneai.dll 或 libneai.so,对采集文件进行离线回放,查看预测类别、概率分布和四类占比。训练数据回放时,四个类别可以被正确识别。
但实机测试时出现了一个值得记录的问题:模型在训练数据上表现很好,实际运行时却出现大量 STOP 误判,有时在不改变电机状态的情况下出现 SLOW 和 STOP 来回跳变。
进一步检查后发现,传感器和串口并没有故障。实时 SLOW 数据的 X 轴标准差约为 1800,与训练 SLOW 数据的约 1779 基本一致。问题来自采样窗口的起始相位:采样周期为 1 ms,而三种电机换相周期分别为 8 ms、4 ms 和 1 ms,256 点的窗口正好是这些周期的整数倍。初次模型直接使用原始波形、Pooling 和 Z-score,没有使用频谱特征,因此把固定相位下的波形当成了状态特征。
这也说明,Benchmark 的高准确率不能替代实机验证。对于周期性振动信号,训练数据必须覆盖不同窗口相位。
五、模型部署与工程集成
在 Deployment 页面选择 GNU Arm Embedded GCC 工具链,并保持与工程一致的编译选项:
Float ABI: hard fshort-wchar: OFF fshort-enums: ON
工程实际使用的编译参数包括:
-mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -fshort-enums
NanoEdge 生成的 NanoEdgeAI.h 和 libneai.a 放入工程的 nanoedge 目录,并在 CMake 中加入头文件路径、编译选项和静态库:
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
${CMAKE_SOURCE_DIR}/nanoedge
)
target_compile_options(${CMAKE_PROJECT_NAME} PUBLIC
-fshort-enums
)
target_link_libraries(${CMAKE_PROJECT_NAME}
${CMAKE_SOURCE_DIR}/nanoedge/libneai.a
)应用代码每采集满 256 个三轴采样点,就把 768 个 int16_t 原始值转换为 float,并调用分类函数:
for (i = 0U; i < NANOEDGE_VALUES_PER_SIGNAL; i++)
{
nanoedge_input[i] = (float)sensor_window[i];
}
state = neai_classification(
nanoedge_input,
nanoedge_probabilities,
&class_id
);
class_name = neai_get_class_name(class_id);输入顺序必须保持为:
x0 y0 z0 x1 y1 z1 ... x255 y255 z255
分类成功后通过串口输出:
[AI] state=slow [AI] state=medium [AI] state=fast [AI] state=stop
串口参数为 COM3、921600、8N1。系统上电后默认进入 SLOW,约每 256 ms 输出一次分类结果,按 B1 后可以手动切换电机状态。


整个工程代码如下
Edge AI motor status recognition.zip
【let'sdo|2026年第3期】基于边缘AI的电机状态检测_哔哩哔哩_bilibili
七、小结
这次 NanoEdge AI Studio 实践完成了从三轴加速度采集、四分类数据录制、Benchmark、模型部署到 STM32 串口输出的完整流程。
本次评测最大的感受是,NanoEdge 确实降低了机器学习在嵌入式设备上的落地门槛。用户不需要手写模型结构,只需要准备好带标签的数据,便可以让软件自动完成特征提取、模型搜索和压缩。
但实机调试也让我认识到,边缘 AI 项目的关键不只是 Benchmark 中的准确率。窗口划分、采样时序、训练数据覆盖范围和验证数据质量都会影响最终效果。只有把数据采集、模型训练和实机验证连接起来,才能真正完成一个可靠的电机状态识别系统。
感谢 DigiKey 与 EEPW 对本次活动的支持。
我要赚赏金
