# motor-ctl **Repository Path**: cl_jon/motor-ctl ## Basic Information - **Project Name**: motor-ctl - **Description**: 电机控制算法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-16 - **Last Updated**: 2026-07-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # motor-ctl — BLDC 无刷直流电机控制固件 基于 STM32F405 的 BLDC 无刷直流电机速度闭环控制固件,采用六步换相 + PI 速度控制,配合上位机 [motor-tuning](../motor-tuning/) 实现实时调参与波形监控。 ## 硬件平台 | 项目 | 规格 | |------|------| | MCU | STM32F405RGTx (Cortex-M4, FPU, 168MHz) | | 外设库 | STM32 标准外设库 (SPL) | | 驱动电压 | 24V DC | | HSE | 8MHz 外部晶振 | | 通信接口 | USART1 (PB6/PB7), 115200 8N1 | | 显示 | 128x64 OLED (SPI) | | 电流采样 | 三相运放 SGM8634, 增益 33x | ## 功能特性 - **六步换相控制** — 霍尔传感器检测转子位置,TIM1 互补 PWM 驱动三相桥 - **PI 速度闭环** — 霍尔换相中断中执行 `pid_calc()`,一阶低通滤波输出 - **故障保护** — 8 种故障检测(堵转、过流、过压、欠压、霍尔异常等),支持自动停机 - **ADC 采样** — DMA 扫描模式采集三相电流 + 母线电压 - **UART 通信** — 50Hz 数据上报,二进制帧协议与上位机交互 - **参数持久化** — Flash 存储 PID 参数,上电自动恢复 ## 项目结构 ``` motor-ctl/ ├── CMakeLists.txt # 构建配置 ├── STM32F405RGTx_FLASH.ld # 链接脚本 ├── src/ │ ├── main.c # 主循环:按键、OLED、UART(非实时) │ ├── motor.c/h # 电机状态机(RUNNING/STOPPED) │ ├── pid.c/h # PI 速度控制器 │ ├── hall.c/h # 霍尔传感器输入捕获与测速 │ ├── pwm.c/h # 三相 PWM 输出与六步换相 │ ├── uart_comm.c/h # UART 帧协议通信 │ ├── adc_sample.c/h # ADC + DMA 电流/电压采样 │ ├── fault.c/h # 故障检测与保护 │ ├── params_store.c/h # Flash 参数存储 │ ├── oled.c/h # OLED 显示驱动 │ └── keys.c/h # 按键输入 ├── lib/ │ ├── cmsis/ # ARM CMSIS 核心库 │ ├── stm32f4xx/ # STM32F4 标准外设库 │ └── segger_rtt/ # SEGGER RTT 调试库 ├── docs/ # 设计文档与教程 └── scripts/ # 烧录脚本 ``` ## 控制架构 ``` 霍尔传感器 (PC6/PC7/PC8) │ ▼ TIM4 输入捕获 → 转速计算 (RPM) → 一阶低通滤波 │ │ ▼ ▼ 六步换相表 → PWM 输出 (TIM1) PI 控制器 → 占空比调节 │ PA8/PA9/PA10 ▼ PB13/PB14/PB15 三相全桥驱动 → BLDC 电机 ``` ## 构建与烧录 ### 前置条件 - ARM GCC 工具链(路径:`/opt/st/stm32cubeclt_1.20.0/GNU-tools-for-STM32/bin/`) - CMake ≥ 3.20 - Ninja - JLink(烧录用) ### 编译 ```bash # 配置(首次) cmake -B build -G Ninja # 编译 cmake --build build ``` 生成产物:`build/jiangxin_bldc.bin`、`build/jiangxin_bldc.hex` ### 烧录 ```bash cmake --build build --target flash ``` ## 通信协议 与上位机通过二进制帧协议通信: ``` 帧格式: [0xAA] [0x55] [长度] [载荷...] [CRC8] 波特率: 115200 8N1 上报频率: 50Hz ``` 命令码范围 `0x10`–`0x1D`,支持: - 目标转速设置 - PID 参数读写 - 电机启停控制 - 实时数据上报(转速、电流、电压、故障状态等) 协议定义见 `src/uart_comm.h`。 ## 故障检测 | 故障类型 | 说明 | 自动停机 | |----------|------|----------| | 堵转 (STALL) | 500ms 无霍尔信号 | 是 | | 过流 (OVERCURRENT) | 电流超阈值 | 是 | | 过压 (OVERVOLTAGE) | 母线电压过高 | 否 | | 欠压 (UNDERVOLTAGE) | 母线电压过低 | 否 | | 霍尔编码异常 | 非法霍尔组合 | 否 | | 霍尔序列异常 | 换相顺序错误 | 否 | | 积分饱和 | PI 积分器饱和 | 否 | | 转速偏差 | 实际与目标偏差 >30% | 否 | ## GPIO 分配 | 功能 | 引脚 | 说明 | |------|------|------| | PWM 上桥臂 | PA8, PA9, PA10 | TIM1 CH1/CH2/CH3 | | PWM 下桥臂 | PB13, PB14, PB15 | GPIO 控制 | | 霍尔传感器 | PC6(U), PC7(V), PC8(W) | TIM4 输入捕获 | | UART | PB6(TX), PB7(RX) | USART1 | | 电流采样 | PA6(IA), PA7(IB), PC3(IC) | ADC1 | | 母线电压 | PC0 | ADC1 | | 按键 | PB0, PB1, PB10, PB11, PB12, PC5 | POT/STOP/UP/DOWN/DIR/RUN | | OLED | PB3(CS), PB4(DC), PB5(RES) | SPI | ## 相关项目 - [motor-tuning](../motor-tuning/) — 桌面上位机调试工具(Rust + egui)