FOC及无感控制的算法移植指南

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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保护中断。

相关文档
最新文档