速度控制环
这个控制回路会以期望速度旋转电机。启用该模式的有:
// 设置速度控制环
motor.controller = MotionControlType::velocity;
motion_control/velocity_motion_control/
文件夹中的示例可以测试此算法
它是如何工作的
速度控制环闭环于力矩控制环外围,无论该力矩控制是哪一种。如果力矩控制是电压模式且没有设置相电阻,那么速度控制会利用Uq来设定力矩命令。
如果力矩控制采用的电流模式(DC_current或FOC_current)或者是设置了相电阻的电压模式,那么速度控制会设置目标值为电流iq。
速度控制是通过在力矩控制环中加入速度PID控制器实现的。PID控制器读取电机速度v,滤波为vf,并设置目标力矩(电压Uq或电流iq)到力矩控制环,以达到并保持用户设定的期望速度vd。
控制器参数
要调整这个控制环,你可以设置角度PID控制器和速度测量低通滤波器的参数。
// 基于控制类型配置控制器
// 速度PID控制器参数
// 默认P=0.5 I=10 D=0
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0.001;
// 基于斜坡电压的急动控制
// 默认值为300v/s,即0.3v/ms
motor.PID_velocity.output_ramp = 1000;
// 速度低通滤波器
// 默认为5ms - 可以不断尝试,获取最佳数值
// 数值越低,滤波频率越小
motor.LPF_velocity.Tf = 0.01;
// 设置限制
// 电压限制
motor.voltage_limit = 10; // Volts - 默认为驱动器电压极限
// 电流限制
motor.current_limit = 2; // Amps - 默认为0.2Amps
PID控制器的参数为比例增益 P
、积分增益 I
、微分增益 D
和 output_ramp
。
- 通常,通过提高比例增益
P
,你的电机控制器反应会更灵敏,但太高会导致不稳定。设置为0
会禁用控制器的比例增益。 - 同样地积分增益
I
越高,电机对干扰的反应就越快,但过大的值同样会导致不稳定。设置为0
将禁用控制器的积分增益。 - 微分增益D通常是最难设置的,因此建议将其设置为
0
,主要调整P
和I
。一旦它们调好了但有过充,就添加一点D
分量来抵消。 output_ramp
旨在减少发送给电机的电压值的最大变化。该值越高,Pl控制器更改Ua值的速度就越快。相反越低,变化就越小,控制器的响应就越慢。这个参数的值设置为Volts per second[V/s
或者换句话说控制器在一个时间单位可以提高多少伏的电压。假如你设置你的voltage_ramp
值为10 V/s,并且loop()
平均每1ms运行一次,那么你的控制器将能够改变 Uq 的值每次10[V/s]*0.001[s] = 0.01V
,这不是很多。
此外,为了速度测量更平滑,Simple FOC 库 实现了速度低通滤波器。低通滤波器 是信号平滑的标准形式,它只有一个参数-滤波时间常数 Tf
。
- 当该值越低,过滤器的影响越小。如果你把
Tf
换成0
那就基本上完全去掉了过滤器。确切Tf
值很难预先猜测,但Tf值的范围一般在0
到0.5
秒之间。
如果出于某种原因,你希望限制发送到你的电机的电压,则需要使用 voltage_limit
。
为了获得最佳性能,我们将对参数进行一些调整。 😁
有关此方法的更多理论和源代码文档,请查看 digging deeper section.
速度运动控制实例
这里是一个基本的例子,速度运动控制与电压模式转矩控制与完整的配置。该计划将设定目标速度为2 RAD/s
并保持它(抵抗干扰)。
#include <SimpleFOC.h>
// 电机实例
BLDCMotor motor = BLDCMotor( pole_pairs , phase_resistance );
// 驱动器实例
BLDCDriver3PWM driver = BLDCDriver3PWM(pwmA, pwmB, pwmC, enable);
// 磁传感器实例
MagneticSensorSPI AS5x4x = MagneticSensorSPI(chip_select, 14, 0x3FFF);
void setup() {
// 初始化磁传感器硬件
AS5x4x.init();
// 连接电机和传感器
motor.linkSensor(&AS5x4x);
// 配置驱动器
driver.init();
motor.linkDriver(&driver);
// 设置运动控制环
motor.controller = MotionControlType::velocity;
// 配置控制器
// 默认参数见defaults.h
// 基于控制类型配置控制器
// 速度PID控制器参数
// 默认P=0.5 I=10 D=0
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0.001;
// 基于斜坡电压的急动控制
// 默认值为300v/s,即0.3v/ms
motor.PID_velocity.output_ramp = 1000;
// 速度低通滤波器
// 默认为5ms - 可以不断尝试,获取最佳数值
// 数值越低,滤波频率越小
motor.LPF_velocity.Tf = 0.01;
// 由于相电阻已给定,因此我们设置电流限制而非电压限制
// 默认为0.2
motor.current_limit = 1; // Amps
// 监视串口
Serial.begin(115200);
// 如果不需要,可以注释掉此行
motor.useMonitoring(Serial);
// 初始化电机
motor.init();
// 校准编码器,启用FOC
motor.initFOC();
Serial.println("Motor ready.");
_delay(1000);
}
// 速度设置点变量
float target_velocity = 2; // 2Rad/s ~ 20rpm
void loop() {
// FOC算法主函数
motor.loopFOC();
// 运动控制函数
motor.move(target_velocity);
}
工程实例
这里是一个项目的例子,它使用位置控制,并描述了full hardware + software setup设置
在example projects 部分中可以找到更多项目。