搜索
bottom↓
回复: 14

关于PID算法在MCU上是这样实现的

[复制链接]

出0入0汤圆

发表于 2015-7-30 23:27:09 | 显示全部楼层 |阅读模式
最近,在学习PID算法,算是大致了解了一下,同时也准备了PID算法实现的准备工作(智能小车)。

实验目的:
①让小车左右两轮物理速度相等,使其走直线;
②可以对小车左右轮子进行调速,使其做各种运动;


先说下我的思路,
我是用PWM来控制电机的转速,改变占空比来改变其速度状态。问题是在相同的占空比下,两个电机因为各种因素速度是不一样的。
所以我就需要调节其占空比来调节两轮子的速度,在调节之前,我要知道两轮子的实际物理速度,于是我就在两个电机分别旁加了
编码器(光栅盘+光电开关),用的理论是外设中断上升沿触发的方式来进行脉冲计数。一定时间内,脉冲的多少就代表着小车的速
度的快慢,取其一个轮子为定值,这样,我就知道另一个轮子是快了还是慢了,我就可以用PID算法来进行调节了。

关于‘PID’本身的实现过程先不说,这一部分,我参考了很多资料,也在论坛上找了相应的源码,但是想要深入了解,还需要其整定过程。
可整定过程的实现,PID算法必须要在MCU上完整的体现出来。

所以,在main函数里,我用一个轮子的脉冲数表示其PID的设定值(期望值)和另一个轮子的脉冲值相减,得到误差值利用PID中的比例、
积分、微分放大修正其中一个轮子的PWM值,最终使它和另一个轮子物理速度相同。我的设计思路里面,没有时间的概念,所有的时间
都用脉冲数代替了。

现在,问题来了:
①我这样的思路可行吗?(我看别人tim4146,都是用定时器做的)

②PWM_OUT+= incPIDcalc(PIDtypedef*PIDx,u16 nextpoint)和PWM_OUT= incPIDcalc(PIDtypedef*PIDx,u16 nextpoint)是不是一样的
只是他们的比例系数不同,其它的那个好些,那个容易调一些;

③因为我后期还要进行速度分等级调节,那么我再以其中的一个轮子的脉冲数为参照物,来调节另一个轮子的速度,似乎已经行不通了,
论坛里tim4146(http://www.amobbs.com/forum.php?mod=viewthread&tid=5575823)用的是TIM6_IRQHandler来处理PID值的,我
由于前期的脉冲捕获和他的方法不同,现在还可以用他的方法吗?还有如果不行的话,我怎样才能使小车两个轮子的速度进行分档呢?
我的设计思路里面,没有时间的概念,所有的时间都用脉冲数代替了。

各位大牛请帮我看看,我这样做可以吗?顺便看下我下面遇到的三个问题,我该怎么办?谢了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-7-31 02:14:13 | 显示全部楼层
用定时器中断计一下数就是时间,这样就能算出转速。

出0入0汤圆

 楼主| 发表于 2015-7-31 07:48:50 | 显示全部楼层
a136498491 发表于 2015-7-31 02:14
用定时器中断计一下数就是时间,这样就能算出转速。

也就是说,我前面和别人不一样,后面也可以用定时器中断了,那么定时器的频率是在哪里设定的,怎才知道定时器是多少秒才中断一次呢

出0入0汤圆

发表于 2015-7-31 08:46:00 | 显示全部楼层
关键在于控制速度,速度控制好就能转弯了。你老是提左右轮,意义不大。 我感觉就控制单轮的速度,控制好了就OK.  速度和电流成正比,电流和PWM占空比正比?

出0入0汤圆

 楼主| 发表于 2015-7-31 09:26:37 | 显示全部楼层
wind2100 发表于 2015-7-31 08:46
关键在于控制速度,速度控制好就能转弯了。你老是提左右轮,意义不大。 我感觉就控制单轮的速度,控制好了 ...

我用左右轮,只是作为一个依照,速度的问题,因为没有时间,所以我也不知道。
另外,可以帮我看下3楼中的问题吗?定时器这块我不熟。

出0入0汤圆

发表于 2015-7-31 09:50:18 | 显示全部楼层
yick 发表于 2015-7-31 07:48
也就是说,我前面和别人不一样,后面也可以用定时器中断了,那么定时器的频率是在哪里设定的,怎才知道定 ...

看你的单片机使用手册,或者比着例程改改也行。一般我是两个都看。。

出0入0汤圆

发表于 2015-7-31 10:05:19 | 显示全部楼层
定时采集左右轮码盘计数,作为实际‘速度’,真正的设定速度可以计算转化为码盘的计数,即设定‘速度’,这两个带''的速度都是指码盘的速度,用这个差值作为偏差,输入PID系统就行。如果要求实际速度,当然也可以换算成实际的速度,根据码盘有效半径和轮胎有效半径转化,然后输入PID系统。

出0入0汤圆

 楼主| 发表于 2015-7-31 15:38:27 | 显示全部楼层
destiny、 发表于 2015-7-31 10:05
定时采集左右轮码盘计数,作为实际‘速度’,真正的设定速度可以计算转化为码盘的计数,即设定‘速度’,这 ...

你说的很对,那么我现在只需要在定时器中断里来处理相应的脉冲计数就好了,可是我怎么知道什么时候(每隔多长时间)进定时器中断呢?

出0入0汤圆

发表于 2015-7-31 16:18:23 | 显示全部楼层
中断程序不是你主动进入的,是硬件自动进入的。比如定时器中断程序,当你设置了定时时间并且启动了定时中断后,定时器开始自动计时,当计时时间到后,CPU硬件就中断当前正在运行的程序,自动进入定时中断程序运行。当定时中断程序运行完后又返回之前被打断的程序继续运行,当下一次定时时间到达又重复上述过程。

出0入0汤圆

 楼主| 发表于 2015-7-31 22:45:22 | 显示全部楼层
lans0625 发表于 2015-7-31 16:18
中断程序不是你主动进入的,是硬件自动进入的。比如定时器中断程序,当你设置了定时时间并且启动了定时中断 ...

你说的对,那么我该怎么知道它是什么时候进入定时器中断了呢,每隔多少秒,是开始程序运行就已经设置好了(如:72Mhz),
还是要再对一个定时器使能一下,设参数什么的。

我没有系统的学习过STM32,请指正一下。谢谢了

出0入0汤圆

发表于 2015-7-31 23:07:41 | 显示全部楼层
yick 发表于 2015-7-31 22:45
你说的对,那么我该怎么知道它是什么时候进入定时器中断了呢,每隔多少秒,是开始程序运行就已经设置好了 ...

在初始化中设置。
定时的时间由你设定,比如10秒产生一次中断,或者0.1秒。。。。一般和CPU的主频没有多大关系。

出0入0汤圆

 楼主| 发表于 2015-7-31 23:53:27 | 显示全部楼层
lans0625 发表于 2015-7-31 23:07
在初始化中设置。
定时的时间由你设定,比如10秒产生一次中断,或者0.1秒。。。。一般和CPU的主频没有多 ...

好的,我试一下,多谢啊,

出0入0汤圆

发表于 2015-8-1 08:17:52 | 显示全部楼层
yick 发表于 2015-7-31 15:38
你说的很对,那么我现在只需要在定时器中断里来处理相应的脉冲计数就好了,可是我怎么知道什么时候(每隔 ...

看你的速度和轨迹要求了,比如飞思卡尔,实时性比较高,采集周期一般在10ms左右。

出0入0汤圆

 楼主| 发表于 2015-8-1 10:09:05 | 显示全部楼层
destiny、 发表于 2015-8-1 08:17
看你的速度和轨迹要求了,比如飞思卡尔,实时性比较高,采集周期一般在10ms左右。 ...

我的要求没那么高,编码格是20格的

出0入0汤圆

发表于 2015-9-16 22:38:19 | 显示全部楼层
自己想的不一定对:
你可以位置闭环,根据位置给定,位置闭环调节得到转速给定,然后再转速闭环,得到电压给定。

假设小车在xy坐标原点沿y轴前进,如果只有转速闭环,在初始调节的过程中,两轮积累的位置误差会让小车偏移一个角度后走直线,也就是说小车的x、y坐标会同时变化。
若位置闭环,在初始调节的过程中,两轮积累的位置误差会被纠正,小车运行过程中x坐标不会变化,会沿着平行于y轴的方向前进。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 22:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表