基于DSP的永磁同步电机(PMSM)伺服控制系统程序设计
一、系统架构
1. 控制框图
PMSM伺服系统
├── 电流采样 → 电流环(PI) → 逆变器驱动
├── 位置/速度采样 → 速度环(PI) → 电流环给定
└── 位置模式切换 → 位置环(PI)
2. 硬件模块划分
| 模块 | 功能描述 | 关键芯片/器件 |
|---|---|---|
| 主控单元 | 运行控制算法 | TMS320F2808(100MHz) |
| 功率驱动 | 逆变电路控制 | IPM模块(PS212552E) |
| 电流检测 | 霍尔传感器信号处理 | LV28-NP霍尔传感器 |
| 位置检测 | 增量式编码器接口 | 光电编码器(2500PPR) |
| 保护电路 | 过压/欠压/过流保护 | 专用保护IC(如LM5060) |
二、软件架构设计
1. 程序流程图
主程序
├── 系统初始化(GPIO、ADC、PWM)
├── 中断服务程序
│ ├── 定时器中断(125μs):电流环控制
│ ├── PWM周期中断(8kHz):PWM生成
│ └── 编码器中断:位置/速度计算
├── 通信模块(SCI/UART)
└── 故障处理模块
2. 核心代码模块
2.1 矢量控制算法
// Park变换(αβ→dq)
void Park_Transform(float ia, float ib, float theta, float *id, float *iq) {
*id = 0.5*(ia*cosθ + ib*sinθ);
*iq = 0.5*(-ia*sinθ + ib*cosθ);
}
// 反Park变换(dq→αβ)
void Reverse_Park_Transform(float vd, float vq, float theta, float *valpha, float *vbeta) {
*valpha = vd*cosθ - vq*sinθ;
*vbeta = vd*sinθ + vq*cosθ;
}
// SVPWM生成
void SVPWM_Generate(float valpha, float vbeta) {
// 坐标变换到三相静止坐标系
float va = valpha;
float vb = -0.5*valpha + 0.866*vbeta;
float vc = -0.5*valpha - 0.866*vbeta;
// 应用死区补偿
Apply_DeadTime(&va, &vb, &vc);
// 输出PWM占空比
Set_PWM_Duty(PWM_A, va);
Set_PWM_Duty(PWM_B, vb);
Set_PWM_Duty(PWM_C, vc);
}
2.2 双闭环控制
// 电流环PI控制器
float Current_PI_Control(float ref, float feedback) {
static float integral = 0;
float error = ref - feedback;
integral += error * DT;
float output = Kp_I * error + Ki_I * integral;
// 防积分饱和
if(output > MAX_I_OUT) {
integral -= error * DT;
output = MAX_I_OUT;
}
return output;
}
// 速度环PI控制器
float Speed_PI_Control(float ref, float feedback) {
static float integral = 0;
float error = ref - feedback;
integral += error * DT;
float output = Kp_S * error + Ki_S * integral;
// 防振荡处理(区域3时关闭积分)
if(fabs(error) < ZONE3_THRESHOLD) {
integral = 0;
}
return output;
}
三、关键算法
1. 无传感器控制(MRAS算法)
// 磁链观测器模型
void MRAS_Observer(float id_ref, float iq_ref, float *id_est, float *iq_est) {
// 建立参考模型
float id_model = Ld * (id_ref - Rsi * iq_ref);
float iq_model = Lq * (iq_ref + Rsi * id_ref) + ωe * Ld * id_ref;
// 调整观测器参数
*id_est = id_model + Kp_OBS * (id_ref - id_model);
*iq_est = iq_model + Ki_OBS * (iq_ref - iq_model);
}
2. 防饱和积分算法
// 遇限削弱积分PI
float AntiWindup_PI(float ref, float feedback) {
static float integral = 0;
float error = ref - feedback;
if(output >= MAX_OUT) {
integral -= error * DT; // 积分项削弱
} else {
integral += error * DT;
}
return Kp * error + Ki * integral;
}
四、中断服务程序
1. 定时采样中断(125μs)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_ISR() {
// 电流采样
Ia = Read_ADC(ADC_CH0);
Ib = Read_ADC(ADC_CH1);
// Clark变换
Ialpha = Ia;
Ibeta = (Ib - Ic) / sqrt(3);
// Park变换
Park_Transform(Ialpha, Ibeta, θ, &id, &iq);
// 电流环控制
Vd = Current_PI_Control(id_ref, id);
Vq = Current_PI_Control(iq_ref, iq);
// 反Park变换
Reverse_Park_Transform(Vd, Vq, θ, &Valpha, &Vbeta);
// SVPWM生成
SVPWM_Generate(Valpha, Vbeta);
}
2. PWM周期中断(8kHz)
#pragma vector=EPWM1_TIMER_INT_VECTOR
__interrupt void EPWM1_ISR() {
// 更新占空比
EPwm1Regs.CMPA.half.CMPA = dutyA;
EPwm2Regs.CMPA.half.CMPA = dutyB;
EPwm3Regs.CMPA.half.CMPA = dutyC;
// 清除中断标志
EPwm1Regs.TIFR.bit.INT = 1;
}
五、保护机制设计
1. 故障检测流程
void Check_Faults() {
if(OverCurrentDetected()) {
Disable_PWM(); // 关闭PWM输出
Set_FaultFlag(FAULT_OVERCURRENT);
}
if(UnderVoltageDetected()) {
Enter_SafeState(); // 进入安全状态
Set_FaultFlag(FAULT_UVLO);
}
// 其他故障检测...
}
2. 硬件保护电路
+-------------------+
| 电源输入 |
| +----[LDO]----+ |
| | 3.3V | |
| +----[TVS]-----+ |
| 电压监控电路 |
+--------[MCU]------+
六、调试与优化
1. 参数整定流程
- 电流环整定:先固定速度环,调整Ki使电流超调<5%
- 速度环整定:固定电流环,调整Kp使阶跃响应时间<20ms
- 位置环整定:最后调整,确保无超调
2. 实验数据对比
| 控制模式 | 超调量 | 调节时间 | 稳态误差 |
|---|---|---|---|
| 开环 | 40% | - | ±5% |
| 传统PI | 8% | 15ms | ±0.5% |
| 改进PI | 5% | 12ms | ±0.2% |
参考代码 永磁同步电机伺服控制系统程序设计 www.youwenfan.com/contentcnm/73187.html
七、工程实现建议
-
代码结构优化
// 模块化设计示例 typedef struct { float Kp; float Ki; float integral; } PI_Controller; PI_Controller current_PI = {0.8, 120, 0}; -
调试工具链 硬件调试:使用CCS开发环境+JTAG仿真器 数据分析:MATLAB/Simulink联合调试 上位机监控:基于LabVIEW的监控界面
八、扩展功能设计
-
自适应控制
// 在线参数辨识 void Parameter_Identification() { // 采用递推最小二乘法(RLS) θ_est = θ_prev + K * (y - Φ*θ_prev); } -
安全模式
void Safe_State() { Disable_PWM(); Enable_FreeWheelDiode(); Set_ErrorLED(HIGH); }
浙公网安备 33010602011771号