【笔记】FOC学习笔记

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 and B 连接到驱动板的编码器端子 P_ENCAB上。
  • 如果你的编码器上有 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, MISOMOSI 连接到 Arduino 的 SPI 引脚 (Arduino UNO 13,12 and 11)。

  • 如果需要多个传感器,可以将所有传感器都连接到 Arduino 的相同引脚上。

磁传感器-I2C通信

磁传感器的 I2C 的接口 SCLSDA 连接到 Arduino 的 I2C 引脚 (Arduino UNO A4A5).

  • 如果需要多个传感器,可以将所有传感器都连接到 Arduino 的相同引脚上。

磁传感器-模拟输出

磁传感器的模拟输出直接连接到Arduino 的任何模拟输入引脚,在下图中我们使用 A0

霍尔传感器

hall_sensors >
- hall_sensor_example
- hall_sensor_software_interrupts_example

通道 A, BC ( U, VW ) 连接到驱动器的编码器端子 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 aU bU c。FOC算法确保这些电压在电机转子中产生的磁力与其永磁体的90度偏移,这保证了最大扭矩,这称为换相。

对于直流电动机,我们知道电机扭矩 T与电流I成正比:

T = I*K 

其中 K 是由其硬件定义的电机常数。 我们还知道,电流与设定的电压U成正比:

I  = (U - EMF)/R

其中 R是电机内阻,EMF是产生的反EMF电压。矩与电流成比例。而由于电流与电压成比例,那么扭矩也与电压成比例。

FOC可以通过正弦PWMSinePWM空间矢量PWM两种实现

正弦调制SinePWM

正弦调制法是基于两个变换方程。

img

逆派克变换法:

img

逆克拉克变换法:

img

空间矢量调制 SpaceVectorPWM

空间矢量调制基于两个步骤的计算:

img

在第一步,我们发现扇区s转子目前在。360度的角被分成6等份的60度。这个计算很简单。然后我们计算时间T0, T1T2T1T2告诉我们第一阶段和第二阶段应该开多久,T0告诉我们电机上0电压应该开多久。

img

第二步是将T0,1,2值投影到适当的占空比Ta,b,c,这些占空比直接取决于电机当前所在的扇区。

SectorTaTbTc
1T1 + T2 + T0/2T2 + T0/2T0/2
2T1 + T0/2T1 + T2 + T0/2T0/2
3T0/2T1 + T2 + T0/2T2 + T0/2
4T0/2T1+ T0/2T1 + T2 + T0/2
5T2 + T0/2T0/2T1 + T2 + T0/2
6T1 + T2 + T0/2T0/2T1 + T0/2

下面是一个例子使用SVM表生成pwm信号的参数: s = 2, *T1* = 1/8 = 0.125, *T2* = 1/8 = 0.125 and *T0* = 1/2 = 0.5

img

空间矢量算法更好地使用了电源的最大电压范围。使用相同的电源时,它可以向电机多输出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,从而令速度的变化更加平滑(平滑程序取决于实际应用)