# FOC **Repository Path**: tom-embedded/foc ## Basic Information - **Project Name**: FOC - **Description**: FOC学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-09-21 - **Last Updated**: 2026-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AT32-FOC 磁场定向控制固件 基于 AT32F403AVGT7 (Cortex-M4 240MHz) 的无传感器/磁编码器 FOC 电机驱动固件,使用 PlatformIO + arterytekat32 平台开发。 ## 硬件平台 | 项目 | 规格 | | -------- | ---------------------------------------------------- | | MCU | AT32F403AVGT7 (240MHz ARM Cortex-M4) | | 电机 | 7 对极 PMSM (BLDC),表贴式永磁同步电机 | | 编码器 | TLE5012B (15-bit 磁编码器,SPI4 通信) | | 电流采样 | 10mΩ 采样电阻 + 10× 运放 (偏置 1.65V,ADC 参考 3.3V) | | 电流量纲 | ADC_SCALE ≈ 0.00806 A/count | | 电机驱动 | TMR1 6 路互补 PWM,20kHz,死区 48T (400ns) | | 母线电压 | 7.4V (2S 锂电池) | | 调试接口 | CMSIS-DAP | ## 目录结构 ``` AT32-FOC/ ├── include/ # 芯片头文件 (AT32F403A_407) ├── lib/ │ ├── ADC/ # ADC 初始化 (TMR1 CH4 硬件触发) │ ├── BSP/ # 板级支持包 (LED/KEY/Delay) │ ├── Encoder/ # TLE5012B 编码器驱动 (SPI4, 速度/角度计算) │ ├── FOC/ # FOC 核心 (Clarke/Park/SVPWM/校准状态机) │ ├── PID/ # PID/PI 控制器 │ └── TIM/ # 定时器 (TMR1 PWM + TMR7 系统时基) ├── src/ │ ├── config.h # 全局结构体定义 + PID 调参 + 外设初始化 │ └── main.c # 主入口 + ADC ISR ├── test/ # 测试记录 (PID 调参历史) ├── platformio.ini # PlatformIO 构建配置 └── .clang-format # 代码格式化规则 ``` ## 控制架构 ``` ┌───────────┐ ┌─────────────┐ ┌─────────────┐ ┌────────┐ │ speed_ref │────→│ 速度环 PID │────→│ 电流环 PI │────→│ SVPWM │────→ 电机 │ (°/s) │ │ @ 5kHz │ │ @ 10kHz │ │ 20kHz │ └───────────┘ └──────┬──────┘ └──────┬──────┘ └────────┘ ↑ ↑ 编码器速度 ADC 电流 (10kHz) (20kHz→10kHz 均值) ``` ### 时序设计 | 事件 | 频率 | 说明 | | --------------------- | ----- | --------------------------- | | ADC 采样 | 20kHz | TMR1 CH4 触发,50µs 间隔 | | 电流累加 | 20kHz | 每周期累加 Iα/Iβ | | 电流均值 + FOC 全链路 | 10kHz | 2 点均值滤波,消除 PWM 噪声 | | 速度环 PID | 5kHz | Speed_Div_CNT 每 2 次触发 | | 编码器 SPI 读取 | 10kHz | 与电流同步 | | 系统时基 | 1ms | TMR7 定时器 | ## 上电自动校准 上电后由三级状态机完成自动校准,无需手动操作: ``` MotorFlag 0 ──→ ADC 零偏校准 (250ms) │ EMA(α=0.5) 采集 5000 次,提取运放偏置电压 │ ▼ MotorFlag 1 ──→ 编码器 D 轴对齐 (~2s) │ 注入 Vd 电压将转子锁定至 D 轴,记录 EncoderOffset │ ▼ MotorFlag 2 ──→ 正常运行 速度闭环 + 电流闭环 FOC 控制 ``` ## PID 参数 (当前) | 参数 | 值 | 关系 | | --------------- | ------------ | --------------------------- | | `SPEED_KP` | `0.005` | 速度环比例增益 | | `SPEED_KI` | `KP × 0.01` | 积分 = KP/100 | | `CURRENT_KP` | `0.05` | 电流环比例增益 (10× 速度环) | | `CURRENT_KI` | `KP × 0.1` | 积分 = KP/10 | | `SPEED_LIMIT` | `8.0` (A) | 速度环输出限幅 | | `CURRENT_LIMIT` | `1.0` (标幺) | 电流环输出限幅 | ## 编码器滤波 TLE5012B 15-bit 编码器 @ 100µs 采样周期 → 速度量化噪声 ~110°/s。采用两级指数滤波: ```c 一阶 α = 0.28 (τ ≈ 307µs, fc ≈ 518Hz) 二阶 α = 0.12 (τ ≈ 783µs, fc ≈ 203Hz) ``` ## 构建与烧录 ```bash # 编译 pio run # 烧录 (CMSIS-DAP) pio run -t upload # 串口监视 pio device monitor -b 115200 ``` ## 关键设计决策 1. **电流环 Kp = 速度环 10×**: 内环带宽 >> 外环,避免相位滞后叠加 2. **校准中 cos_theta/sin_theta 手动设置**: case1 不执行 ParkTransform,须显式置 1/0 否则 SVPWM 零矢量 3. **EncoderOffset 单次记录**: 仅在 Vd 爬升稳定后才写入,防止漂移 4. **结构体 {0} 零初始化**: BSS 段自动归零,简洁且可靠 ## 调参经验 - **低速卡顿**: 编码器量化噪声主导时,滤波与 PID 必须协同调整 - 滤波过强 (α < 0.01) → 相位滞后 → 振荡 - Kp 过高 → 噪声放大 → 抖动 - 策略: α=0.15~0.3 / 0.02~0.12 + Kp≤0.005 - **电流声/电流过大**: 检查电流环时序,确保 `return` 退出的是中断而非仅内联函数 - 详细记录见 `test/README` ## 板载CMSIS-DAP固件上传策略 openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "adapter speed 5000" -c "program Air32_CMISS-DAP_Firmware.hex verify reset exit"