matlab测试达妙电机MIT模式曲线追踪能力
测试达妙电机的曲线追踪能力
一、达妙电机matlab例程导入
根据达妙电机readme,将达妙官方封装函数文件路径导入matlab
二、修改串口、Master ID 和Slave ID
Master ID尽量不要选择0x00。
添加电机后需要保存寄存器的值到flash中,控制模式可以通过MotorControl类中的修改寄存器值(控制模式寄存器),来改变控制模式,需要在保存寄存器值到flash之前进行。
三、读取电机参数即(寄存器值)
通过MotorControl类的方法进行读取寄存器值,读取寄存器值时调用recv_set_param_data方法解包的同时将返回帧的信息传递给motor类,信息包括寄存器键值对等,如下图:
四、通过控制位置的方式,控制达妙电机转动,追踪正弦函数
这里可以追踪任意函数曲线,只需要修改y的函数就可以实现轨迹追踪,可以从结果图分析出电机转动时的位置、速度、力矩曲线是否符合理想状态。
五、代码和结果展示
addpath('.\DM_CAN\');
clear;
motor1=Motor(DM_Motor_Type.DM4310, 0x02, 0x11);
MotorControl1 = MotorControl('COM3',921600);%串口号和波特率
MotorControl1.addMotor(motor1);
MotorControl1.save_motor_param(motor1);%保存电机参数进flash就不用重启电机了
MotorControl1.enable(motor1);%使能电机要放在最后
motors = {motor1};
for i = 1:length(motors)
motor = motors{i};
disp(" ");
fprintf('Motor%d:\n', i);
disp(['KP_APR:',num2str(MotorControl1.read_motor_param(motor, DM_Reg.KP_APR))]);
disp(['KI_APR:',num2str(MotorControl1.read_motor_param(motor, DM_Reg.KI_APR))]);
disp(['KP_ASR:',num2str(MotorControl1.read_motor_param(motor, DM_Reg.KP_ASR))]);
disp(['KI_ASR:',num2str(MotorControl1.read_motor_param(motor, DM_Reg.KI_ASR))]);
disp(['MST_ID:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.MST_ID))]);
disp(['VMAX:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.VMAX))]);
disp(['TMAX:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.TMAX))]);
disp(['PMAX:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.PMAX))]);
disp(['sub_ver:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.sub_ver))]);
if MotorControl1.change_motor_param(motor,DM_Reg.UV_Value,12.6)
disp('change UV_Value success!!!!');
end
disp(['UV_Value:', num2str(MotorControl1.read_motor_param(motor, DM_Reg.UV_Value))]);
end
%---------------------测试电机MIT模式下在固定kp、kd下的位置、速度、力矩的曲线追踪能力-----------
Position = zeros(1,1);
Velocity = zeros(1,1);
Torque = zeros(1,1);
for index =1: 10000
y=sin(index/100);
MotorControl1.controlMIT(motor1,2,0.1,y,0,0);
Position(:,end+1) = motor1.getPosition();
Velocity(:,end+1) = motor1.getVelocity();
Torque(:,end+1) = motor1.getTorque();
disp(['Motor1--vel:',num2str(Velocity(mod(index,100)+1)),'pos:',num2str(Position(mod(index,100)+1)),'tau:',num2str(Torque(mod(index,100)+1))]);
pause(0.001);
end
figure;
plot (1:length(Position),Position,'b', 'DisplayName','Position','LineWidth', 2)
hold on
plot (1:length(Velocity),Velocity,'r','DisplayName','Velocity','LineWidth', 2)
plot (1:length(Torque),Torque,'g','DisplayName','Torque','LineWidth', 2)
xlabel('Sample index');
ylabel('Value');
legend('show')
disp("end");
delete(MotorControl1.serial_);
可以看出位置和速度的相位差为半个周期,符合理想状态,但是由于MIT模式kp、和kd分别控制位置和速度的增益,如果这两个参数调节不好会导致曲线偏离,我采用的是空载kp = 2,kd = 0.1。
更多推荐
所有评论(0)