2301_80465665 2024-07-14 18:44 采纳率: 100%
浏览 6
已结题

简单使用PID来使M2006转动

本人刚刚接触RM,主要以官方C型开发板历程为指引进行工程配置,目前在学习M2006电机的控制.
我遇到的问题是在我自己使用PID后无法使电机转动,不知道问题在哪里。

以下是 main函数的相关代码:
由于目前在学习M2006,所以只使用了ID0x201一个ID的电机。


#define PID1_KP 1600.0f //kp of motor control PID 
#define PID1_KI 0.2f    //ki of motor control PID 
#define PID1_KD 0.0f    //kd of motor control PID 

pid_type_def *pid1;
const fp32 motor_PID[3] = {PID1_KP, PID1_KI, PID1_KD};
const motor_measure_t *motor_data[4];

can_filter_init();
PID_init(pid1, 0, &motor_PID[3], 10000, 5000);

    motor_data[0] = get_chassis_motor_measure_point(0);
    motor_data[1] = get_chassis_motor_measure_point(1);
    motor_data[2] = get_chassis_motor_measure_point(2);
    motor_data[3] = get_chassis_motor_measure_point(3);

  while (1)
  {
      //pid1->set = 6000;
      
      PID_calc(pid1, motor_data[0]->speed_rpm, 6000);
      CAN_cmd_chassis(pid1->out,0,0,0);
      HAL_Delay(10);
      //CAN_cmd_gimbal(10000,0,0,0);
      //HAL_Delay(2);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

我想问一下,我这样用PID对吗,我的M2006电机不转。

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-14 18:45
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    根据您提供的代码,您在使用PID控制M2006电机时遇到了电机不转动的问题。我们需要从以下几个方面进行分析:

    1. PID参数设置:检查PID参数是否合理。
    2. PID初始化:检查PID初始化是否正确。
    3. 数据获取:确保获取的电机数据是正确的。
    4. 控制逻辑:检查控制逻辑是否正确。

    解决方案

    1. PID参数设置

    首先,检查PID参数是否合理。您设置的KP值为1600.0f,KI值为0.2f,KD值为0.0f。KP值较大,可能会导致系统响应过快,产生震荡。建议先从较小的KP值开始尝试,逐步调整。

    2. PID初始化

    在您的代码中,PID初始化部分存在问题。PID_init函数的参数中,&motor_PID[3]应该是&motor_PID[0],因为motor_PID数组只有3个元素。

    PID_init(pid1, 0, &motor_PID[0], 10000, 5000);
    

    3. 数据获取

    确保获取的电机数据是正确的。您在代码中获取了4个电机的数据,但只使用了第一个电机的数据。确保get_chassis_motor_measure_point函数返回的数据是有效的。

    4. 控制逻辑

    检查控制逻辑是否正确。您在while循环中调用了PID_calc函数,并使用其输出结果来控制电机。确保CAN_cmd_chassis函数能够正确地将控制信号发送到电机。

    修改后的代码

    以下是修改后的代码,包括对PID初始化的修正和PID参数的调整:

    #define PID1_KP 160.0f // 调整KP值
    #define PID1_KI 0.2f    // ki of motor control PID 
    #define PID1_KD 0.0f    // kd of motor control PID 
    
    pid_type_def *pid1;
    const fp32 motor_PID[3] = {PID1_KP, PID1_KI, PID1_KD};
    const motor_measure_t *motor_data[4];
    
    can_filter_init();
    PID_init(pid1, 0, &motor_PID[0], 10000, 5000); // 修正PID初始化
    
    motor_data[0] = get_chassis_motor_measure_point(0);
    motor_data[1] = get_chassis_motor_measure_point(1);
    motor_data[2] = get_chassis_motor_measure_point(2);
    motor_data[3] = get_chassis_motor_measure_point(3);
    
    while (1)
    {
        pid1->set = 6000; // 设置目标值
        
        PID_calc(pid1, motor_data[0]->speed_rpm, pid1->set);
        CAN_cmd_chassis(pid1->out, 0, 0, 0);
        HAL_Delay(10);
        //CAN_cmd_gimbal(10000,0,0,0);
        //HAL_Delay(2);
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    }
    

    总结

    1. PID参数调整:从较小的KP值开始尝试,逐步调整。
    2. PID初始化修正:确保PID初始化参数正确。
    3. 数据获取:确保获取的电机数据是有效的。
    4. 控制逻辑:确保控制逻辑正确,能够将控制信号正确发送到电机。

    希望以上解决方案能够帮助您解决问题。如果仍有问题,请提供更多详细信息,以便进一步分析。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月14日

悬赏问题

  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示