控制器
电机控制器为级联式,采用位置,速度和电流控制回路,如下图所示。 当控制模式设置为位置控制时,整个循环都会运行。 在速度控制模式下运行时,位置控制部分将不被使用,并将速度命令直接输入到第二级输入中。 同理,在电流控制模式下,仅使用电流控制回路。
每个控制回路都是基于PID控制器。PID控制器是一种被广泛应用的控制方式,可以适用于控制大部分系统。 这种灵活性使得ODrive可以用于控制各种机械系统。
位置环:
位置环控制器是一个具有单个比例增益的P环路。
pos_error = pos_setpoint - pos_feedback
vel_cmd = pos_error * pos_gain + vel_feedforward
速度环:
速度环控制器是一个PI环路。
vel_error = vel_cmd - vel_feedback
current_integral += vel_error * vel_integrator_gain
current_cmd = vel_error * vel_gain + current_integral + current_feedforward
电流环:
电流环控制器是一个PI环路。
current_error = current_cmd - current_fb
voltage_integral += current_error * current_integrator_gain
voltage_cmd = current_error * current_gain + voltage_integral (+ voltage_feedforward when we have motor model)
可以通过阅读ODrive源码中的 "controller.cpp"文件来获取更多信息。
参数整定
调整电机控制器是释放ODrive潜力的必不可少的步骤。通过调整,控制器可以快速响应系统中的干扰或变化(例如施加的外力或设定值的变化)而不会变得不稳定。 正确设置三个调整参数(称为增益)可确保ODrive能够以最有效的方式控制电动机。 这三个参数是:
我们即将推出带有自动调整功能的版本。 但在此之前还是需要手动调节,以下是一个粗略的调整过程:
设置 vel_integrator_gain为 0
逐渐减小另外两个值使系统达到稳定状态
逐渐增加vel_gain ,每次增加 30% 左右,直到电机出现轻微的震荡
设置 vel_gain 为出现轻微震动时值的 50%
逐渐增加 pos_gain ,每次增加 30% 左右,直到您看到有些过冲
逐渐减小 pos_gain ,直到过冲消失
可以将积分器vel_integrator_gain设置为0.5 * 带宽 * vel_gain,其中“带宽”是您的系统的控制带宽。 例如,您发送一条运动控制指令,假设您的调整使它以100ms的建立时间(从设定值更改到系统到达新设定值的时间)跟踪命令; 这意味着带宽为1/(100ms)=1/(0.1s)=10hz。 在这种情况下,您应该设置vel_integrator_gain = 0.5 * 10 * vel_gain。
实时绘图功能对于调整控制器参数帮助很大,例如,可以通过在odrivetool中运行以下命令来以曲线的形式实时显示设置位置和实际位置:
start_liveplotter(lambda:[odrv0.axis0.encoder.pos_estimate, odrv0.axis0.controller.pos_setpoint])
[RW] odrv0.axis0.motor.config.pole_pairs
类型为 [int32_t],电机极对数,可以查看电机数据手册或者数一下永磁体个数来获取极对数,极对数 = 电机永磁体个数 / 2
[RW] odrv0.axis0.motor.config.current_lim
类型为 [float],电机最大运行电流,单位为 [A]
[RW] odrv0.axis0.motor.config.current_lim_margin
类型为 [float],超过电机最大运行电流的容忍度,如:此值设置为 3 表示当电机电流超过限制电流 3A 时停止电机并报错
[RW] odrv0.axis0.motor.config.requested_current_range
类型为 [float],单位为 [A],电机运行的电流范围,根据此值来自动调整电流采样运放的增益,设置后需要保存配置并重启才能生效
[RW] odrv0.axis0.motor.config.current_control_bandwidth
类型为 [float],电流控制环的控制带宽,用来自动计算电流环 PI 参数,加减速比较缓慢的电机此参数应该越低
[RW] odrv0.axis0.motor.config.torque_lim
类型为 [float],单位为 [Nm],电机输出最大扭矩
motor.config.torque_lim特别重要,限定了扭矩,Odrive就不会尝试跑过大的电流,特别是在低速和堵转的时候,只需要很小的电流就能达到额定扭矩,过大的电流只会发热。
[RW] odrv0.axis0.controller.config.inertia
类型为 [float],单位为 [Nm/(turn/s^2)],电机转动惯量。
[RO] odrv0.axis0.is_homed
类型为 [bool],是否已找回零点。
[RW] odrv0.axis0.controller.config.anticogging.pre_calibrated
类型为 [bool],anticogging 是否已经校准完成。
[RO] odrv0.axis0.controller.config.anticogging.calib_anticogging
类型为 [bool],anticogging 是否正在校准中。
[RO] odrv0.axis0.motor.current_control.max_allowed_current
类型为 [float],单位为 [A],根据设定的最大电流值和当前温度自动计算得出的当前最大允许电流。
[RW] odrv0.config.max_regen_current
类型为 [float],单位为 [A],最大再生电流,此值应为正值,当反向电流高于此值时开始启动制动电阻进行反向电流的消耗。
[RW] odrv0.config.dc_max_positive_current
类型为 [float],单位为 [A],供电设备能够输出的最大电流。
[RW] odrv0.config.dc_max_negative_current
类型为 [float],单位为 [A],供电设备能够反向吸收的最大电流。此值应当为负值,当 odrv0.ibus 小于此值时 ODrive 将报错,当设为负无穷大时将不进行检查报错。
[RW] odrv0.axis0.config.calibration_lockin.current
类型为 [float],单位为 [A],电机开环旋转校准编码器时的电机电流。
[RW] odrv0.axis0.config.calibration_lockin.ramp_time
类型为 [float],单位为 [s],电机开环旋转校准编码器时电流爬升到设置的电机电流所需的时间。
[RW] odrv0.axis0.config.calibration_lockin.ramp_distance
类型为 [float],单位为 [rad],电机开环旋转校准编码器时转速爬升的距离。
[RW] odrv0.axis0.config.calibration_lockin.accel
类型为 [float],单位为 [rad/s^2],电机开环旋转校准编码器时转速爬升的加速度。
[RW] odrv0.axis0.config.calibration_lockin.vel
类型为 [float],单位为 [rad/s],电机开环旋转校准编码器时设定的旋转速度。
[RW] odrv0.axis0.fet_thermistor.config.temp_limit_lower
类型为 [float],单位为 [℃],当 axis0 MOSFET 温度高于此值时 ODrive 开始减小电流输出。
[RW] odrv0.axis0.fet_thermistor.config.temp_limit_upper
类型为 [float],单位为 [℃],当 axis0 MOSFET 温度高于此值时 ODrive 将停止电流输出并报出电机温度过高错误。
[RW] odrv0.axis0.controller.config.enable_vel_limit
类型为 [bool],是否启用转速限制功能。