dsp28335电机控制板zi料(软件代码) 1.永磁同步电机有传感器三闭环foc控制代码 2.永磁同步电机无传感器双闭环foc控制代码 3.无刷直流电机有传感器方波控制代码 4.异步电机V/F变频调速控制代码 控制板和驱动版硬件电子资料+软件程序CCS6.0环境下运行
DSP28335这玩意儿在电机控制圈子里混得风生水起不是没有道理的,今天咱们就扒一扒它家祖传的电机控制代码。搞过电机驱动的都知道,能把不同电机类型的控制方案攒齐了不容易,这板子倒是把永磁同步、无刷直流、异步电机都包圆了。
先说永磁同步电机的有传感器三闭环FOC,这个方案适合对控制精度有强迫症的场合。代码里能看到经典的Clarke-Park变换套娃:
// 电流环核心代码片段 Ia = AdcResult.ADCRESULT0 * 0.00024414; // ADC采样值转实际电流 Ib = AdcResult.ADCRESULT1 * 0.00024414; Ialpha = Ia; // Clarke变换 Ibeta = (Ia + 2*Ib)*0.57735; Id = Ialpha*cos_theta + Ibeta*sin_theta; // Park变换 Iq = -Ialpha*sin_theta + Ibeta*cos_theta;这段代码里有个隐藏知识点——0.57735其实是1/√3的近似值,用定点数处理时这个系数精度直接影响电流环稳定性。新手容易在这里翻车,调参时建议先用仿真器盯着Id/Iq波形看。
无传感器方案就刺激多了,省了编码器但得跟滑模观测器死磕。代码里这个滑模函数看着简单:
float SMO(float e_alpha, float e_beta) { float sign_alpha = (e_alpha > 0) ? 1 : -1; float sign_beta = (e_beta > 0) ? 1 : -1; return Kslide*(sign_alpha*e_alpha + sign_beta*e_beta); }实际调参时Kslide这个增益系数得在噪声敏感性和观测精度之间走钢丝。有个野路子——拿示波器看反电势波形,把Kslide调到波形刚消除畸变的临界值,亲测比公式计算靠谱。
dsp28335电机控制板zi料(软件代码) 1.永磁同步电机有传感器三闭环foc控制代码 2.永磁同步电机无传感器双闭环foc控制代码 3.无刷直流电机有传感器方波控制代码 4.异步电机V/F变频调速控制代码 控制板和驱动版硬件电子资料+软件程序CCS6.0环境下运行
BLDC方波控制算是老江湖了,霍尔信号处理是重头戏。这段状态机代码藏着玄机:
switch(Hall_State){ case 0b101: EPwm1Regs.CMPA.half.CMPA = dutyCycle; EPwm2Regs.CMPA.half.CMPA = 0; EPwm3Regs.CMPA.half.CMPA = 0; break; // 其他5种霍尔状态类似... }看似简单的占空比分配,但换相时的死区补偿得偷偷加个5%~10%的duty偏移量,不然低速时扭矩波动能逼死强迫症。这个技巧在代码注释里可找不到,都是焊板子烧出来的经验。
异步电机的V/F控制看着人畜无害,但压频比曲线的弯道超车是关键。代码里的这个查表法有点东西:
const float VF_curve[] = {0.0, 5.0, 10.0, ..., 380.0}; // 电压表 const float Freq_curve[] = {0.0, 5.0, 15.0, ..., 50.0}; // 频率表 float get_voltage(float freq){ int index = (int)(freq / 0.5); // 0.5Hz步长 return VF_curve[index] + (freq - index*0.5)*slope; // 线性插值 }低频时得偷偷把电压抬个5%-8%,不然电机根本转不起来。这个补偿量得根据电机铭牌参数微调,别信教材上说的理想线性关系。
这套代码在CCS6.0上跑的时候,工程配置里有个大坑——得手动修改28335RAMlnk.cmd文件里的存储器分配。特别是无传感器算法吃内存厉害,建议把IQmath库扔到SARAM块,不然等着看跑飞吧。驱动板硬件上,电流采样电路的PCB走线要严格等长,不然ADC采样时刻的相位差能让你调参调到怀疑人生。