无刷电机力矩控制模拟棘轮
无刷电机可以通过控制力矩来实现设人机交互中的触觉反馈。下面使用灯哥开源FOC双路无刷电机控制器、ESP32开发板、无刷电机、AS5600磁编码器套件和Arduino SimpleFOClibrary,实现用无刷电机模拟8个挡位的棘轮触碰效果。调整速度PID参数中的比例P可以模拟不同的刚度:
#include <SimpleFOC.h> MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); TwoWire I2Cone = TwoWire(0); BLDCMotor motor = BLDCMotor(7); BLDCDriver3PWM driver = BLDCDriver3PWM(32, 33, 25, 22); Commander command = Commander(Serial); void doTarget(char* cmd) { command.motor(&motor, cmd); } // attractor angle variable float attract_angle = 0; // distance between attraction points float attractor_distance = 45*_PI/180.0; // dimp each 45 degrees float findAttractor(float current_angle){ return round(current_angle/attractor_distance)*attractor_distance; } void setup() { // initialise magnetic sensor hardware I2Cone.begin(19, 18, 400000); sensor.init(&I2Cone); motor.linkSensor(&sensor); // power supply voltage driver.voltage_power_supply = 14; driver.init(); motor.linkDriver(&driver); motor.voltage_limit = 4.0; // set motion control loop to be used motor.controller = MotionControlType::torque; // haptic attraction controller - only Proportional motor.PID_velocity.P = 5; motor.PID_velocity.I = 0; motor.PID_velocity.limit = 8; // use monitoring with serial Serial.begin(115200); motor.useMonitoring(Serial); motor.monitor_downsample = 100; // add target command T command.add('T', doTarget, "set target"); // initialize motor motor.init(); // align sensor and start FOC motor.initFOC(); Serial.println(F("Motor ready.")); _delay(1000); } void loop() { motor.loopFOC(); float torque = motor.PID_velocity(attract_angle - motor.shaft_angle); motor.move(torque); // calculate the attractor attract_angle = findAttractor(motor.shaft_angle); motor.monitor(); command.run(); }
通过一个PID类的实例或者直接使用马达速度控制PID(便于在SimpleFOC Studio中调整),根据构造的位置误差输出电压控制量,来控制电机扭矩(参考基于电压的扭矩控制)。
在SimpleFOC Studio左侧的速度PID栏中可以动态调整比例系数P的值,来感受旋转电机遇到挡点时不同的触碰刚度,P越大刚度越大。软件右侧可以实时监控电机角度,可以看出连续旋转电机时由于存在“挡点”,角度曲线呈现起伏。
电机以逆时针旋转方向(CCW)为正方向,如果电机从0°开始匀速正向旋转,那么根据PID算法输出的电压与误差项(attract_angle - motor.shaft_angle)成比例,“电压-角度”曲线将如下图所示。在0-45°/2的范围内,随着角度增大,电机受到逐渐增大的阻力,越过45°/2这一点后误差项的符号瞬间改变,电压反向。这种电机反馈力矩的突变会产生一种碰到棘轮齿的感觉。改变比例系数P,可以调整曲线斜率,实现不同强度的触感。
下面是SimpleFOC Studio中实时反馈的“电压-时间”曲线,可以看出形状与上图类似。
参考: