量子力学研究生 2024-06-09 01:15 采纳率: 71.4%
浏览 37
已结题

用stm32单片机对舵机的pid控制

6自由度机械臂用了一个亚博智能16路的舵机驱动模块,现在可以实现控制每一路输出不同pwm波来控制机械臂运动。现在的问题是机械臂上面的舵机反应速度很快。舵机是用的数字舵机ds3115那种的,180度。网上说控制舵机速度要用pid算法,我现在用的不是stm32定时器的pwm信号,而是stm32单片机的iic通信让舵机驱动模块输出pwm波控制机械臂上的舵机的。请问stm32f103要怎么设计程序实现和驱动模块联合去搞pid算法去控制舵机转速呢,就是想控制机械臂流畅地运动,请教一下有用过这个驱动模块并实现机械臂控制的技术者

img

  • 写回答

23条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-06-09 08:35
    关注

    🕖上午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:二十四桥明月夜,玉人何处教吹箫。

    STM32F103 与 YAHBOOM 16路舵机驱动板实现机械臂PID控制

    以下是使用 STM32F103 和 YAHBOOM 16路舵机驱动板,通过 I2C 通信和 PID 算法控制舵机速度,实现机械臂流畅运动的解决方案:

    1. 硬件连接:

    • 将 YAHBOOM 舵机驱动板的 SDA 和 SCL 引脚连接到 STM32F103 的 I2C 引脚。
    • 将舵机驱动板的 VCC 和 GND 连接到 STM32F103 的电源和地。
    • 将舵机连接到舵机驱动板的对应通道。

    2. 软件设计:

    2.1 初始化:

    • 初始化 STM32F103 的 I2C 模块,设置波特率等参数。
    • 初始化 YAHBOOM 舵机驱动板,设置舵机控制模式为 PWM 控制。
    • 定义每个舵机的目标角度变量和实际角度变量。

    2.2 PID 算法实现:

    // 定义 PID 参数
    float Kp = 1.0; // 比例系数
    float Ki = 0.1; // 积分系数
    float Kd = 0.05; // 微分系数
    
    // 定义 PID 变量
    float pre_error = 0.0; // 上一次误差
    float integral = 0.0; // 积分值
    
    // PID 控制函数
    float pid_control(float target_angle, float current_angle) {
      // 计算误差
      float error = target_angle - current_angle;
    
      // 计算积分值
      integral += error;
    
      // 计算微分值
      float derivative = error - pre_error;
    
      // 计算 PID 输出值
      float output = Kp * error + Ki * integral + Kd * derivative;
    
      // 更新上一次误差
      pre_error = error;
    
      // 返回 PID 输出值
      return output;
    }
    

    2.3 控制循环:

    • 读取每个舵机的实际角度值。
    • 调用 PID 控制函数,计算每个舵机的控制量。
    • 将控制量转换为 PWM 信号,并通过 I2C 发送给舵机驱动板。
    • 延时一段时间,例如 10ms。
    • 重复步骤 2.3.1 - 2.3.4,形成闭环控制。

    2.4 示例代码:

    #include "stm32f10x.h"
    #include "i2c.h"
    #include "yahboom_driver.h"
    
    // 定义舵机数量
    #define SERVO_NUM 6
    
    // 定义舵机目标角度
    float target_angle[SERVO_NUM] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
    
    // 定义舵机实际角度
    float current_angle[SERVO_NUM] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
    
    int main(void) {
      // 初始化 I2C 和舵机驱动板
      I2C_Init();
      YahboomDriver_Init();
    
      // 设置舵机目标角度
      // ...
    
      while (1) {
        // 读取舵机实际角度
        for (int i = 0; i < SERVO_NUM; i++) {
          current_angle[i] = YahboomDriver_GetAngle(i);
        }
    
        // PID 控制
        for (int i = 0; i < SERVO_NUM; i++) {
          float output = pid_control(target_angle[i], current_angle[i]);
    
          // 将控制量转换为 PWM 信号
          int pwm = (int)(output * 1000 / 180);
    
          // 发送 PWM 信号给舵机驱动板
          YahboomDriver_SetPWM(i, pwm);
        }
    
        // 延时
        delay_ms(10);
      }
    }
    

    3. 调试和优化:

    • 调整 PID 参数,使机械臂运动流畅,无明显震荡。
    • 可以使用上位机或串口调试助手实时监控舵机角度和 PID 控制量。
    • 可以根据实际应用场景,优化控制算法,例如加入速度规划和轨迹规划等。

    注意:

    • 以上代码仅供参考,实际应用中需要根据硬件和软件环境进行修改。
    • 需要根据舵机驱动板的具体型号和控制协议编写 I2C 通信函数和舵机控制函数。
    • PID 参数的调整需要经验和实验,可以参考相关资料和教程。

    希望以上信息能够帮助您实现 STM32F103 与 YAHBOOM 16路舵机驱动板的联合 PID 控制,实现机械臂的流畅运动。

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

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,