基于STM32平台的永磁同步电机(PMSM)磁场定向控制(FOC)实现
一、系统
1. 硬件组成框图
STM32F407
├─ 三相逆变器(驱动电路)
├─ 电流采样模块(INA219/ACS712)
├─ 编码器接口(QEI模块)
├─ PWM生成模块(TIM1/8高级定时器)
├─ 通信接口(CAN/UART)
└─ 电源模块(DC-DC降压)
2. 关键参数配置
| 参数 | 值/配置说明 |
|---|---|
| 控制频率 | 10kHz PWM(TIM1/8重装载值) |
| 电流采样率 | 1kHz(ADC双通道交替采样) |
| 位置检测 | 增量式编码器(2500线) |
| 电流环PI参数 | Kp=10, Ki=200 |
| 速度环PI参数 | Kp=0.5, Ki=10 |
二、软件
1. 主程序框架
void main() {
SystemInit(); // 系统时钟配置
Motor_Init(); // 电机参数初始化
Encoder_Init(); // 编码器接口初始化
PWM_Init(); // 高级定时器配置
ADC_Init(); // 电流采样配置
while(1) {
Read_Encoder(); // 获取转子位置θ
Read_Currents(); // 采样两相电流ia/ib
FOC_Control(); // 执行FOC算法
Update_PWM(); // 更新PWM占空比
}
}
2. 核心算法实现
2.1 Clarke-Park变换
// Clarke变换(三相→静止两相)
void Clarke_Transform(float ia, float ib, float ic, float *ialpha, float *ibeta) {
*ialpha = (2*ia - ib - ic)/3;
*ibeta = (ib - ic)/sqrt(3);
}
// Park变换(静止→旋转坐标系)
void Park_Transform(float ialpha, float ibeta, float theta, float *id, float *iq) {
*id = ialpha*cos(theta) + ibeta*sin(theta);
*iq = -ialpha*sin(theta) + ibeta*cos(theta);
}
2.2 SVPWM生成
void SVPWM_Generate(float vd, float vq) {
float alpha = vd;
float beta = vq;
// 计算扇区
uint8_t sector = Get_Sector(alpha, beta);
// 计算比较值
float T1, T2, T0;
Calculate_SVPWM_T(alpha, beta, &T1, &T2, &T0);
// 更新TIM1比较寄存器
TIM_SetCompare1(TIM1, T1);
TIM_SetCompare2(TIM1, T2);
// ...其他通道配置
}
2.3 电流闭环控制
void Current_Control() {
static float id_ref = 0, iq_ref = 0;
// PI控制器
id_ref = PI_Controller(&id_PI, 0, id_err); // d轴电流保持0
iq_ref = PI_Controller(&iq_PI, iq_ref, iq_err); // q轴电流跟踪
// 限幅保护
iq_ref = constrain(iq_ref, -I_MAX, I_MAX);
}
三、调试
1. 硬件验证
- PWM波形验证:示波器观察三相PWM波形,确保对称性(死区时间1-2μs)
- 电流采样校准:空载时三相电流和应为零,单相短路测试采样精度
- 编码器零点校准:电机静止时记录编码器A相上升沿位置作为零点
2. 软件调试
graph TD
A[初始化] --> B[验证PWM输出]
B --> C[测试电流采样]
C --> D[调试Clark变换]
D --> E[验证Park变换]
E --> F[整定电流环PI]
F --> G[验证SVPWM]
G --> H[整定速度环PI]
3. 参数整定方法
- 电流环整定: 设置Ki=0,逐步增大Kp至电流响应出现轻微振荡 引入Ki消除稳态误差 添加前馈补偿(Vd_ff = ωeLqiq)
- 速度环整定: 电流环PI参数固定 设置Kp=0.1,Ki=0.01 逐步提高Kp至速度超调<5%
四、抗干扰措施
-
电流采样滤波:
// 移动平均滤波 static float current_buf= {0}; current_buf[index++] = raw_current; if(index >= 5) index = 0; float filtered = 0; for(int i=0; i<5; i++) filtered += current_buf[i](@ref); filtered /= 5; -
编码器信号处理: 添加4倍频电路 使用边沿触发中断 实现正交信号校验
-
电源设计: 采用LC滤波(10μH+100μF) 添加去耦电容(0.1μF+10μF)
参考代码 实现电机控制 pmsm 矢量控制 FOC控制 www.youwenfan.com/contentcsj/72304.html
五、扩展功能实现
1. 无传感器FOC
// 滑模观测器实现
void SMO_Update() {
float est_id = id + Ks*(id_ref - id) + Kf*omega_e;
float est_iq = iq + Ks*(iq_ref - iq) - Kf*theta;
// 反电动势估计
float est_Ealpha = -R*ialpha - Ld*d est_id/dt;
float est_Ebeta = -R*ibeta - Lq*d est_iq/dt;
}
2. 能耗监控
float Energy_Calc() {
static float energy = 0;
energy += (V_dc * I_rms * duty_cycle) * 0.001; // kWh
return energy;
}
六、开发建议
- 开发环境: 硬件:STM32F407+DRV8305驱动板 软件:Keil MDK + STM32CubeMX
- 调试工具: 逻辑分析仪:捕获PWM/SVPWM波形 电流探头:实时监测相电流 转速计:验证速度环性能
- 代码优化: 使用DMA传输ADC数据 开启FPU加速浮点运算 采用查表法计算三角函数