STM32 三相电机FOC驱动方案(三电阻单电阻双模式)

配STM32全系列(F1/F4/G4/H7等),支持有感/无感FOC


一、核心选型指南(先选对硬件再动手)

参数 选型建议 适用场景
MCU STM32F303/G474(带内置运放/PGA最佳)、F103/F407 F303/G4适合高压伺服,F103/F407适合低压低成本场景
功率器件 MOS管/IGBT/专用驱动芯片(DRV83xx/STSPIN系列) 低压小功率选DRV8313,高压大功率选IPM模块
电流采样方案 三电阻/单电阻 见下方双模式对比

三电阻 vs 单电阻 核心对比

维度 三电阻采样 单电阻采样
采样电阻数量 3个 1个
额外硬件要求 3路运放/ADC通道 1路高带宽运放/差分放大器
采样窗口限制 有最小采样脉宽要求,需规避非观测区
采样精度 最高 中等,依赖电流重构算法
硬件成本 低(省2个采样电阻+2路运放)
适用场景 伺服、高精度控制 风机、水泵、小家电等成本敏感场景

二、硬件设计核心规范(避坑必看)

1. 通用设计规范

  • 电源分层:功率地、数字地、模拟地单点接地,避免开关噪声干扰采样
  • PWM输出线与电流采样线严禁交叉布线,采样线走差分对称走线
  • 采样电阻两端必须采用开尔文走线,直接从电阻焊盘引出到ADC引脚,消除PCB铜箔压降影响
  • 功率器件预留至少2~3倍电流余量,避免过载炸机

2. 三电阻采样专属硬件

  • 采样电阻选5~20mΩ,后端接同相比例运放电路,放大后接入STM32 ADC通道,增益根据ADC量程调整(一般放大20~50倍)
  • 每路采样电路并联RC滤波电路,滤除PWM高频噪声

3. 单电阻采样专属硬件

  • 采样电阻选10~50mΩ,后端接高带宽差分放大器(如INA240,共模抑制比≥80dB),抑制功率回路共模噪声
  • 运放输出端并联RC滤波,ADC采样通道配置为定时器PWM周期中段触发,确保采样点在稳定区间
  • 调整T_RISE(电流振荡稳定时间)为2~3μs,平衡采样精度和母线利用率

三、CubeMX/MC Workbench配置步骤

1. 基础外设配置

  • 高级定时器(TIM1/TIM8):中央对齐模式3,开启互补PWM输出、死区控制,CCR比较值触发ADC采样
  • ADC:配置为定时器触发采样,开启DMA传输,采样通道对应电流采样引脚
  • GPIO:配置PWM输出、故障保护、编码器/霍尔接口(有感方案)

2. 电流采样模式专属配置

三电阻采样配置

无需额外复杂配置,直接在MC Workbench中选择三电阻模式,采样通道对应U/V/W三相电流即可

单电阻采样配置
  1. 配置定时器通道5/6上升沿触发TRGO2信号,用于ADC采样触发
  2. 配置定时器通道4比较值为最小采样脉宽HTMIN(死区时间+T_RISE+ADC采样时间)
  3. 在代码中根据SVPWM扇区动态计算PWM占空比,避让非观测区

四、核心代码逻辑

1. 三电阻采样代码(最简单)

c 复制代码
// 根据SVPWM扇区选择不受窗口限制的两相电流采样
void ThreeResistor_CurrentSample(void) {
    switch(current_sector) {
        case 1: case 6:
            // 采样Ib、Ic,Ia = -(Ib+Ic)
            Ia = -(ADC_GetValue(CH2) + ADC_GetValue(CH3));
            Ib = ADC_GetValue(CH2);
            Ic = ADC_GetValue(CH3);
            break;
        case 2: case 3:
            // 采样Ia、Ic,Ib = -(Ia+Ic)
            Ia = ADC_GetValue(CH1);
            Ib = -(ADC_GetValue(CH1) + ADC_GetValue(CH3));
            Ic = ADC_GetValue(CH3);
            break;
        case 4: case 5:
            // 采样Ia、Ib,Ic = -(Ia+Ib)
            Ia = ADC_GetValue(CH1);
            Ib = ADC_GetValue(CH2);
            Ic = -(ADC_GetValue(CH1) + ADC_GetValue(CH2));
            break;
    }
}

2. 单电阻采样代码(电流重构核心)

c 复制代码
// 单PWM周期两次采样重构三相电流
void SingleResistor_CurrentReconstruct(void) {
    static uint8_t sample_phase = 0;
    if(sample_phase == 0) {
        // 第一次采样:获取第一相电流
        I1 = ADC_GetValue(BUS_CURRENT_CH);
    } else if(sample_phase == 1) {
        // 第二次采样:获取第二相电流,第三相通过KCL计算
        I2 = ADC_GetValue(BUS_CURRENT_CH);
        I3 = -(I1 + I2);
    }
    sample_phase = (sample_phase + 1) % 3;
}

3. FOC核心算法框架

复制代码
电机参数初始化 → 状态机切换(预定位→强拖加速→切入闭环)→ 
Clarke/Park变换 → PI电流环控制 → 反Park变换 → SVPWM调制 → ADC电流采样

参考代码 STM32驱动三相电机,包括三电阻、单电阻反馈,foc算法 www.youwenfan.com/contentcst/182266.html

五、调试避坑指南

  1. 先调三电阻再切单电阻:先在硬件三电阻模式下完成电机参数辨识、启动参数调试,确认电机正常运行后再切换单电阻模式,降低调试难度
  2. 采样波形验证:用示波器抓取采样波形,确保电流波形正弦且无杂波,若波形畸变需调整运放增益或采样点位置
  3. 启动参数调试:无感启动重点调整强拖加速度阈值、切入闭环速度阈值,避免启动抖动或反转
  4. 保护配置:开启过流、过压、欠压、堵转保护,避免炸机
相关推荐
蓝斯49715 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip15 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程15 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工16 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip17 小时前
CAN与CANopen的本质区别
单片机
lilihewo17 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET18 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院19 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰20 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥20 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5