Nanoedge AI studio参数配置与模型训练
接续过程贴的硬件连接、步进电机、按键、OLED、 加速度计与振动数据采集等内容。
本贴介绍 NanoEdge AI 模型集成、串口输出、 工程编译与问题排查。
1. NanoEdge AI Studio的使用流程
1.1 NanoEgde AI Studio的下载安装
直接在st公司官网下载即可,www.st.com,在官网进行登录注册,安装之后st会通过账户邮箱发送一段KEY作为激活码,第一次进入软件需要进行激活。
1.2 工程创建
进入NanoEdge之后点击右上角的new project进行工程创建,然后选择项目类型
AD:detect anomalies异常检测,在进阶任务中检查电机堵转建议选择
C:classify variation of your signal分类识别。本次我们检测电机的运行状态--静止与转动即可选择。
O:detect outliers离群点/单类检测
E:extrapolate unknown data外推/回归。用于预测连续数值,例如温度预测。
1.3 数据集获取与模型训练
后选择自己的开发板与sensor,RAM选择128kb,Flash选择512kb

选择之后在Signal页面中新建class类,因其datalogger中没有适配c562re开发板,我们选择通用的log signal from serial USB进行数据的采集
选在COM3端口,因数据量较大,选择921600的波特率,数量选择200--500均可,训练参数决定了模型训练时间
而后数据采集结束之后在benchmark中进行模型训练,会自动得出最优的一个模型
最后在deployment页面进行文件下载,建议勾选mfloat-abi,启用硬件FPU浮点指令,使得模型推理速度更快。如果在mx2配置中,你工程默认选择的软件推理,则无需勾选。可以在工程中的cmake/gcc.14.3.1.cmake中查看是否启动硬件FPU。

2. NanoEdge AI 模型集成与推理
2.1 文件与 CMake 配置
NanoEdge AI Studio 生成的库放在:
nanoedge/ ├── NanoEdgeAI.h └── libneai.a
CMakeLists.txt 用户段落需要加入:
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
app
nanoedge
)
target_compile_options(${CMAKE_PROJECT_NAME} PUBLIC
-fshort-enums
)
target_link_libraries(${CMAKE_PROJECT_NAME}
${CMAKE_SOURCE_DIR}/nanoedge/libneai.a
)2.2 模型信息
项目值
| 类型 | 分类(CNN) |
| 输入 | 256 点 × 3 轴 |
| 类别数 | 2 |
| 类别名 | …Running / …Stop(按类名自动映射为 RUN / STOP) |
| 输出 | 每类概率(0~1),取最大者为预测类别 |
2.3 推理流程
#include "NanoEdgeAI.h"
static float input[NEAI_INPUT_SIGNAL_LENGTH * NEAI_INPUT_AXIS_NUMBER];
static float probabilities[NEAI_NUMBER_OF_CLASSES];
/* 上电初始化 */
s_ai_ready = (neai_classification_init() == NEAI_OK);
/* 每个窗口完成时调用 */
static void ai_window_handler(const int16_t *window)
{
int id_class = -1;
for (int i = 0; i < NEAI_INPUT_SIGNAL_LENGTH * NEAI_INPUT_AXIS_NUMBER; i++) {
input[i] = (float)window[i]; /* 保持 x1 y1 z1 ... 顺序 */
}
if (neai_classification(input, probabilities, &id_class) == NEAI_OK) {
/* id_class 为 0 或 1,probabilities[id_class] 为置信度 */
}
}推理结果写入 OLED 第 6 页:
AI : RUN 99.985%
2.4 为什么置信度经常是 100%
这是二分类 CNN 在两类特征差异明显时的正常现象。用同一份 libneai 的 PC 仿真库 测试可以观察到:
明显振动信号:输出 [1.0, 0.0]
安静静止信号:输出约 [0.00015, 0.99985]
后者按一位小数显示会四舍五入成 100.0%,看起来“不会动”。当前固件用三位小数显示, 可以看到 99.985% 与 100.000% 的区别。置信度稳定不代表模型没工作,类别切换正常 才是关键指标。
如果希望置信度更有梯度,需要让训练数据包含更多难分样本(过渡状态、不同负载、 噪声),或者改用异常检测模型的相似度指标。
3. 工程结构与编译
Demo2_STEPMOTOR_cmake/ ├── main.c # 应用主流程:初始化、主循环、按键、AI 调度 ├── app/ │ ├── stepper.c/.h # 28BYJ-48 半步驱动 │ ├── ssd1306.c/.h # OLED 驱动 + 5×7 字库 │ ├── lis3dh.c/.h # 加速度计驱动 + 窗口采集 │ └── uart_comm.c/.h # 串口发送(阻塞 + 中断) ├── nanoedge/ │ ├── NanoEdgeAI.h │ └── libneai.a ├── generated/ # CubeMX2 生成的 HAL 初始化 ├── CMakeLists.txt └── docs/
注意事项:
CubeMX2 重新生成工程时可能覆盖 CMakeLists.txt 中的用户段落,需要重新加入app/*.c、nanoedge 头文件路径、-fshort-enums 和静态库;
generated/ 下的文件不要手改,改动写在 main.c / app/ 中;
烧录后若 OLED 无显示、电机不转,先确认 mx_system_init() 是否成功 (时钟、I2C、USART2 初始化都在里面)。
4. 常见问题排查
现象可能原因处理
| OLED 全黑 | 地址不是 0x3C、SDA/SCL 接反、模块为 SH1106 | 用 I2C 扫描确认地址;检查接线;确认控制器型号 |
| 电机只振动不转 | 相序错误、ULN 供电不足、未共地 | 检查 IN1~IN4 顺序;独立 5 V;共地 |
| 转向相反 | 线圈接反 | 交换电机任意两根线 |
| PC13 按键无反应 | 按键实际为低有效 | 改上拉 + 下降沿 |
| 串口乱码/无数据 | 波特率不匹配、适配器不支持 921600 | 检查终端设置,必要时降到 460800 |
| 数据行不足 768 列 | 串口丢字节、终端加了时间戳 | 提高波特率稳定性,关闭接收端附加信息 |
| AI 状态不变化 | 输入顺序/量程与训练不一致 | 检查 100 Hz、±2 g、x1y1z1 顺序 |
| 置信度一直是 100% | 模型输出饱和 | 正常现象;看类别是否变化 |
| 链接报错找不到 neai | 库架构不对或未加 -fshort-enums | 用 Cortex-M33 hard-float 版本;检查 CMake |
| CubeMX 重新生成后编译失败 | 用户 CMake 段落被覆盖 | 按第 9.1 节重新加入 |
5. 参数速查
参数值代码位置
| 半步周期 | 2 ms | app/stepper.h |
| 每圈半步数 | 4096 | app/stepper.h |
| 按键去抖 | 150 ms | main.c |
| OLED 地址 | 0x3C / 0x3D | app/ssd1306.h |
| 加速度计地址 | 0x19 / 0x18 | app/lis3dh.h |
| 采样率 | 100 Hz | LIS3DH_CTRL_REG1_VALUE |
| 量程 | ±2 g | LIS3DH_CTRL_REG4_VALUE |
| 窗口长度 | 256 × 3 | LIS3DH_WINDOW_SAMPLES |
| 推理输入 | float[768] | main.c |
| 串口波特率 | 921600 | main.c |
6. 小结
这个项目把几个常见模块串成了一条完整的边缘 AI 链路:
步进电机控制与按键交互;
共用 I2C 总线的 OLED 显示与加速度计采集;
固定格式、无冗余的振动数据流;
片上 CNN 分类与状态显示。
最值得注意的有两点:
采集质量取决于时序设计:把电机步进移到 SysTick、把长数据包改为中断发送、 OLED 只刷新单页,都是为了不让主循环的阻塞影响振动信号;
训练与推理必须同源:采样率、量程、窗口长度、数值顺序和尺度,任何一项改变 都需要重新采集数据并训练模型。
在此基础上还可以继续扩展,例如增加电机堵转检测,转速档位、加入方向类别、用 INT 引脚触发采样、 改用 DMA 发送串口数据,或者把识别结果通过串口回传给上位机。
自此本期任务基本结束,愿本人经验分享对您有帮助
我要赚赏金
