赞
踩
编者:沉尸 (5912129@qq.com)
一)ST马达库中角度的定义
引言:
在Clerke以及park等变换中,我们都涉及到了角度,本文中我们结合ST的源代码探讨一下角度的取得以及它和力矩的关系问题。
首先回顾《马达控制之FOC原理》一文中的的数学模型
https://blog.csdn.net/danger/article/details/128214441
三相电流中Ia达到幅值的最高峰时,它的反电动势也就是最大值,于是:电机A相的反电动势最高点就是电角度的0度
在实际运行中进行测量反电动势然后判断是否到达最大值,而且ADC采样还存在不稳定性,所以几乎是不可能完成的任务,本文建立在系统采用了Hall传感器,所以我们可以在实验环境下提前测试出Hall中H1和A相反电动势之间的角度差,而在软件运行过程中可以检测到Hall的IO口线跳变中断,于是,在每次Hall跳变中就可以进行电角度的“校准”了。注意这里说的是“校准”!在两个Hall状态变化的中间过程中,角度的计算是依靠目前的“电角度速度”和“经过的时间”进行估算的,直到遇到了一次Hall相变,于是就可以“校准”电角度了。
ST源代码定义:电机Hall A的上升沿到电机A相反电动势最高点的延迟角度为同步电角度
换一种说法: “从电机A相反电动势最高点”再经过同步电角度就会遇到“电机Hall A的上升沿”
下面节选文档“电机控制同步电角度测试说明.pdf”中部分内容
上图中如果周期为T, 那么同步电角度就是:(T-delay) * 360 / T
再贴出文档“电机控制同步电角度测试说明.pdf”中一个计算电角度的例子:
野火BLDC电机在workbench中的配置:
生成的ST马达库源代码对应的设置部分:
因为Hall的三个传感器每个跳变时,角度都相差60度,于是在每种Hall状态机的跳变都可以进行校准电角度了
下面剖析一下源代码
可以画出对应的Hall时序图:
运行过程中Hall传感器是贴在定子上的保持不动的,显然图中的Hall波形是转子逆时针旋转时输出的波形。
分析源代码:
图9
对于源代码行“Line 551”和“Line 555”中设置的方向,正方向“POSITIVE”就对应上图模型中的逆时针方向了,因为对应着:
“状态4” ==> “状态5”
源代码中“Line 552”和“Line 556”设置角度,看下面的图示
于是可知:
表格1中仅仅列出2行,后面就不再列出,对着图10,后面的就自然很容易写出来,然后分析源代码就很简单了!
我们上面所述都是在中断中(Hall状态机的变化时刻)进行电角度的校正,而在任意时刻,进行FOC计算的时候,目前的电角度需要通过当前的平均电角度速度和经过的时间间隙相乘获得,具体参看源代码,比较容易理解,这里不再赘述,也许后续我会单独写一篇小文章详细描述一下这段源代码。
二)两种q-d轴数学模型的比较
park变换中q-d轴的数学模型目前有两种,《马达控制之FOC原理.docx》中公式的推导采用的是如下图11,而ST马达库中采用的是图12
三)ST马达库中电角度的计算(Hall传感器)
3.1)注意程序中的两个变量的功能
pHandle->MeasuredElAngle 测量电角度
是真正的标杆角度, 每次Hall边沿触发都会准确地"校准"它,然后在执行频率=16KHz的FOC运算之前、在函数“HALL_CalcElAngle()”中根据平均速度来累加修正它;
pHandle->_Super.hElAngle 实时电角度
进行系列公式运算(Clerke、park等)时的角度,这个角度要永远跟随着“pHandle->MeasuredElAngle”,每次计算平均速度时(函数:HALL_CalcAvrgMecSpeedUnit(),调用频率=500Hz),都要计算出“pHandle->MeasuredElAngle”和“pHandle->_Super.hElAngle”之间的偏差,然后在函数“HALL_CalcElAngle()”中一步一步、平滑地将这个值进行补偿,最后让角度“pHandle->_Super.hElAngle”跟上“pHandle->MeasuredElAngle”。
pHandle->_Super.hElSpeedDpp
两次FOC运算间隔的时间段内(1/16K),转动的角度值,以s16degree表示
3.2)如果有偏差,为什么不让“pHandle->_Super.hElAngle” 直接一步跟上“pHandle->MeasuredElAngle”?
因为程序需要让合成的矢量的圆周运动保持尽量平滑转动,一步跟上的话,矢量圆的转动角度就不那么平滑了!
3.3)几个函数
3.3.1)HALL_CalcElAngle()
这个函数用来更新“测量角度”和“实时电角度”:
3.3.2) HALL_CalcAvrgMecSpeedUnit()
计算出平均电角速度,也就是两次FOC运算间隔的时间段内(1/16K),转动的角度值,以s16degree表示
这里贴出做了详细注解的代码:
3.3.3)HALL_TIMx_CC_IRQHandler()
Hall信号捕获中断的处理
3.3.4)运算中用到了变量“pHandle->PseudoFreqConv”和“pHandle->PWMNbrPSamplingFreq”的推导
这两个变量的初始化:
详细的描述:
/*
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。