一、硬件初始化配置
// 系统时钟配置(150MHz)
void InitSysCtrl() {
EALLOW;
ClkCfgRegs.PLLCR.bit.DIV = 0x01; // 主频150MHz
ClkCfgRegs.PLLSTS.bit.DIVSEL = 0x00;
EDIS;
}
// GPIO配置(PWM1-6用于逆变器驱动)
void InitGpio() {
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // PWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // PWM1B
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // PWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // PWM2B
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // PWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // PWM3B
EDIS;
}
// ADC初始化(12位分辨率,连续采样模式)
void InitAdc() {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0B; // 采样保持时间75ns
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV = 0x02; // 最大转换通道2
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00; // 通道0: A相电流
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01; // 通道1: B相电流
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02; // 通道2: DC母线电压
}
// PWM初始化(20kHz频率,死区时间1.5μs)
void InitPwm() {
EPwm1Regs.TBPRD = 1500; // 周期值(150MHz时钟下对应20kHz)
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 双向计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // 高速分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2; // 主时钟分频
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁用同步输出
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOC事件
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // 选择计数器归零事件
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // 生成一次SOC事件
EPwm1Regs.ETCLR.bit.SOCA = 1; // 清除SOC标志
}
二、中断服务程序(AdcISR)
interrupt void AdcISR() {
static _iq Ia=0, Ib=0, Vdc=0;
// 读取ADC转换结果(Q15格式)
Ia = _IQmpy(_IQ(AdcRegs.ADCRESULT0^0x8000), 0.00048828125); // 0-3.3V转Q15
Ib = _IQmpy(_IQ(AdcRegs.ADCRESULT1^0x8000), 0.00048828125);
Vdc = _IQmpy(_IQ(AdcRegs.ADCRESULT2^0x8000), 0.00048828125);
// 三相电流重构(Clark变换)
Ialpha = Ia;
Ibeta = (Ia + 2*Ib) * _IQ(0.57735); // 1/√3系数
// 启动下一次ADC转换
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除ACK
}
三、坐标变换与磁场定向
// Clarke变换(3→2相静止坐标系)
void Clarke_Transform(float ia, float ib, float *ialpha, float *ibeta) {
*ialpha = ia;
*ibeta = (ia + 2*ib) * 0.57735f; // 1/√3系数
}
// Park变换(静止→旋转坐标系)
void Park_Transform(float ialpha, float ibeta, float theta, float *id, float *iq) {
*id = ialpha * _IQcos(theta) + ibeta * _IQsin(theta);
*iq = -ialpha * _IQsin(theta) + ibeta * _IQcos(theta);
}
// 逆Park变换(旋转→静止坐标系)
void IPark_Transform(float vd, float vq, float theta, float *valpha, float *vbeta) {
*valpha = vd * _IQcos(theta) - vq * _IQsin(theta);
*vbeta = vd * _IQsin(theta) + vq * _IQcos(theta);
}
// 逆Clark变换(2→3相静止坐标系)
void InvClarke_Transform(float valpha, float vbeta, float *va, float *vb, float *vc) {
*va = valpha;
*vb = -0.5f*valpha + 0.8660254f*vbeta; // √3/2系数
*vc = -0.5f*valpha - 0.8660254f*vbeta;
}
四、双闭环控制算法
// PI控制器结构体
typedef struct {
_iq Kp; // 比例系数
_iq Ki; // 积分系数
_iq Kd; // 微分系数
_iq Integral; // 积分项
_iq Output; // 输出值
} PI_Obj;
// 电流环PI调节(Q15格式)
void Current_PI_Update(PI_Obj *pi, _iq ref, _iq fdb, _iq *out) {
_iq error = _IQmpy(ref - fdb, _IQ(0.5)); // 误差计算(比例项)
pi->Integral += error; // 积分项累加
*out = _IQmpy(pi->Kp, error) + _IQmpy(pi->Ki, pi->Integral);
}
// 转速环PI调节(浮点格式)
void Speed_PI_Update(PI_Obj *pi, float ref, float fdb, float *out) {
float error = ref - fdb;
pi->Integral += error * DT; // 积分项累加(DT=1/10kHz=0.0001s)
*out = pi->Kp*error + pi->Ki*pi->Integral;
}
五、SVPWM生成与死区补偿
// SVPWM生成(扇区判断+作用时间计算)
void SVPWM_Generate(float va, float vb, float vc) {
static _iq Ta=0, Tb=0, Tc=0;
static int sector=0;
// 扇区判断(0-5)
if(va >=0 && vb >=0 && vc >=0) sector=1;
else if(va >=0 && vb >=0 && vc <0) sector=2;
// ...其他扇区判断(完整代码需补充)
// 作用时间计算(Q15格式)
Ta = _IQmpy(_IQ(0.5), _IQ(1) - Tb - Tc);
Tb = _IQmpy(_IQ(0.5), _IQ(1) - Ta - Tc);
Tc = _IQmpy(_IQ(0.5), _IQ(1) - Ta - Tb);
// 死区补偿(1.5μs)
EPwm1Regs.CMPA.half.CMPA = (Ta + Tb) >> 1;
EPwm2Regs.CMPA.half.CMPA = (Tb + Tc) >> 1;
EPwm3Regs.CMPA.half.CMPA = (Tc + Ta) >> 1;
}
// PWM中断服务程序
interrupt void EvbTimerISR() {
static float theta=0.0;
// 位置/速度检测(QEP解码)
theta = QEP_GetPosition(); // 获取机械角度(单位:弧度)
// 坐标变换
Clarke_Transform(Ia, Ib, &Ialpha, &Ibeta);
Park_Transform(Ialpha, Ibeta, theta, &Id_ref, &Iq_ref);
// 电流环控制
Current_PI_Update(¤t_PI, Iq_ref, Iq_actual, &Vq_cmd);
// 转速环控制
Speed_PI_Update(&speed_PI, target_speed, actual_speed, &Id_ref);
// 逆坐标变换
IPark_Transform(Vd_cmd, Vq_cmd, theta, &Valpha_cmd, &Vbeta_cmd);
InvClarke_Transform(Valpha_cmd, Vbeta_cmd, &va, &vb, &vc);
// SVPWM生成
SVPWM_Generate(va, vb, vc);
// 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
六、系统保护机制
// 过流保护处理
void OverCurrent_Protection() {
if(ADC_GetValue(2) > 3000) { // DC母线电压检测
EPwm1Regs.TBCTL.bit.ENABLE = 0; // 关闭PWM输出
FLAG_OVERLOAD = 1;
}
}
// 过温保护处理
void OverTemp_Protection() {
if(ADC_GetValue(3) > 2500) { // 温度传感器检测
EPwm1Regs.TBCTL.bit.ENABLE = 0; // 关闭PWM输出
FLAG_OVERTEMP = 1;
}
}
参考代码 基于dspf2812的永磁同步电机矢量控制程序 www.youwenfan.com/contentcsm/72037.html
七、调试与优化建议
- 电流采样校准 采用三相两线法采样,通过软件补偿零点漂移 校准公式:
I_actual = (ADC_val - ADC_offset) * ADC_gain - 参数整定技巧 电流环PI参数:
Kp=0.5, Ki=0.01(需根据电机参数调整) 转速环PI参数:Kp=0.1, Ki=0.005(带前馈补偿) - 死区补偿优化 动态补偿公式:
T_comp = (1.5μs - T_dead)/T_PWM补偿范围限制:0 ≤ T_comp ≤ 0.5 - 磁场定向精度 采用滑模观测器估算转子位置(替代机械编码器) 观测器方程:
x(k+1) = Ax(k) + Bu(k) + L(y(k)-Cx(k))
1331

被折叠的 条评论
为什么被折叠?



