电机控制死区补偿模块资料:原理与目标
电机控制死区补偿模块资料 原理由于逆变器自身的非线性及IGBT等功率管的TonToff等参数是随着电流大小变化的需要首先测量不同电流下实际的死区时间然后根据当前运行工况下的三相电流根据电流进行查表计算出合适的死区补偿时间进而将三相的补偿值累加到三相电压指令上 目标实现死区补偿的目的减小逆变器死区和非线性带来的电压基波损失和谐波含量改善电流控制的效果玩过电机控制的兄弟都知道死区补偿这玩意儿简直就是逆变器工程师的必修课。当年我第一次调死区补偿的时候那电流波形抖得跟心电图似的现在想起来都头皮发麻。咱们今天就来扒一扒这个模块的底裤看看怎么用代码把死区这孙子收拾服帖。先上硬菜——直接看补偿算法的核心逻辑。下面这段C代码就是典型的查表补偿实现// 死区补偿查表结构体 typedef struct { float current_level[256]; // 电流档位表 float comp_time[256]; // 对应补偿时间 int table_size; // 实际有效表项 } DeadTimeTable; // 实时补偿计算函数 void DeadTimeCompensation(float* i_abc, float* v_ref_abc) { static DeadTimeTable dt_table; for(int phase0; phase3; phase) { // 根据电流幅值查表 float abs_i fabs(i_abc[phase]); int index BinarySearch(dt_table.current_level, abs_i); // 获取补偿时间 float comp_val dt_table.comp_time[index]; // 判断电流极性 int sign (i_abc[phase] 0) ? 1 : -1; // 相位补偿方向处理 switch(phase) { case 0: // A相 v_ref_abc[phase] sign * comp_val; break; case 1: // B相 v_ref_abc[phase] - sign * comp_val; break; case 2: // C相 v_ref_abc[phase] (sign * comp_val) * 0.5f; break; } } }这段代码有几个骚操作值得注意首先用二分查找快速定位电流对应的补偿值比遍历查表快得多其次各相补偿方向的处理暗藏玄机特别是C相那个0.5系数这可不是随便写的——实测发现中点电位偏移时这个系数能有效平衡三相补偿量。电机控制死区补偿模块资料 原理由于逆变器自身的非线性及IGBT等功率管的TonToff等参数是随着电流大小变化的需要首先测量不同电流下实际的死区时间然后根据当前运行工况下的三相电流根据电流进行查表计算出合适的死区补偿时间进而将三相的补偿值累加到三相电压指令上 目标实现死区补偿的目的减小逆变器死区和非线性带来的电压基波损失和谐波含量改善电流控制的效果搞补偿表才是真功夫。建议用自动化测试平台采集数据比如下面这种Python脚本控制测试流程import numpy as np from power_analyzer import PAX1000 # 假设的功率分析仪驱动 def build_comp_table(): current_steps np.linspace(0, 100, 256) # 0-100A分256档 comp_table [] with PAX1000(/dev/ttyUSB0) as pa: for i in current_steps: pa.set_load_current(i) raw_dt pa.measure_deadtime() comp_val raw_dt * (1 0.02*i) # 电流越大补偿斜率越大 comp_table.append( (i, comp_val) ) return comp_table这个建表脚本的精华在于补偿量不是简单取测量值而是加了随电流变化的系数。实测发现IGBT的开关时间随电流增大呈现非线性增长这个0.02的系数就是针对某型号IGBT的实测经验值。最后说说怎么把补偿值怼到PWM里。看这个DSP中断服务程序片段interrupt void PWM_ISR(void) { // 读取电流采样 AdcResult adc ReadADC(); // Clark变换得到三相电流 float i_abc[3] { adc.ia, (-adc.ia 2*adc.ib)/1.732f, (-adc.ia - adc.ib)/1.732f }; // 执行死区补偿 DeadTimeCompensation(i_abc, gVrefABC); // 更新PWM比较值 PWM1_CMPA (uint16_t)(gVrefABC[0] * PWM_SCALE); PWM1_CMPB (uint16_t)(gVrefABC[1] * PWM_SCALE); PWM1_CMPC (uint16_t)(gVrefABC[2] * PWM_SCALE); // 清中断标志 PWM1_INTClr(); }这里有个坑爹的细节ADC采样时刻必须避开PWM开关瞬间否则采到的电流毛刺会让你怀疑人生。建议在中断开头先采样补偿计算完成后再更新PWM值这样能留出足够的处理时间。调完这些代码后用示波器抓母线电流波形能看到THD从原来的8%降到3%左右电机低速时的扭矩脉动也明显改善。不过要注意补偿表得定期用功率分析仪校准特别是IGBT老化后特性会漂移别指望一表永流传。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2481142.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!