最近一直在学习PID的相关知识,网上有很多心得和口诀,看完过后感觉自己好像是懂了一些,但让自己实践一下又感觉无从下手,举手无措。所以今天我决定,直接上手一个简单的电机速度PID试试。

准备阶段

  1. 一块主控板子 我这里刚好有一块原子的mini开发板,所以就用它了。其实任何一块最简单的STM32核心板都能完成功能。

  2. 一个电机 我这里用的是平衡小车之家的减速比30:1的直流减速电机,需要注意的是需要带编码器作为位置反馈

  3. 一块电机驱动

电机驱动这里用的是L298N,使用非常简单。方向控制,其中一个高电平一个低电平就能控制电机转了,假设左边高是正转,那么右边高便是反转,同时为高或同时为低则不转。实际我们是输入两个脉冲波进行控制,脉冲的占空比决定转速。

  1. 电源供给

我这里用的是12V的航模电池,其实学生电源也行,不过单片机是需要3.3伏的电压,没有降压模块的同学可以用usb给板子供电(usb是5伏,不过板子上有降3.3伏的芯片),然后注意和航模电池共地就好了

  1. USB转TTL模块

    (图片来自淘宝)这个用于单片机通过串口向电脑反馈数据,然后通过上位机软件显示波形,便于观察和调试。上位机我这里用的是匿名的科创地面站v4.34。软件可以在他们的官网下载。 地址
    嫌麻烦的也可以直接看运动效果(~ ^_ ^~)

电路搭建


电路搭建比较简单,简单说一下,航模电池引出两路,一路通过降压模块给开发板和编码器供电,一路连接电机驱动L298N。开发板通过PA9,PA10连接USB转TTL模块。要注意的是电机的接口有6根线,两根是电机+和电机-,两根是编码器电源和地,两根是编码器A相B相。AB相连接PA6和PA7。然后电机驱动的方向控制连接PA0和PA1(图中还没连)。这里的电机+ -,方向的控制引脚,和编码器的AB连接引脚不用固定。只要后面软件设定的正转是你想要的正转就行了,不对就交换下引脚好了。

软件搭建

  1. PWM初始化 这些就没必要贴了,原子例程里一堆
  2. 编码器初始化
static void TIM3_Mode_Config(void)//TIM3编码器模式//PA6 ch1 //PA7 ch2
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//- 正交编码器输入引脚  // PA6 A  Pa7 BGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);                           /*- TIM4编码器模式配置 -*/TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Period = 65535;//设定计数器自动重装值TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);              TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//配置编码器模式触发源和极性4倍频TIM_ICStructInit(&TIM_ICInitStructure);   //配置滤波器TIM_ICInitStructure.TIM_ICFilter = 6;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能或者失能指定的TIM中断TIM3->CNT = 0;//初始值为0TIM_Cmd(TIM3, ENABLE);   //启动TIM3定时器
}
  1. 串口初始化

串口初始化比较简单,不过串口通信协议需要按照匿名上位机的写,这个在上位机里有相关协议和例程。

  1. 定时器初始化

    假定10ms控制一次

  2. 简单的PID程序
    这大概是最简单的PID了

    ``

PID控制里一定要考虑的(重点)

网上的教程,原理讲的很透,但是实际运用起来,有些东西是必须要说明的

1 PWM的重装载值

这个值选择100或者10000,同一个函数运行起来,效果绝对是不一样的,本文选择1000(随缘取的,感觉不错,大家也可以选择100,10000,或者其他的~ ^ ^ ~),记住这个值,我们的PID控制输出最高值就应向这个值看齐
2 控制周期

这个值也非常重要,它既影响了控制效果(10ms控制一次和1s控制一次是不一样的),也影响了速度反馈的数值。我的速度反馈算法是最简陋的,算一个控制周期里编码器反馈的脉冲数。控制周期我选择 10ms,所以这里速度的单位为( cnt/10ms

3 期望值的范围

本文的的期望值就是希望得到的速度,这个值不是随便给的,粗略计算一下,假设我们的电机一秒最多能5圈,假设1圈1560个脉冲,那么1s反馈的脉冲数为1560*5=7800,在10ms里最多78个脉冲,所以我们的期望值应设在 -78到78(小数就不考虑了) 之间(单位 cnt/10ms

4 输出值的范围

因为我们的pwm最大值为1000,那么我希望我的PID控制在(0——1200)之间比较合适,略微超出的限下幅就很舒服,假如输出范围为(0——10000),这就不太合理,超过1000的值都被限幅了,相当于整个电机大部分时间都在满转速运动(就变成了开环控制),控制效果就不好了。
假如如我期望速度为30,而刚开始的速度反馈为0,那么第一次控制的偏差error就为30,一开始我们确实是希望电机能满电压运行,然后当速度提到7左右的时候,电机加速度就应该慢慢减弱,最后让速度能够平滑地变成10。那么这个Kp值大概多少比较好呢,首先Kp=1.0是没用的,30的pwm连电机都动不了~ … ~,那么10呢,初始输出为300,电机应该处于刚起转的地步,理论上的Kp值应该是10的数倍,不过我也是刚上手,先设个10.0看看效果

参数整定

东西已经弄好了,我们来试试效果吧

试试P=10,i=0,d=0的效果(期望速度为30cnt/10ms)
以下部分还待编辑

从图中我们可以看到看到,电机在转过3000后往回减了一点,然后就不动了,这说明存在静差。然后计算下时间,从哪开始动到稳定,2305-2168=137(看横坐标),就是1370ms,这便是调整时间。下一步,我们应该按照网上给的口诀,先调整P大到接近等幅震荡。

之后,加一些d,你会发现它没那么震荡了,这时候再稍稍调高一下p,如果对系统要求不高,就ok了。
这里加一句,p参数形象的理解就是响应速度,d就是阻尼。一个好的系统,既要有不错的响应,也应有适当的阻尼,稳定性才好。至于i,在pd调完之后,加一点,比如p参数的1/100,主要用于减少静态误差,但实际上我们都是动态控制,它可有可无。

用电机进行简单的PID参数整定相关推荐

  1. 我的四轴专用PID参数整定方法及原理

    给四轴调了好久的PID,总算是调好了,现分享PID参数整定的心得给大家,还请大家喷的时候手下留情. 首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么'只 ...

  2. 学习制作平衡小车:(四)PID学习、位置PID参数整定以及匿名上位机显示

    一.PID学习 PID的知识网上有很多教学讲解的非常清楚,可以再参考学习[平衡小车之家]的视频教程. 二.位置PID学习 位置PID控制公式为:Pwm=Kp*e(K)+Ki*∑e(K)+Kd[e(K) ...

  3. 我的四轴专用PID参数整定方法及原理---超长文慎入(转)

    给四轴调了好久的PID,总算是调好了,现分享PID参数整定的心得给大家,还请大家喷的时候手下留情. 首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么'只 ...

  4. matlab求系统根轨迹代码_根轨迹法、PID参数整定和matlab指令计算

    收获 (1)理解根轨迹的概念及其在控制系统设计中的作用: (2)手绘根轨迹草图,以及如何使用极端及绘制根轨迹: (3)熟悉在反馈控制系统中应用广泛的关键部件:PID控制器: (4)理解根轨迹在参数设计 ...

  5. 一个实例说明PID 参数整定

    引言:PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解.     1.比例控制 ...

  6. 【控制理论】——控制系统分类PID算法简介PID参数整定PID上位机通信协议

    目录 ​ 前言 一.PID算法 1.控制系统分类&参数&信号 2.PID算法简介 二.PID参数整定 三.PID上位机通信协议 1.数据帧&协议调试 2.协议代码实现 拓展: ...

  7. 基于入门级粒子群算法的PID参数整定(MATLAB2016b-simulink)(超详细01)

    PID算法作为工业或日常生活中常用的控制算法,想必大家都不陌生,依靠误差反馈来消除误差,关于PID的原理部分相比看这篇博客的同学应该都十分清楚,有不清楚的同学可以百度或知网搜索.PID算法的应用程度很 ...

  8. 基于遗传算法的PID参数整定研究(七)

    基于遗传算法的PID参数整定研究 在前述深入了解PID参数的含义.基于常规人工的PID参数整定.以及所运用的遗传算法的介绍与应用后,紧接着进入应用遗传算法的PID参数整定,实现了Simulink仿真与 ...

  9. 自动控制原理PID参数整定的Matlab实现

      以一道题为例介绍调节PID控制器系数的方法,有:试凑法(Trial-and-Error Method).齐格勒-尼科尔斯校正规则(Ziegler and Nichols First Method. ...

  10. 机器人控制——PID参数整定

    (1)首先选择一个合适的并且尽量短的采样时间让系统工作: (2)首先加入比例环节,调节比例系数,直到系统的输出出现临界振荡: (3)若单独的比例环节不能满足设计要求,则此时加入积分环节,调整好的比例系 ...

最新文章

  1. PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
  2. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能
  3. HTML常见小问题2
  4. IE6中Form.submit不提交的问题
  5. (43)内存装载驱动
  6. wxWidgets:展示了如何在 wxWidgets 中使用 C++ 异常
  7. 自动,MySQL触发器,完整详细可收藏
  8. php 显示变量类型
  9. vscode安装swift插件_使用 Webpack 优化 VS Code 插件加载性能
  10. c++读取utf8文件_Node.js 进阶之 fs 文件模块学习
  11. python使用大漠插件进行脚本开发的尝试(一)
  12. srs流媒体服务器windows_基于SRS构建的直播平台的监控系统的搭建思路与实现方法...
  13. oracle查询当天数据三种方式性能对比
  14. 一文梳理2021年常见消息中间件MQ与RabbitMQ面试题
  15. 自部署IPA在线安装服务源码
  16. TryHackMe-Gatekeeper
  17. mysql数据库访问记录_MySQL数据库运行、访问记录与日志
  18. Python 第三方模块 统计1 statsmodels模块1 简介,回归
  19. 100天单词学习计划
  20. 玉雕工作室php,吴春强玉雕大师—吴春强玉雕工作室

热门文章

  1. 读书笔记:《产品经理手册》(第4版)
  2. 轻轻松松背单词软件测试,扇贝单词历史版本
  3. 【图像检索】基于Hu不变矩图像检索含Matlab源码
  4. 移动机器人运动控制算法入门
  5. 分析法 :3W1H --- 5W1H 的解释
  6. 韩立刚计算机网络——第三章:数据链路层
  7. 翁凯java进阶_翁凯-----java课程入门与进阶1
  8. Android Studio 配置 NDK 开发编译环境
  9. Qt Designer界面简介
  10. linux扫描仪如何使用方法,怎样在linux下设置和使用扫描仪.doc