大家好,我是无际。
今天分享一个热心老铁的投稿,主要是分享基于脉冲法(IPD)实现转子初始定位,都是实用型干货,能给做电机驱动的避开很多坑。
他一直在芯片公司工作,技术杠杠的。
更重要的是,乐于分享的精神实属让我敬佩。
中间我一直问他有没有什么条件,比如说文章打赏全部归他所有,他一律拒绝。
他说了一句话让我很感动:只为帮助更多人!
Ok,废话不多说,下面直接上干货。
一、原理介绍
1.现有方法
由于转子的初始位置是随机的,而且矢量控制对于转子的位置要求很高,所以初始位置的检测精度会影响伺服电机的启动效果。
我们现有的的检测方法是基于HALL传感器将初始位置划分成了六个区间,整个电区间是0—2880。
因为我们现有代码的电角度查表法用了720的精度去表示90度电角度。
在电机上电的一瞬间读取HALL传感器的值,将hall折算成电角度。
2.改进方法
IPD脉冲注入的原理是假定代码里面转子出于某一个位置(0–360均可)。
一般为了方便选取0度作为初始位置,基于代码里面假定的初始位置建立一个dq坐标系。
在此坐标系下将整个(0–360)电区间划分成N分,如下图
每个独立的电区间打出等赋值的脉冲然后采集ABC相电流或者IBus母线电流。
假定没有转子的影响,每个相的电流反馈应该是相等的。
由于转子的磁效应对于电流变化率是有影响的,和S极方向相同方向的电流变化率越大,和N极相通的方向电流的变化率越小。
所以找出电流变化率最大的脉冲对应的电角度(注意叠加上代码假定的初始角度)就是转子的初始位置。
在此基础上还要做抖动补偿,因为脉冲虽然是对角发出去的,但是转子依旧会有小幅度的抖动。
所以利用增量式光电编码器的数值可以在转子初始位置的基础上做进一步的补偿。
脉冲大小:
每个区间电压的幅度Vd保持一致,持续时间也要保持一致(电压越大每个区间的电流采样差异越大越容易辨识处转子的位置,过大会导致转子动作过大,或者触发过流保护)
脉冲方向:
发出脉冲的时候要注意是对角脉冲,这样做是为了防止转子发生意外转动造成位置变化导致的识别不准确,图中1代表第一个脉冲,图中2 代表第二个脉冲,电角度相差180度,以此类推其他区间也是一样。
电流采集(最重要):
由于硬件版本的不同可以分成一下几种方式
①母线电流检测
硬件可以从母线电流传感器采集母线电流(加入硬件低通滤波,去除高频率干扰),找出最大的一项就是转子的位置。
②Id电流检测
在ABC三相电流检测准确的基础上计算出d轴方向的电流反馈,找出最大的一项就是转子的位置。
③两项坐标系总电流检测(现有方案)
由于我们的硬件目前不支持母线电流传感器采集母线电流,所以在ABC三相电流检测的基础上计算出两项坐标系总电流检测,找出最大的一项就是转子的位置。
之所以选择此方案是因为这个方案的辨识度最高,如果硬件支持母线电流检测最好,不支持亦可以用此方法,切记相电流检测不要加滤波,相电流检测不要加滤波,相电流检测不要加滤波。
下图是电流采样图形(三个电周期)
下图是A相电流示波器波形(为了便于观察电角度是连续发的)
下图是母线电流示波器波形
二、代码分析以及调试
在原来的状态机的基础上增加了条件编译选项兼容带hall的功能,下面主要分析不带HALL的功能
1.脉冲发出
在主中断里面实现:
第一阶段:Vd=ELE_ANGLE_STAGE_SENSELESS_CURRENT Vd等于给定数值,持续时间ELE_ANGLE_STAGE_SENSELESS_CURRENT_DURATION
第二阶段:ELE_ANGLE_STAGE_SENSELESS_CURRENT_DURATION后Vd清零,同时立马软件强制触发ADC采样采集ABC电流数据
第三阶段:在Vd清零后的下一个中断依次存储A相电流,C相电流,Id电流,两相坐标系总电流,以及和各个电流数据一一对应的电角度。
第四阶段:留出足够的空余时间在Vd电压清零之后让相电流清零,防止上一个脉冲发出的电压干扰到下一个脉冲(这样会导致两相坐标系总电流计算不准确,进而导致转子定位小概率不准确),然后电角度更新,换下一个脉冲轮回直到所有的脉冲发送完毕。
第五阶段:找出G_Etheta_Adc_Result3( 两项坐标系总电流数据包)中最大的电流,然后用对应的index查找G_Etheta_Angle_Result就可以获取转子的初始位置。如下图
第六阶段:
转子位置反相处理:经过检查原有的代码的dq坐标系的建立与假定刚好相反所以转子位置做反相处理。
高级定时器:占空比设置成百分之五十。
环路参数清零:防止乱发波(位置环,速度环,电流环参数清零)
第一次位置同步:将g_Etheta_Offset(转子初始位置电角度)同步给电角度查表变量g_Etheta,然后折算成相应的机械角度同步给位置环反馈变量以及增量式光电编码器检测变量做机械角度同步。
第二次位置同步:在闭环状态机里面同步,目的是补偿脉冲造成的转子位置的变动,进一步提高转子精度,把位置的反馈给位置环的参考防止电机切闭环的时候乱动,延时2s等待稳定下来切闭环就可以直接跑FOC的位置模式。
2.调试说明
第一步:锁定转子位置不动看看是否每次识别出的转子角度是一样的。
第二步:任意改变转子位置,看看每次识别出的转子位置是否发生改变。
第三步:使用分辨率高德示波器观察相电流是否互相干扰,因为算法是假定独立脉冲产生的电流来寻相。
如果互相干扰会导致小概率启动失败,调试的时候可以观察仿真数据和母线电流(示波器数据)的高低变化是否一致,如下图。
经过对比计算出的两项坐标系数据的大小和示波器完全一致。
注意:如果不一致可以改变adc采样保持大小,黄色的电流的尖峰处就是adc触发采样的时刻,经过闭环位置的随机测试100次,每次都可以位置闭环启动成功,说明算法可行。
三、算法优化方向
现有的代码是六脉冲,定位精度和HALL一样,可以加到12脉冲或者18脉冲提高精度,不过现有的六脉冲已经可以定位成功,所以12脉冲或者18脉冲未测试。
四、适配新的电机
需要调整发出脉冲的Vd的大小,以及电流的归零时间,因为每个电机的电感不一样,所以换电机的时候需要做标定,调试方法上面已经说明,不在赘述