站点信息
文章数目:
62 篇
最近动态:
今天
上线时间:
245天
当前版本:
v1.0.0
VESC学习之FOC有感整定代码
分类:
日期:2025-05-11 22:37:13
- 探究这部分代码的原因, 一方面是我迟早要学到这一部分, 另一方面是目前25届机器人队使用VESC过程中出现了从没遇到的bug, 我想替他们研究一下原因.
代码位置
- 首先想到先去VESC tool里查看有感整定的官方名称, 这一步叫做
encoder detect
:

- 然后在各个重要文件中搜索
detect
, 直接在mcpwm_foc.c
中找到相关函数:

代码执行流程(配合整定时编码器位置图像来解释)
第一步 初始准备
- 首先禁止所有其它命令来控制电机, 读取电机参数指针, 允许手动修改相位(电角度), 方便控制电机旋转, 临时将旧的电机参数(
offset
, inverted
, ratio
)保存, 所有新数据都直接存在现有的电机参数中.

- 对于ABI编码器, 首先旋转多圈来找到index(一般用不到).

关于整定电流
- 缓慢正向旋转到最近的电角度为0的位置, 对应整定图像一开始比较长的一段正向旋转, 以及一段1s的延时.
- 缓慢旋转采取每隔1ms, 按照固定步长手动步进相位(电角度)的方法, 猜测可能这一段是纯开环过程, 将目标电角度设置为与当前电角度相乘很小的值, 定子会瞬时产生一个固定方向的磁场, 然后转子由于对齐磁场的趋势, 就会自行旋转过去.
- 旋转缓慢是为了防止超调, 而且合适的整定电流能保证产生足够强的磁场, 进而产生足够的力矩让转子跟随磁场.
- 过小的整定电流可能导致转子不能及时跟随, 等到转子磁场与定子磁场相位偏差过大, 电磁力矩足以克服阻力让转子旋转时, 转子会一次性旋转较大的角度, 导致转动惯量比较大; 当转子磁场位置追上定子磁场位置时, 可能会超调.
- 在接下来的整定过程中, 由于整定电流不足导致整个过程反复抖动, 可能进一步导致整定结果不准确


第二步 求ratio, 以及inverted
概念
ratio
: 电角度与编码器角度变化(电机机械角度)的比值
inverted
: 电机与编码器相位增量方向是否一致, 一致则为false, 不一致则为true
执行步骤
- 先正转若干次, 每次电角度步进2/3PI, 直到编码器显示大约转过一圈, 然结束正转


- 与正转一样的逻辑, 但是执行反转

- 计算
diff
, 计算inverted
和ratio
- 根据的是旋转时电机与编码器相位增量的绝对误差比值.
- 记录误差时, 由于相位会产生跳变, 例如从PI到-PI. 所以将每一步旋转得到的相位误差, 映射到单位圆上, 得到一个单位向量, 若相位误差是
α
, 则向量可以用(cosα, sinα)
来表示. sin和cos都是连续函数, 可以解决跳变的问题.
- 变量s_sum和c_sum是将正弦值和余弦值累计的变量, 表示的是向量的合成. 可以想象因为每次相位误差基本相同, 产生的单位向量也基本相同, 叠加在一起就是大致相同的向量朝一个方向延伸. 这种延伸也能起到平均, 减小误差的作用.

- 这种相位差转化为连续的向量并且合成的思想, 接下来还会用到.

第三步 计算offset
概念
offset
是编码器机械角度和电机电角度之间存在的一个固定偏差, 有这个offset
, 才能知道编码器角度和电机电角度的完整对应关系, 才能将编码器角度用于FOC计算.
执行步骤
- 将电机电角度旋转归回到0

- 正向旋转
ratio * 3
次, 每次2/3PI, 总计旋转机械角度的一圈. 每次记录编码器角度与电角度差值(使用as5047
时, 实际是机械角度与电角度差值). 将角度差值转化为向量进行叠加, 与之前的思路是一样的.

期间相位步进比较平缓, 而且中间有100ms延时, 所以造成如下的阶梯型图像

- 与正向旋转一样, 反向旋转一圈, 记录的
diff
是反向的

- 利用s_sum和c_sum计算offset, 关于为何这样能计算出offset, 我有论证如下:

理解起来很费劲, 但是总归是理解了.