永磁同步电机参数辨识 包括初始位置检测,编码器零点位置、方向辨识; 包括电机极对数、电阻、电感、磁链、反电势常数、编码器零位等。 包括源C代码,代码详细注释文档,可见部分图片展示。 转子电阻和漏感辨识时,在周期中断和比较中断中检测电流和电压; 定子电阻辨识; 提供原理图、PCB和BOM表,以及文档说明及个人笔记 C代码完整,功能注释详细,可按需自行复制到自己的工程中。 涉及DSP2808,DSP28035芯片
玩过电机控制的都知道,参数辨识就像给电机做体检——不查不知道,查完才发现这货藏着这么多小秘密。今天咱们直接上硬菜,聊聊怎么用DSP2803x系列芯片扒开永磁同步电机的"底裤"。
初始位置检测:别让转子躲猫猫
给电机上电第一件事就是逮住转子的初始位置。这里有个骚操作:往定子绕组里注入高频旋转电压信号。当转子磁极靠近某个绕组时,电感值会微妙变化,这时候ADC就该上场抓包了。
// DSP28035高频注入处理片段 #pragma CODE_SECTION(HighFreq_Injection, "ramfuncs"); void HighFreq_Injection(void) { // 生成6组PWM波形成旋转矢量 EPwm1Regs.CMPA.half.CMPA = 500; // 50%占空比 EPwm2Regs.CMPA.half.CMPA = 500; EPwm3Regs.CMPA.half.CMPA = 500; // 同步触发ADC采样 AdcRegs.ADCSOCFRC1.bit.SOC0 = 1; // 强制触发SOC0 while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0); // 等采样完成 // 拿电流响应做文章 float I_alpha = AdcResult.ADCRESULT0*0.00024414 - 1.5; // 12位ADC转换 float I_beta = AdcResult.ADCRESULT1*0.00024414 - 1.5; // 后续FFT处理省略... }这段代码的精髓在ADC采样时机——必须卡在PWM波形的中间点,避开开关噪声。那个while循环看着有点憨,但在20kHz中断里完全hold得住。
编码器零点校准:找北行动
实验室里校准编码器零点就像玩"听声辨位"——慢慢转动转子,监控反电势过零点。实战中得注意这个坑:当电流环没调好时,强行转动可能会让电机变震动棒。
!编码器校准波形 // 此处应有示波器截图:绿色是编码器Z信号,黄色是反电势波形
电阻电感辨识:暴力拆解法
定子电阻辨识最简单粗暴——直接给绕组通直流。注意别烧电机,电流控制在额定值的1/10左右。DSP的PWM模块这时候要切到手推车模式:
void Stator_Resistance_Test(void) { EPwm1Regs.CMPA.half.CMPA = 800; // 固定占空比 EPwm2Regs.CMPA.half.CMPA = 0; EPwm3Regs.CMPA.half.CMPA = 0; DELAY_US(100000); // 维持100ms让温度稳定 float voltage = Vdc * 0.8; // 母线电压*占空比 float current = (AdcResult.ADCRESULT0*0.00024414 - 1.5)/0.1; // 0.1是采样电阻 Rs = voltage / current; // 欧姆定律搞定 }这段代码里的DELAY_US可不是摸鱼——等温度稳定才能测准电阻。有个骚操作是在PWM输出后偷偷切到IO口强推低电平,防止MOS管发烫。
反电势常数:空载飙车法
让电机自由旋转到额定转速,这时候反电势和转速成正比。注意别用带Hall的模式,要让电机彻底放飞自我:
// 反电势常数计算代码片段 float Ke_Calc(float speed_rpm) { float omega = speed_rpm * 0.10472; // rpm转rad/s float Vpeak = Vdc * 0.5; // 中性点电压 return Vpeak / omega; // 反电势常数 }这个计算简单得令人发指,但实操中得注意滤波——反电势里的PWM噪声能让你测出玄学数值。
硬件设计血泪史
原理图里这三个地方千万别省:
- 电流采样运放的TVS管(被ESD教做人过)
- 编码器接口的磁隔离(烧过两片DSP后的领悟)
- 栅极驱动的死区硬件保护(MOS管放炮后的觉悟)
PCB布局要死磕这三点:
- 功率地和信号地分得清清楚楚
- ADC采样走线要像保护初恋一样远离开关噪声
- 晶振周围铺铜?不存在的,留出禁布区才靠谱
BOM表里最肉疼的是电流传感器,后来发现用采样电阻+仪表放大器也能凑合,省下的钱够撸一个月串了。
调试翻车现场
曾经把编码器方向搞反,电机启动瞬间跳起了霹雳舞;某次参数辨识时忘关PID,电机直接变身电钻...这些血泪史都记在代码注释里了:
// !!重要!!方向标志位必须与机械安装一致 // 2022.3.15 因DIR_FLAG设置错误导致电机反转撞限位开关 #define ENCODER_DIR_FLAG 0 // 0-正方向 1-反方向完整代码包已整理好,包含自动极对数识别、温度补偿等骚操作。拿去吧你,记得改改ADC校准值就行——毕竟每块板子的运放都有它的小脾气。