FOC学习笔记
SimpleFOC
英文对应
无刷直流电机(BLDC)
-
云台电机 -低 KV(高内阻~10Ω)云台电机实际上可以在几乎任何无刷电机驱动器上使用,低速和高扭矩运行时非常平稳。它们可以高质量的代替你的步进电机或者直流伺服电机
-
高性能无刷直流电机 -高KV(低内阻<1Ω )高性能无刷电机驱动板上通常有电流检测电路
-
步进电机-2相4线,相对较高的极对数 >50
编码器(Encoder)
磁传感器(Magnetic sensor)
Hall sensor(霍尔传感器
电机的 a
相, b
相和 c
相直接连接到驱动板的电机输出端子 TB_M1
电源线连接到输入端 TB_PWR
L6234芯片:低功率simpleFOC用的芯片
位置传感器的连接,分类和测试程序
编码器连接
- 通道
A
andB
连接到驱动板的编码器端子P_ENC
的A
和B
上。 - 如果你的编码器上有
index
,你也可以将它连接到编码器端子的I
上。 - encoder >
- encoder_example
- encoder_software_interrupts_example
磁传感器-SPI通信
magnetic_sensors >
- magnetic_sensor_i2c_example
- magnetic_sensor_spi_example
- magnetic_sensor_analog_example
磁传感器的 SPI 接口 SCK
, MISO
和 MOSI
连接到 Arduino 的 SPI
引脚 (Arduino UNO 13
,12
and 11
)。
- 如果需要多个传感器,可以将所有传感器都连接到 Arduino 的相同引脚上。
磁传感器-I2C通信
磁传感器的 I2C 的接口 SCL
和 SDA
连接到 Arduino 的 I2C
引脚 (Arduino UNO A4
和 A5
).
- 如果需要多个传感器,可以将所有传感器都连接到 Arduino 的相同引脚上。
磁传感器-模拟输出
磁传感器的模拟输出直接连接到Arduino 的任何模拟输入引脚,在下图中我们使用 A0
霍尔传感器
hall_sensors >
- hall_sensor_example
- hall_sensor_software_interrupts_example
通道 A
, B
和 C
( U
, V
和 W
) 连接到驱动器的编码器端子 P_ENC
.
测试电机
开环测试,电机对数测试,依次进行测试
motion_control >开环控制
open_loop_motor_control >
- open_loop_position_example
- open_loop_velocity_example
在开环(无位置传感器)控制模式下使用步进电机的主要问题是,我们不得不忽略电机的负载和其动力学问题。因此,在使用步进电机的时候,我们往往会选择强劲的超过我们应用需求的电机,以弥补无感时候的控制缺陷。开环控制的另一个问题是不知道电机此时的运动位置,这使得控制算法无法对环境干扰做出响应
utils >极对数计算
find_pole_pair_number >
- encoder
- magnetic_sensor
motion_control > //电压控制扭矩
torque_voltage_control >
- encoder
- magnetic_sensor
- hall_sensors
motion_control >
position_motion_control > 位置环
- encoder
- magnetic_sensor
- hall_sensors
velocity_motion_control > 速度环
- encoder
- magnetic_sensor
- hall_sensors
理论研究
FOC算法的目的是实现磁力与其永磁体的90度偏移
电压控制算法从位置传感器读取角度a,从用户获取目标Uq电压值,通过FOC算法设置电机合适的U a, U b 和 U c。FOC算法确保这些电压在电机转子中产生的磁力与其永磁体的90度偏移,这保证了最大扭矩,这称为换相。
对于直流电动机,我们知道电机扭矩 T
与电流I
成正比:
T = I*K
其中 K
是由其硬件定义的电机常数。 我们还知道,电流与设定的电压U
成正比:
I = (U - EMF)/R
其中 R
是电机内阻,EMF
是产生的反EMF电压。矩与电流成比例。而由于电流与电压成比例,那么扭矩也与电压成比例。
FOC可以通过正弦PWMSinePWM空间矢量PWM两种实现
正弦调制SinePWM
正弦调制法是基于两个变换方程。
逆派克变换法:
逆克拉克变换法:
空间矢量调制 SpaceVectorPWM
空间矢量调制基于两个步骤的计算:
在第一步,我们发现扇区s转子目前在。360度的角被分成6等份的60度。这个计算很简单。然后我们计算时间T0, T1 和 T2。T1 和 T2告诉我们第一阶段和第二阶段应该开多久,T0告诉我们电机上0电压应该开多久。
第二步是将T0,1,2值投影到适当的占空比Ta,b,c,这些占空比直接取决于电机当前所在的扇区。
Sector | Ta | Tb | Tc |
---|---|---|---|
1 | T1 + T2 + T0/2 | T2 + T0/2 | T0/2 |
2 | T1 + T0/2 | T1 + T2 + T0/2 | T0/2 |
3 | T0/2 | T1 + T2 + T0/2 | T2 + T0/2 |
4 | T0/2 | T1+ T0/2 | T1 + T2 + T0/2 |
5 | T2 + T0/2 | T0/2 | T1 + T2 + T0/2 |
6 | T1 + T2 + T0/2 | T0/2 | T1 + T0/2 |
下面是一个例子使用SVM表生成pwm信号的参数: s = 2, *T1* = 1/8 = 0.125, *T2* = 1/8 = 0.125 and *T0* = 1/2 = 0.5
空间矢量算法更好地使用了电源的最大电压范围。使用相同的电源时,它可以向电机多输出15%的功率。
Ua,b,c是饱和的,在你超过最大值后,你实际上不再设置正弦波到你的电机。 电机的功率仍在增加,但不再是直线或平滑的。
FOC算法的Arduino实现
FOC算法有三个主要部分:
- 相电压计算算法(调制):
setPhaseVoltage()
- 电机和传感器校准:
initFOC()
- 实时执行:
loopFOC()
低通速度滤波器
控制器的低通滤波器传递函数为:
Gf=11+sTf G_f = \frac{1}{1+sT_f} Gf=1+sTf1
离散化为:
vf(k)=TfTf+Tsvf(k−1)+TSTf+Tsv(k) v_f(k)=\frac{T_f}{T_f+T_s}v_f(k-1)+\frac{T_S}{T_f+T_s}v(k) vf(k)=Tf+TsTfvf(k−1)+Tf+TsTSv(k)
其中*vf(k)*为k时刻的滤波值, v(k)为k时刻的速度测量值, Tf是滤波时间常数,Ts是采样时间(或上述式子的时间间隔)。 这个低通滤波器也可以写成这样的形式:
vf(k)=αvf(k−1)+(1−α)v(k) v_f(k)=\alpha v_f(k-1)+(1-\alpha)v(k) vf(k)=αvf(k−1)+(1−α)v(k)
其中:
α=TfTf+Ts \alpha=\frac{T_f}{T_f+T_s} α=Tf+TsTf
上面的式子更直观地表示了在低通滤波器中常量Tf的意义。如果你的采样时间大约是1毫秒(对于arduino UNO,这可以作为平均值),那么设置 T_f = 0.01
将得到:
alpha = 0.01/(0.01 + 0.001) = 0.91
上式表示实际的速度测量值v会通过系数1-alpha = 0.09影响到滤波后的值vf,从而令速度的变化更加平滑(平滑程序取决于实际应用)