摆球控制程序

  • 使用STM32控制
  • PID控制算法

使用STM32控制

用正点原子的STM32F4探索者开发板(大材小用)的作为主控控制摆球

PID控制算法

用PID控制(整体程序写法比较混乱)
基本思路:

  1. 小球在平面上分为x轴方向和y轴方向
  2. 实现速度环、
  3. 先实现在x轴方向给小球任意速度能让小球在x轴方向上的速度为0
  4. 再实现在y轴方向给小球任意速度能让小球在y轴方向上的速度为0
  5. 实现位置环
  6. 实现小球停到任意x轴位置
  7. 实现小球停到任意y轴位置
  8. 将小球的速度环和位置环串联

调试

  1. 速度环一般采用PI控制
  2. 位置环一般采用PD控制

下面是源代码

//PID头文件内容
//关于位置环的结构体定义
typedef struct
{float SetPlace;    //定义设定值float ActualPlace; //定义实际值float LastPlace;   //定义实际值float err;         //定义偏差值float err_last;    //定义上一个偏差值float Kp, Ki, Kd;  //定义比例、积分、微分系数float result;      //pid计算结果float integral;    //定义积分值
} pid_p;
//关于速度环的结构体定义
typedef struct
{float SetV;             //定义设定值float ActualV;          //定义实际值float err_V;            //定义偏差值float err_last_V;       //定义上一个偏差值float Kp_V, Ki_V, Kd_V; //定义比例、积分、微分系数float result_V;         //pid计算结果float integral_V;       //定义积分值
} pid_c;
//位置环
void PID_init(void);
float PID_realize(float P, float P_r);
void PID_init_Y(void);
float PID_realize_Y(float P, float P_r);//速度环
void PID_init_Vx(void);
float PID_Vx_realize(float V, float V_r);
void PID_init_Vy(void);
float PID_Vy_realize(float V, float V_r);//PID源文件
float last_x=0; //x上一次位置
float last_y=0; //y上一次位置
float x_speed=0;//x轴
float y_speed=0;
void PID_init()//PID参数的初始化
{pid.SetPlace = 0;    // 设定的预期位置值pid.ActualPlace = 0; // 实际位置值pid.err = 0.0;       // 当前次实际与理想的偏差pid.err_last = 0.0;  // 上一次的偏差pid.LastPlace = 0;   // 上一次的位置pid.integral = 0.0;  // 积分值pid.Kp = 0.5;        // 比例系数0.1pid.Ki = 0;          // 积分系数pid.Kd = 0;         // 微分系数
}
float PID_realize(float P, float P_r)
{char flag = 1;pid.SetPlace = P;                         // 固定位置值传入pid.ActualPlace = P_r;                    // 实际位置传入 pid.err = pid.SetPlace - pid.ActualPlace; //计算偏差pid.integral += pid.err;//积分求和pid.result = pid.Kp * pid.err + pid.Ki * pid.integral + pid.Kd * (pid.err - pid.err_last);  //位置式公式pid.err_last = pid.err;//留住上一次误差pid.LastPlace = pid.ActualPlace;return pid.result;}return 0;
}
void PID_init_Y()
{pid_Y.SetPlace = 0;    // 设定的预期位置值pid_Y.ActualPlace = 0; // 实际位置值pid_Y.err = 0.001;       // 当前次实际与理想的偏差pid_Y.err_last = 0.0;  // 上一次的偏差pid_Y.integral = 0.0;  // 积分值pid_Y.Kp = 0.1;          // 比例系数0.01pid_Y.Ki = 0;          // 积分系数pid_Y.Kd = 0;        // 微分系数
}float PID_realize_Y(float P, float P_r)
{char flag = 1;pid_Y.SetPlace = P;                             // 固定位置值传入pid_Y.ActualPlace = P_r;                        // 实际电压传入 = ADC_Value * 3.3f/ 4096pid_Y.err = pid_Y.SetPlace - pid_Y.ActualPlace; //计算偏差                                              pid_Y.integral += pid_Y.err;                                                                               //积分求和pid_Y.result = pid_Y.Kp * pid_Y.err + pid_Y.Ki * pid_Y.integral + pid_Y.Kd * (pid_Y.err - pid_Y.err_last); //位置式公式pid_Y.err_last = pid_Y.err;//留住上一次误差return (pid_Y.result) / 9000;
}
//x轴方向的速度环
void PID_init_Vx()
{pid_v.SetV = 0;         // 设定的预期速度值pid_v.ActualV = 0;      // 实际速度值pid_v.err_V = 0;      // 当前次实际与理想的速度差pid_v.err_last_V = 0.0; // 上一次的偏差pid_v.integral_V = 0.0; // 积分值pid_v.Kp_V = 0.07;         // 比例系数0.03pid_v.Ki_V = 0;         // 积分系数pid_v.Kd_V = 0.02;         // 微分系数
}
//
float PID_Vx_realize(float V, float V_r)
{char flag = 1;pid_v.SetV = V;                                                                                                            // 固定位置值传入pid_v.ActualV = V_r;                                                                                                       // 实际电压传入 = ADC_Value * 3.3f/ 4096pid_v.err_V = pid_v.SetV - pid_v.ActualV;                                                                                  //计算偏差pid_v.integral_V += pid_v.err_V;                                                                                           //积分求和pid_v.result_V = pid_v.Kp_V * pid_v.err_V + pid_v.Ki_V * pid_v.integral_V + pid_v.Kd_V * (pid_v.err_V - pid_v.err_last_V); //位置式公式pid_v.err_last_V = pid_v.err_V;return pid_v.result_V;
}
//y轴方向的速度环
void PID_init_Vy()
{pid_v.SetV = 0;         // 设定的预期速度值pid_v.ActualV = 0;      // 实际速度值pid_v.err_V = 0;      // 当前次实际与理想的速度差pid_v.err_last_V = 0.0; // 上一次的偏差pid_v.integral_V = 0.0; // 积分值pid_v.Kp_V = 0.4;         // 比例系数0.1pid_v.Ki_V = 0;         // 积分系数pid_v.Kd_V = 0.02;         // 微分系数
}
float PID_Vy_realize(float V, float V_r)
{char flag = 1;pid_v.SetV = V;                                                                                                            // 固定位置值传入pid_v.ActualV = V_r;                                                                                                       // 实际电压传入 = ADC_Value * 3.3f/ 4096pid_v.err_V = pid_v.SetV - pid_v.ActualV;                                                                                  //计算偏差pid_v.integral_V += pid_v.err_V;                                                                                           //积分求和pid_v.result_V = pid_v.Kp_V * pid_v.err_V + pid_v.Ki_V * pid_v.integral_V + pid_v.Kd_V * (pid_v.err_V - pid_v.err_last_V); //位置式公式pid_v.err_last_V = pid_v.err_V;return pid_v.result_V;
}

注意:

  1. 位置参数通过摄像头采集小球确定位置
  2. 速度参数是通过摄像头采集到当前的位置与上一帧小球位置的差值再乘上帧数(粗略计算)
//部分控制程序temp = 0.4*PID_realize(56,x_data)+0.6*PID_Vx_realize(0, x_speed);//temp = Servo_Middle_X - temp;//Servo_Middle_X舵机中值if (temp <= Servo_Up_X){temp = Servo_Up_X;}else if (temp >= Servo_Down_X){temp = Servo_Down_X;}Servo_Control_1(temp);//控制舵机的函数也就是产生对应的PWM

链接: BiliBili视频最后10秒是比较好的效果.

摆球控制程序PID算法相关推荐

  1. pid算法通俗解释,平衡车,倒立摆,适合不理解PID算法的人来看!

                        先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线 http://liuxinyu520zhuanshu.qzone.qq.c ...

  2. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!

    先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线(PID资料再我的另一篇博客里) 倒立摆资料连接↓ https://www.cnblogs.com/LiuXinyu ...

  3. pid算法(平衡车+风力摆)

    前段时间做了一辆平衡车,移植学长的代码,虽然做出来了,但是对于其中的pid控制还是不熟,这几天又重新研究了一下,现在来做一个总结,也供大家学习. 1.为什么要用pid 1.PID即:Proportio ...

  4. 倒立摆stm32F407控制程序

    #具体操作 写好倒立摆程序的关键是确定pid算法的程序和参数值.我根据网上查找的资料写了用stm32F407控制倒立摆的pid程序,现在我将程序分享给大家. 我的程序主要是根据位置式离散pid公式pw ...

  5. 电子设计竞赛(4)-常用的两种PID算法

    公众号关注 "大鱼机器人" 设为 "星标",重磅干货,第一时间送达! 1. 什么是PID PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备.气动 ...

  6. stm32直流电机控制—PID算法篇

    stm32直流电机控制-PID算法篇 一.常用的控制算法 1.控制系统的基本结构: 2.常用控制算法:位式控制 ①二位式控制算法 ②.具有回差的二位式控制算法 ③三位式控制算法 ④小结 二.PID控制 ...

  7. 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 位置式PID和增量式PID 位置式PID: 增量式PID: ...

  8. [单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计

    串级PID算法应用剖析 这是经过给队友讲解串级PID的程序的之后的进一步的理解总结. 内环的实际值,取决于你能测出什么值给内环.而内环的输入就是内环误差 内环的输出值,是内环误差(内环目标值-内环实际 ...

  9. 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的.所以作者若是看到不允许转载,请给我留言或给我邮件(lushiliangcsdn@163.com),我会立即删除. 转载原因:这篇文章把pid 算法解释的很详细.我担心以后这篇文章 ...

  10. 【转】[中级]我对『PID算法』的理解 —— 原理介绍

    http://www.dfrobot.com.cn/community/thread-14783-1-1.html本帖最后由 virtualwiz 于 2016-5-5 23:31 编辑 LZ以前有个 ...

最新文章

  1. 初等数学O 集合论基础 第三节 序关系
  2. 1.12.Flink Kafka-Connector详解、Consumer消费策略设置、动态加载Topic、Consumers Offset 自动提交、Producer、容错等
  3. 柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)...
  4. 华为交换机在Telnet登录下自动显示接口信息
  5. 书评:JBoss AS 7:配置,部署和管理
  6. ASP.NET MVC教程六:两个配置文件详解
  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓
  8. Java的书写汽车价格_ES Java API_基于mget实现多辆汽车的配置与价格对比
  9. gridview RowCommand 事件获取行索引
  10. iOS自动打开闪光灯
  11. 微信发朋友圈功能测试点小结
  12. python 多线程内子线程结束后执行主线程
  13. youwuku和koudaitong以及weimeng的区别
  14. IOS系统降级小工具
  15. 云原生CI/CD:tekton/pipeline之认证篇
  16. 拒绝面试造火箭,工作拧螺丝——Java经典面试题分享『带答案』
  17. 《反脆弱:从不确定性中获益》
  18. Git工作原理_繁星漫天_新浪博客
  19. 恶意代码分析实战 9 隐蔽的恶意代码启动
  20. 5G时代下的物联网发展前景,物联网人才的发展机遇有哪些?

热门文章

  1. 数据库课程设计:图书借阅管理系统(控制台交互)
  2. Spring学习的书-夏昕(3)
  3. python url解码_使用python对url编码解码
  4. turtle绘制八卦镜
  5. html手机表白弹窗,抖音弹窗表白代码怎么玩 弹窗表白制作方法与教程一览
  6. php派车系统,公务用车管理系统
  7. 博弈论模型——Part 2 Part 3
  8. [阅读笔记]专访刘毅:阿里巴巴云计算平台运维故障分析与排查
  9. 谷歌浏览器Vue插件
  10. gma 教程 | 气候气象 | 基于 彭曼-蒙提斯法(Penman-Monteith)计算日作物参考蒸散量(ET0)