当前位置:网站首页>PID控制电机输出作为电机PWM占空比输入的理解
PID控制电机输出作为电机PWM占空比输入的理解
2022-08-09 08:33:00 【奔跑的小赛兔】
这两天一直疑惑PID的输出怎么就能作为PWM脉冲控制电机输出呢?问了几个人也没说清楚。
我认为你能让一个初学者说明白也就说明你掌握的挺深刻,如果你说了别人还是没明白那就的得反思自己掌握的怎么样,是在自欺欺人吗?还有就是每个人擅长的领域不一样不要总说这么简单都不明白,那我只能说,我擅长的领域你可能就是个小白。
现在研究了一天终于明白了,分享给和我一样疑惑的初学者,仅代表个人理解。
1、设定PID目标值和参数,目标值为电机速度值。
set_p_i_d(1.5, 0.2, 0.0);
set_pid_target(30.0);
2、PID是一个负反馈闭环系统,这点很重要。
float PID_realize(float actual_val)
{
/*计算目标值与实际值的误差*/
DBG_Printf("%s: pid_target:%.2f - PID_actual:%.2f \r\n", __FUNCTION__,pid.target_val, actual_val);
pid.err = pid.target_val - actual_val;
/*积分项*/
pid.integral += pid.err;
DBG_Printf("%s: PID_error:%.2f - PID_sum:%.2f \r\n", __FUNCTION__,pid.err, pid.integral);
/*PID算法实现*/
pid.output_val = pid.Kp * pid.err +
pid.Ki * pid.integral +
pid.Kd * (pid.err - pid.err_last);
/*误差传递*/
pid.err_last = pid.err;
/*返回当前实际值*/
return pid.output_val;
}
3、具体反馈流程
a、首先PID算法第一步 会对目标值和实际值做一个差值计算,计算偏差之刚开始很大逐渐会变小。
b、每次的PID输出会作为电机的输入,编码器会对每次的速度进行读取,刚开始读到的速度很小,它会把这个速度值作为实际值传入PID输入这个时候PID的目标值还会和这个实际值进行比较,直到误差为0,这个过程会一直进行,只是误差为0时积分项的累加值就稳定了,微分项的差值也稳定了,比例项也稳定了。也就是PID的输出就稳定了,而这个值就是PWM的占空比,这个值是三项的和的稳定值,按我的例子来说,这个PWM占空比值稳定在400左右,它是由电机旋转过程中的负反馈值,也就是目标值30对应的占空比,具体来说就是目标值到达30,PID输出三项的累计值,要想达到这个速度就得是这个占空比,它们两是线性关系,和你设置的PID参数有直接关系。
c、重新设定PID目标值和参数,目标值为电机速度值。
set_p_i_d(15.0, 2.0, 0.0);
set_pid_target(30.0);
我把PID参数增大十倍,速度目标值不变,这个时候最终的PID输出的PWM占空比还是会稳定在400.相对于上一组参数,它的积分累加项正好是上一组的十分之一,但是响应速度较上一组提高10倍。
边栏推荐
- leetcode 35. 搜索插入位置(二分法+找性质也很关键)
- The Servlet,
- I'm here to advertise
- uva11624 Fire! (双bfs)
- 【MySQL】mysql:解决[Err] 1093 - You can‘t specify target table ‘表名‘ for update in FROM clause问题
- 磁盘管理与挂载
- 【GNN终身学习】2022 CVPR 终身图学习
- Use of prepareStatement
- Set集合
- Object detection app based on appinventor and EasyDL object detection API
猜你喜欢

leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分经典题)

VMware虚拟机强制关闭后,无法联网

进程和计划任务
一文搞懂 条件编译和预处理指令 #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined 详解

Conversion between number systems

System transformation and subnetting

Servlet的实现原理解析(serverapplet)(服务端程序)

get一个小技巧,教你如何在typora写文章上传图片到博客上

Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)

深度学习时代的视频理解综述
随机推荐
VMware虚拟机强制关闭后,无法联网
数据库MySQL的安装和卸载
消息中间件(MQ)前置知识介绍(必看)
Redis(八)集群
Win10电脑的WLAN消失的故事
解决iframe跳转时父页面仍然存在的问题
OpenHarmony Light Smart Product Development Live Notes
bs4的使用基础学习
Cookie和Session详解
requests之模拟登录学习
路由配置转发及实验
网络层协议介绍
nyoj306 走迷宫(搜索+二分)
Euclid and the game
eTS UI开发学习
Xpath之爬取全国城市名称学习
leetcode 36. 有效的数独(模拟题)
Redis redis 】 【 the expiration of listening
OSI网络模型
编程洗衣机:字符串输出后的乱码