赞
踩
编者:沉尸 (5912129@qq.com)
问题:
带旋编的电机(不是绝对位置旋编),ST电机库是怎么对齐的呢?也就是说如何确定初始电角度的问题。
我们基于“D:\motorCtr\code\stm32f407IG\FOC\FOC_YHF4_PMSM_Encoder_SpdCtr”项目进行讲解。本项目采用野火的407骄阳控制板+野火的直流无刷驱动板+野火PMSM电机
图2
上面三个参数定义在文件中的作用位置:
图3
注释里面说的很好:
图4
我们来推导一下:
Av是放大倍数, Av = 8
Rs = 0.02
ADC的参考电压是3.3v,ADC出来的值左移过4位,最大值为0xFFF0,按照65535算
这里为什么不考虑1.24V ?其实这个1.24V是中间电位,在获取电流时都会把它减去的,所以不影响。
图6
现在继续看对齐相关代码:
图7
对齐控制要靠变量“EncAlignCtrlM1”起作用,这里将变量“VirtualSpeedSensorM1”以及另外两个都挂在“EncAlignCtrlM1上:
重点看下面几个状态机:
图9
代码中添加了一个“虚拟速度传感器”
图10
但是,这两个数据结构的“_Super”却都是同样类型:
图11
再看针对它的调用:
图12
对齐过程中不断调整力矩(力矩是一个逐渐增大的过程)
图13
图14
状态机控制的调用函数名为“TSK_MediumFrequencyTaskM1”,这里为500Hz的调用频率,而力矩的精细控制是在“TSK_HighFrequencyTask”中:
图15
看图中提出的问题:对齐的时候,采用了虚拟速度传感器,这里计算角度却是针对“ENCODER_M1”,为什么呢?
其实我们初始化时将“VirtualSpeedSensorM1. _Super. hElAngle”设置成了固定角度,比如本项目中为90度。
具体代码体现:
图16
在上图中代码,函数“EAC_StartAlignment()”中执行“VSS_SetMecAngle()”后,“VirtualSpeedSensorM1. _Super. hElAngle”中的值就是90度了(s16单位)
图17
图17中代码,用来进行计算的电角度实际上是从“VirtualSpeedSensorM1. _Super. hElAngle”中获取,而图16中已经展示了这个值实际上就是一个固定的值:90度,这个90度也就是图1中,在代码生成器中设定的值。
总结:
控制对齐的策略就是一直用设定的角度进行计算,比如90度,其结果类似于一直针对90度施加力矩,经过规定的时间(比如本项目中为700ms)后,就认为对齐结束了。当然,施加力矩的过程,其大小是一个线性从小变大的过程。
在对齐过程中,在函数 “TSK_HighFrequencyTask()”中调用“ENC_CalcAngle()”基本没啥作用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。