一、达妙电机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。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐