基于大疆RM3508电机的串级PID(角度环+速度环)

您所在的位置:网站首页 大疆6020电机使用说明书 基于大疆RM3508电机的串级PID(角度环+速度环)

基于大疆RM3508电机的串级PID(角度环+速度环)

2024-01-11 17:08| 来源: 网络整理| 查看: 265

基于大疆RM3508电机的串级PID(角度环+速度环) 不会武功不懂江湖 分类:运动控制 发布时间 2021.10.16阅读数 5523 评论数 0 1.前言

最近参加ROBOCON,我负责编写传球机器人,由于传球机构需要一个电机转固定角度来带动球,所以便用大疆3508电机通过串级PID来实现,不得不说3508电机还是真的强,先看一下效果吧。

视频

2.配置程序

关于3508的配置程序以及一些其他部分在我的另外一篇博客里有详细的介绍,本篇主要是详细讲解3508串级pid(转固定角度)。大疆3508/2006/6020电机使用教程

3.角度位置控制

3508电机的串级PID控制比起其他直流电机要简单一些,不需要过多的处理编码盘的反馈,只需要读取电调反馈的角度。关于串级PID的知识,csdn上有很多,我就不赘述了。直流电机角度位置控制详解(附源码)直流电机角度控制

3.1 先看一下电调反馈的数据

if((rx_message.StdId == (MOTOR_ID_READ+5)) ) //电机5 { MOTOR_FEEDBACK[5].angle_value = rx_message.Data[0] err - PID->err_old; PID->P_OUT = PID->P * PID->err; PID->I_OUT += PID->I * PID->err; PID->D_OUT = PID->D * PID->err_err; PID->I_OUT = (PID->I_OUT > PID->I_LIMIT)?(PID->I_LIMIT):((PID->I_OUT < -PID->I_LIMIT)?(-PID->I_LIMIT):(PID->I_OUT)); PID->OUT = PID->P_OUT + PID->I_OUT + PID->D_OUT; PID->OUT = (PID->OUT > PID->OUT_LIMIT)?(PID->OUT_LIMIT):((PID->OUT < -PID->OUT_LIMIT)?(-PID->OUT_LIMIT):(PID->OUT)); if(ABS(PID->err) I_OUT=0; PID->OUT=0; } PID->err_old = PID->err; return PID->OUT; } float motor_err[10]; //死区控制 float mode=0; //mode0-发射;mode1-回收 float angle_a=0,angle_b=0;//a-发射角度;b-回收角度 void Motor_Auto_Run(void) { motor_err[5]=50; float abs_err[10]; static float abs_err_old[10]; Motor_Angle_Cal(5,360);//得到绝对角度 //发射 if(mode == 0) { motor.ANGLE[5].POS_GAOL = angle_a; PID_Cal_Limt(&motor.PID_ANGLE[5], motor_err[5], motor.ANGLE[5].POS_ABS,motor.ANGLE[5].POS_GAOL); abs_err[5] = motor.ANGLE[5].POS_ABS - abs_err_old[5]; PID_Cal_Limt( &motor.PID_SPEED[5], 10, abs_err[5], motor.PID_ANGLE[5].OUT); abs_err_old[5] = motor.ANGLE[5].POS_ABS; Motor_Set_Current2((int16_t)(motor.PID_SPEED[5].OUT) ,0,0,0); } //回 else if (mode == 1) { motor.ANGLE[5].POS_GAOL = angle_b ; PID_Cal_Limt(&motor.PID_ANGLE[6], motor_err[5], motor.ANGLE[5].POS_ABS,motor.ANGLE[5].POS_GAOL); abs_err[5] = motor.ANGLE[5].POS_ABS - abs_err_old[5]; PID_Cal_Limt( &motor.PID_SPEED[6], 10, abs_err[5], motor.PID_ANGLE[6].OUT); abs_err_old[5] = motor.ANGLE[5].POS_ABS; Motor_Set_Current2((int16_t)(motor.PID_SPEED[6].OUT) ,0,0,0); } else }

这个部分有几个小细节主要注意:1.角度控制一套PID参数即可,为了不损害机械机构所以我写了两套PID参数来控制电机的发射和回收。2.motor_err()是电机角度死区控制,目的是防止电机在目标角度附件来回跳动。3. 角度控制的主要流程是先将目标角度在角度环里计算,将角度环的输出发送给速度环,再将速度环的输出发射给电调即可。4. 一般串级PID的调参主要是调角度环,如果需要电机的爆发力很大,角度环的输出限制不能设置的很大。5.若是电机在目标值附近来回震动很大,则需要在角度环里加大d的值。6.角度环的程序需要放在 投射电机 的can接收中断里。

if((rx_message.StdId == (MOTOR_ID_READ+5)) ) //电机5 { Motor_Auto_Run(); //串级PID 3508 正方向-向上 MOTOR_FEEDBACK[5].angle_value = rx_message.Data[0]

分享

微信 微博 QQ 图片 上一篇:2020电赛题OPENMV识别形状并与stm32通信 下一篇:STM32中基于时间的任务调度框架


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3