FOC及无感控制的算法移植指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FOC及无感控制的算法移植指南
1、下载正确的FOC源代码
目前市面上主流的能驱动电机的MCU。
基本上都带有FOC库。
很多公司还提供可以用于修改的FOC源代码。
还有些甚至于提供了无位置算法的源代码。
可以下载到代码的有ST,TI,MICROCHIP,NXP,RENESAS等芯片公司。
直接到官网下载即可。
为保证代码的可行性,最好从官网下载代码。
不要从第三方下载。
避免产生不必要的调试过程。
2、找到与芯片的硬件初始化相关的代码。
ADC部分的初始化。
不同的芯片,ADC工作模式不同。
ADC的初始化方法以及数据采样方法不同。
ADC的采样,根据电路结构不同。
完全不同。
单电阻采样模式。
需要在一个三角波内,进行两次ADC采样。
而且软件还要特殊处理。
才能做到采集的数据。
这种方式下。
ADC需要有一个专用的定时器配合来实现ADC采样。
两电阻或电流传感器方式下,ADC有两种模式可以实现。
一种是在波峰或波谷的前后一点位置处,触发ADC采样。
另一种方式,就是在定时器的波峰或波谷中断进入后,第一时间进行ADC采样。
ST的ARM芯片
CORTEX-M0系列,由于只有一组ADC单元,且ADC转换出来的结果只有一个缓冲区保证。
所以,数据采集通常采用DMA的方式。
将多个ADC采样到的数据缓存到一个ADC数组中。
如M3或M4等系列。
MCU有两组ADC单元。
可以一次性采样两个通道。
在波峰波谷中断的模式下,可以设成分时采样不同的通道。
也可以用DMA方式采样(ST的2个ADC 单元,输出结果地址是相连的。
且刚好组成了一个32位数,用DMA方式,可以一次将两个ADC单元的结果全部采样出来。
)
RENESAS等芯片,ADC的输出结果是根据通道来设定的缓冲。
因此,只需要触发ADC 即可。
ADC转换后的数据,分开存放在不同的寄存器当中。
所以,这类芯片,可以省掉DMA 的操作方法。
定时器部分
定时器根据电机的载频来设定。
生成三角波(递增计数到设定值以后,开始递减计数)。
需要处理的内容,分别是互补的死区设定、中断的方式(上溢中断、下溢中断、上/下溢中断)。
中断的频率(16K的PWM频率,可以设定8K的电流或4K的电流环。
利用中断次数控制来实现)。
编码器部分
不同的芯片,对于正交编码器的接口不同。
接到不同的IO引脚上。
然后选择正确的定时器资源来实现自动计数功能。
FO保护(自动刹车控制)
FO保护由IPM或IGBT驱动或单独设计的电路产生信号。
通过专用的保护引脚来实现MCU自动关闭PWM输出。
从而实现负载突然短路的情况下,快速关闭输出。
保护电路不受影响。
这个引脚,在很多芯片厂家,是有数字滤波参数可以设定。
用来避免突然出现的小尖锋干扰。
3、FOC代码部分
一般FOC代码函数分成:
ADC采样处理,采样电机的电流,可以采样IA,IB,IC。
也可以采样IA和IB(当然,采样IB和IC也可以,但需要计算一次得到。
根据IA+IB+IC=0的公式可以根据其中的任意两项电流,求出第三相的电流。
单电阻采样,也会生成IA和IB两组电流。
Clarke变换,将ADC采样到的三相电流合成两相电流。
生成I_alpha和I_beta两个电流。
Park变换,将alpha和beta两个电流与电相度通过三角函数的方式。
合成ID和IQ电流。
InvPark变换(反Park变换),将VD和VQ转换成Valpha和Vbeta.
InvClarke变换(反Clarke变换),将Valpha和Vbeta转换成三相电压值。
扇区计算,通过三相电压,计算出正确的扇区值。
PWM数据输出,根据扇区值和三相电压值,计算出三路PWM值。
4、调试技巧
1、确认硬件的接入正常
上电后,先对IA,IB,IC的输入AD进行监测。
看看零点状态的AD是否正常。
通常零点的AD都设在1/2的VCC附近。
以12位的ADC为例,这个零点的ADC是2048正负100以内。
然后,对母线电压的ADC进行监测。
特别是用到了无位置或母线电压补偿的算法。
对母线电压的准确性,要求比较高。
母线电压太低或太高,都将导致输出的不正常(严重时,电机都无法运转)。
最后,对于有位置传感器的硬件,旋转一下电机。
查看一下编码器的A/B/Z,U/V/W 输入信号是否正常。
2、确认IQ和ID的极性的正确。
注:为防止硬件受损。
程序做个最长时间的控制。
进入PWM输出以后,最长工作时间设0.5秒到1秒。
软件自动关闭输出。
将PID控制部分屏蔽掉。
给VD和VQ设一个固定值。
可以试着设定5V。
根据当前的母线电压。
5/母线电压*VDVQ的最大值。
例:母线是60V,VDVQ的最大值是32768,则设定VD=5/60*32768
先设VD=5V,VQ=0,用软件示波器查看,电流检测的IA,IB或IC,I_alpha、I_beta,ID、IQ。
正确的情况下,ID比IQ大很多,且IQ基本上趋于0,ID是正数的电流。
刚开始电机可能会转一下。
这是因为电机当前的角度不在0点附近。
这个时候,ID会出现变化。
但第二次以后,电机的停止位置处于0点附近。
很明显的看到ID电流是一个直线。
再设VQ=5V,VD=0,用软件示波器查看,可以看到IQ电流明显大于ID电流。
且ID基本上趋于0。
IQ电流是正数。
通过以上操作。
如果IQ和ID都是正常状态。
则表示电流检测的软件和硬件是正确的。
可以进入下一步操作。
调试过程中,如果IQ和ID出现了电流是负数。
有以下几种可能
A、电流检测的方向出错。
CurA = CurA_Offset - NowA或CurA = NowA - CurA_Offset
B、IA和IB的引脚对应错了。
C、PWM的方向可能有错。
三角波的PWM。
0RPM输出的时候,PWM输出并不是0,而是载频周期的一半。
以ST为例:PWM有两种模式。
PWM1和PWM2两种模式下的数值刚好是反的。
给PWM占空比赋值的时候,一种是直接把计算值输出。
另一种是用周期-计算值输出。
3、强拖运转测试及电流检测标幺值检测
当第一步完成以后,就要试着强拖一次。
看看电机是否能正常运转。
关键是针对有编码器的系统。
查看一下电机运转方向所显示出来的编码器的AB方向是否正确。
强拖测试,可以不需要任何传感器的介入。
也不需要关心电机的UVW动力线是否连接正确。
强拖的方法:首先,设一个固定大小的IQ数据,且初始的电角度为0。
如果电机是空载,那么这个电流可以设为1A左右。
这个电流下,持续1秒钟内,电角度始终为0,1秒钟以后,电流可以减少1/2,电角度按200RPM左右的速度增加。
200RPM是机械角度。
转换成电角度时,要乘以电机的极对数。
通常折算每MS增加多少个电角度,以200RPM为例:=200/60*360/1000*PP,其中PP为电机的极对数。
这样强拖10圈以上,就可以停止了。
电流检测标幺值正确性验证:最好用两个电流探头(如果只有一个探头,可能需要多强拖几次,保证所采样的电流是正确的。
最好把强拖关闭,只做定位),分别接到电机的动力线上。
查看软件设定的1A电流,与实际的1A是否符合。
如果不符合,则需要检查电流检测电路是否出问题或者放大倍数计算是否有误等。
强拖环节的另一个关键点是,编码器数据的方向。
如AB和UVW方向。
因为强拖是角度增加,假定这个方向为正转。
那么最好是AB是增加。
如果AB是减少。
有一个软件办法解决。
(NOW_AB ^= 0XFFFF,仅限于16位计数器),这样操作一下。
可以改变极性。
4、速度传感器的加入
采用增量式编码器的系统。
速度计算,有两种方法M和T。
分别是采样脉冲宽度(用于低速检测)和脉冲个数(中高速)。
简单的操作,直接采用T(计数)方法。
由于低速比较难统计到个数。
因此,速度采样通常设为2MS采样一次。
以200RPM且编码器为360线为例:=200/60*(360*4)/1000*2,则每2MS,AB变化9.6个。
速度计算采用AB个数*AB/1MS对应的速度。
1AB/(360*4)*1000*60=41.6666RPM,由于是2MS采样一次,所以AB/2MS=20.8333RPM,因为是小数,采用Q8格式以后=5333,若2MS内,变化AB个数为10个,=10*5333/256=208RPM
由于低速时,AB个数变化对速度的统计影响比较大。
因此,通常将速度计算分成高速和低速两种计算结果。
低速计算时,加入一级低通滤波。
这样得到的低速就会比较平滑一些。
做低速控制时,电机不容易抖动。
5、位置传感器的加入(扇区)
当系统加入了UVW扇区位置检测以后,可以使得电机启动时,直接在扇区内启动,无需再增加定零位了。
相当于已知当前的电角度,可以快速启动。
针对UVW扇区传感器,有两种操作方式。
一种是UVW传感器的安装位置与转子位置是完全固定的。
因此,任意互换电机后,角度是基本上一致的。
还有一种是UVW 传感器的安装与转子位置并非完全一致。
碰到这种情况,就需要将这个电机的UVW信息与电角度做配对操作。
实际上,无论是哪一种安装方式。
第一次使用FOC的时候,都有一个配对的过程。
这个过程,实际上也是利用强拖来完成。
以下方法,适用于带AB的系统操作。
强拖开始时,有个定位过程。
这个过程是强制电机运转到零位。
为了操作简单化,UVW的配对操作。
定位时,采用ID=设定。
IQ=0的方法。
这样的操作,是为了方便后续的电角度直接使用。
针对带AB的系统。
强拖定位时间完成时,将AB的当前计数清零。
将当前的UVW 信息存储起来。
强拖过程中,对UVW信息进行连续检测。
当检测到的UVW信息与存储起来的UVW 信息不同时,将当前的AB角度、扇区UVW信息存起来。
并更新UVW存储信息。
当连续检测到2个或以上的机械角度以后。
停止强拖。
开始统计信息。
统计时,
第一步将AB角度转换成电角度。
超过一圈电角度的,取电角度的模。
第二步将多组电角度进行求平均处理。
得到每个扇区所对应的电角度数据。
第三步将这些数据存储起来,写入FLASH或EEPROM中。
做为以后运转的计算用。
后续电机启动时,根据当前的扇区号。
取出当前扇区的数据和下一个扇区的数据,两者相加除2(程序要处理数据越界现象),得到中间角度值。
然后,以这个角度值,直接启动即可。
且要求在检测到下一个UVW信号沿的时候,更新一次角度(根据电机的运转方向,赋不同方向UVW所对应的电角度的边沿值)。
5、其它技巧
1、编码器AB个数的处理。
在使用编码器的AB计数时,可以利用数字溢出的原理来解决极性问题。
使用16位的寄存器全员值,0-65535,本次的计数减去上一次的计数,得到一个Delta_AB。
正转的时候,这个数字会是正向增加的。
用一个有符号的16位数据来处理这个数据,非常简单。
机械角度,旋转一圈以后,CPR*4,刚好是一圈的机械AB个数。
超过这个数据的时候,即进入下一圈的角度了。
机械角度也一直累加Delta_AB即可。
当超过CPR*4时,减去一个CPR*4即可。
当数据小于0时,加一个CPR*4即可。
2、Q格式
在计算过程中,经常会出现小数。
但便宜单片机往往不支持浮点运算。
因此。
必须使用Q格式来完成计算。
但Q格式在使用时,一定要注意。
Q格式运算是有损的。
Q格式的格式越大,计算的变量越大。
如果超过64位。
则很难参考计算。
所以,Q格式计算时,往往需要根据变量的有效范围,预先计算好Q格式的范围。
如果数据结果是16位,数据源在256以内,那么Q格式最大不能越过8,否则就会出现越界现象。
Q格式在数据计算时,因为精度有限,长时间累加的时候,容易出现数据慢慢丢失的现象。
精度要求高一的点的计算。
通常保留Q格式的小数部分。
下次计算时,把上一次的小数累加进来,以防止数据的丢失。
6、调试时保护机制
1、软件的保护:
ARM芯片,有个硬件错误的中断HardFault_Handler,进入这个中断以后,会死锁。
如果这个时候,PWM仍然在输出。
则会出现烧坏IGBT的情况。
所以,进入这个中断以后,必须写一句关闭PWM输出的语句。
防止程序的指针出错或访问地址出错时。
进入该中断,从而导致的硬件烧毁情况。
2、硬件的保护:
FO的检测:初次调试的时候,最好先确定一下FO保护是否正常。
通过触发FO引脚。
看看能否进入FO保护中断。