赞
踩
编者:沉尸 (5912129@qq.com)
FOC流程图 Circle_Limitation所在位置
图1
图2
现在计算出了和,需要限制:
如果
显然需要一个缩小的系数i (i < 1)进行校正
这个开根号的计算对于一般单片机来说,运算还是很耗时的,所以这里要采取牺牲精度的快速查表计算方式。
下面的内容结合ST的电机库5.4.4中的源码进行说明
结合上图2中所示
S16_MAX = 32767 (S16_MAX是16位有符号数之最大值)
我们选取的“MAX_MODULE”的值不会直接让它等于S16_MAX,留一点余量,比如取99%或者98%等等。
M = 32767 * 99% = 32439.33
这里选择 32439,源代码“Inc\parameters_conversion.h”中也是如此定义:
下面开始推导表格中的缩小因子。以index=62区间段为例进行计算:
取区间段中的最大值:63*0x1000000-1,最大值的缩小程度最“狠”,每个区间当然是选择最“狠”的那个了。
根据上面的式子1-1,计算出来的缩放因子是一个小于1的小数,在计算机中不好存放,实际应用中将它放大32768倍,于是公式1-1变形为
当index = 62时
归纳为:
上面表格中的数据明显和源代码中的数据表格不符合
图5
经过推导分析,源代码中表格有错,应该修改表格为我们推导出来的数据表格。
那么源代码中的表格是怎么来的呢?根据我的分析最后发现应该将源代码中定义修改为:
图6
后,才能将源代码中的定义和表格相匹配!也就是源代码表格采用的是大概98%的MAX_MODULE值。
32121/32767=98.03%
同时针对图6中的这个定义,我用Execl表格也推导了一份
瞧!这个表格中的数据和源代码中的表格吻合到完美无缺!
所以,ST马达库5.4.4中的代码有个小Bug(影响不大),订正时,要么修改表格,要么修改#define定义值,本篇文章主要是探索一下这些定义的表格数据是咋来的而已!
备注: Execl表格中数据的计算公式为(假设放在C栏,B栏放61,62,...):
以C5为例(C4放着62):
=SQRT(32439*32439/(((C4+1)*16777216)-1))*32768
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。