低分辨率编码器位置估测算法
novakon2015/09/01电气电工 IP:江西
对电机进行矢量控制,最重要的环节之一就是获取转子瞬时角度,并以此为依据,保持定子磁场与转子磁场垂直,以最小电流输出最大力矩。转子位置信息的分辨率越高,定子与转子磁场相互垂直的关系就能维持的越好,在总功率恒定的条件下转矩波动也就越小。减少转矩波动可以减少电机的工作噪音、降低振动。

从上面的描述出发,举几个极端的例子:
1)电动车轮毂电机
位置反馈采用三相霍尔元件,转子磁场每旋转一周期,只产生6个脉冲,分辨率为60度。
2)四轴无刷电调
便宜的电调通常采用定子绕组反电动势法判断转子相位,同上,分辨率为60度。由于四轴电机惯量小,功率大,因此转矩波动导致的机架振动非常严重。
3)淘宝上面50元以内的旋转编码器
分辨率在400线以下,直接应用到矢量控制系统中,极低速运转时会发出人耳可闻的噪音。

为了实现“低成本,高性能”这一爱好者永恒追求的目标,需要使用一些特别的算法,处理低分辨率编码器输出的脉冲信号,使之在一定条件下获得接近于高分辨率编码器的性能。

在翻阅大量国内外论文之后,发现论文里描述的各种估测算法要么过于高深,不易理解,要么实现过程过于复杂,不适合推广应用。因此写了这篇帖子,尝试用高中数学知识,来完成这一任务。

QQ截图20150901155109.jpg


上面这张图中的绿线,描述的是一个正在加速旋转的电机,其转子位置随时间的变化趋势。
粉红色线代表编码器输出脉冲的边沿,每两个边沿之间相等的距离,代表相等的位置间隔:Xn = Xn-1 = Xn-2。
深蓝色线代表这些脉冲到来的时刻,随着速度的增加,这些时刻之间的距离,也就是每个脉冲的持续时间(Tn, Tn-1, Tn-2),越来越短。
橙色线表示当前时刻。
Δt表示当前时刻与上一个脉冲边沿之间的时间。
ΔX表示转子当前位置与上一个脉冲边沿所代表的位置之间的距离。

如果我们仅仅将编码器输出的脉冲进行累加,作为位置输出,就会得到图中浅蓝色的折线。这条折线(浅蓝)和电机的实际位置(深绿)之间,有一个量化误差,在低速时这个误差信号的频率也会降低,从而产生抖动和可听见的噪音。电动自行车加速的时候发出的噪音,就属于这一种,这是因为霍尔传感器分辨率是60度,转子每转过60度磁角度,才产生一次位置信息更新,电流才改变一次,故而转矩是波动的,产生的噪音频率随车速增加而增加。当然,现在市面上也有纯正弦波的无刷电机驱动器,它们所使用的位置估测算法,与本文所述方法基本上大同小异。

总之,需要利用已知的Xn、Xn-1和Tn、Tn-1等信息,根据当前的Δt,估算出ΔX,使之与电机实际位置尽量吻合。

(管理员:无法使用全角delta符号,会被系统吃掉,变成问号。
?X
ΔX
来自:电气工程 / 电气电工
9
 
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
9年5个月前 IP:江西
788590
要进行估测,一定要作出一些假设。这就好比,要计算两辆火车相向而行从相遇到离开的时间,你必须假设它们是匀速行驶的,而且互不干扰……如果没有这些假设的前提,就无法进行估算。

假设电机,以及/或者与电机相连的机械结构,惯量很大。这样,便可以假设任意时刻其加速度接近于0,速度基本不变。

设速度不变,因为速度是距离和时间的比值,可以得到以下公式:
ΔX / Δt = Xn / Tn
ΔX = Δt * Xn / Tn

这真是太简单了!
前提是,上一时刻和这一时刻的速度基本不变。假如加速度为0,这个算法就是合适的;假如加速度是一个不可忽略的值,这个算法就会产生误差。

QQ截图20150901162604.jpg


上图:
天蓝色为一条斜率不变的直线,代表假设速度不变。
由于电机正在加速,蓝线和绿线产生了分歧,在t时刻,电机的实际位置(红线)比算法估测的位置(米黄色线)要更远一些。但如果在两个脉冲边沿之间电机速度变化不大,这个估测还是相当准确的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
9年5个月前 修改于 9年5个月前 IP:江西
788604
上面的方法,其实就是用一条直线,将当前时间之前的两个采样点连起来,然后将这条直线向后延伸到当前时间,得出当前的位置。换句话讲,我们通过将两个解代入一个匀速直线运动方程(X=kT+b),求得方程的系数,并将当前时刻带入求解出的方程,得出当前位移。

因为匀速直线运动的方程是一次的,求系数只需要两个解,因此只需要Tn,Xn两个测量值。但是,电机总是要加减速的,所以如果只用匀速直线运动方程来描述,在加减速的过程中就会出现之前所说的误差。因此,下面我们把运动方程改为匀加速直线运动。这就需要假定,相邻时刻之间加速度的变化很小,可以忽略。

根据高中物理的知识,设加速度a不变,位移可以写作:
x = 1/2aT平方 + bT + c,其中 b为初始速度,c为初始位移。这是一个二次方程,需要三个解才可以算出系数,因此需要Tn, Tn-1, Xn, Xn-1四个测量值。有的同学可能会问,为什么Xn和Xn-1都需要测量,它们不是相等且已知的吗?好吧,电机在正转的时候,Xn是正的,反转的时候Xn就是负的,因此Xn和Xn-1的绝对值是固定的,但符号不一定相同。而且,在电机转速过0的时候,Xn有可能为0(两次经过同一个编码器信号边沿)。

先去吃饭,有空再写。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
9年5个月前 IP:北京
788886
线性插值
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷仙
9年5个月前 IP:湖北
789137
用matlab建模后进行多项式拟合效果会不会更好呢?[s::lol]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
9年4个月前 IP:江西
790509
QQ截图20150916231903.jpg


如图,记录最近的3个脉冲边沿及其发生时间。如果令距当前时间最近的一个脉冲边沿为(0,0),则再之前为(-Tn, -Xn),再之前为(-Tn - Tn-1, -2Xn)。由于Tn,Tn-1,Xn均为可变的量,因此不便于用它们直接描述公式。因此,可设x1 = -Tn, y1 = -Xn ...,则距当前时间最近的一个脉冲边沿为(0,0),再之前为(x1,y1),再之前为(x2,y2)。如果一条一元二次方程f(x)=ax^2+bx+c经过这三个点,则可用下面方法求出其三个系数:

denom = x1 * x2 * (x1 - x2)
A = (x2 * y1 - x1 * y2) / denom
B = (x1^2 * y2 - x2^2 * y1) / denom
C = 0


上面这段代码,是从网上截取的一段代码化简而成的。原代码为:

denom = (x1 - x2)(x1 - x3)(x2 - x3)
A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom
B = (x3^2 * (y1 - y2) + x2^2 * (y3 - y1) + x1^2 * (y2 - y3)) / denom
C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom
这是求【通过平面内3个点的抛物线的系数】的公式,将其中的x3和y3替换为0即可。


获得系数之后,将Δt代入f(x)=ax^2+bx+c中,即可求出估测的ΔX.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷仙
9年4个月前 IP:湖北
790598
多项式拟合[s::lol]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
万事通
9年4个月前 IP:浙江
790618
么拜了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
3DA502
9年4个月前 IP:北京
790902
FOC都是测量电流来定位转子的

今年的电机话题真火
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8386
学术分
16
2008/03/29注册,2年11个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}