关于PID算法在MCU上是这样实现的
最近,在学习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值的,我
由于前期的脉冲捕获和他的方法不同,现在还可以用他的方法吗?还有如果不行的话,我怎样才能使小车两个轮子的速度进行分档呢?
我的设计思路里面,没有时间的概念,所有的时间都用脉冲数代替了。
各位大牛请帮我看看,我这样做可以吗?顺便看下我下面遇到的三个问题,我该怎么办?谢了。
用定时器中断计一下数就是时间,这样就能算出转速。 a136498491 发表于 2015-7-31 02:14
用定时器中断计一下数就是时间,这样就能算出转速。
也就是说,我前面和别人不一样,后面也可以用定时器中断了,那么定时器的频率是在哪里设定的,怎才知道定时器是多少秒才中断一次呢 关键在于控制速度,速度控制好就能转弯了。你老是提左右轮,意义不大。 我感觉就控制单轮的速度,控制好了就OK.速度和电流成正比,电流和PWM占空比正比? wind2100 发表于 2015-7-31 08:46
关键在于控制速度,速度控制好就能转弯了。你老是提左右轮,意义不大。 我感觉就控制单轮的速度,控制好了 ...
我用左右轮,只是作为一个依照,速度的问题,因为没有时间,所以我也不知道。
另外,可以帮我看下3楼中的问题吗?定时器这块我不熟。 yick 发表于 2015-7-31 07:48
也就是说,我前面和别人不一样,后面也可以用定时器中断了,那么定时器的频率是在哪里设定的,怎才知道定 ...
看你的单片机使用手册,或者比着例程改改也行。一般我是两个都看。。 定时采集左右轮码盘计数,作为实际‘速度’,真正的设定速度可以计算转化为码盘的计数,即设定‘速度’,这两个带''的速度都是指码盘的速度,用这个差值作为偏差,输入PID系统就行。如果要求实际速度,当然也可以换算成实际的速度,根据码盘有效半径和轮胎有效半径转化,然后输入PID系统。 destiny、 发表于 2015-7-31 10:05
定时采集左右轮码盘计数,作为实际‘速度’,真正的设定速度可以计算转化为码盘的计数,即设定‘速度’,这 ...
你说的很对,那么我现在只需要在定时器中断里来处理相应的脉冲计数就好了,可是我怎么知道什么时候(每隔多长时间)进定时器中断呢? 中断程序不是你主动进入的,是硬件自动进入的。比如定时器中断程序,当你设置了定时时间并且启动了定时中断后,定时器开始自动计时,当计时时间到后,CPU硬件就中断当前正在运行的程序,自动进入定时中断程序运行。当定时中断程序运行完后又返回之前被打断的程序继续运行,当下一次定时时间到达又重复上述过程。 lans0625 发表于 2015-7-31 16:18
中断程序不是你主动进入的,是硬件自动进入的。比如定时器中断程序,当你设置了定时时间并且启动了定时中断 ...
你说的对,那么我该怎么知道它是什么时候进入定时器中断了呢,每隔多少秒,是开始程序运行就已经设置好了(如:72Mhz),
还是要再对一个定时器使能一下,设参数什么的。
我没有系统的学习过STM32,请指正一下。谢谢了 yick 发表于 2015-7-31 22:45
你说的对,那么我该怎么知道它是什么时候进入定时器中断了呢,每隔多少秒,是开始程序运行就已经设置好了 ...
在初始化中设置。
定时的时间由你设定,比如10秒产生一次中断,或者0.1秒。。。。一般和CPU的主频没有多大关系。 lans0625 发表于 2015-7-31 23:07
在初始化中设置。
定时的时间由你设定,比如10秒产生一次中断,或者0.1秒。。。。一般和CPU的主频没有多 ...
好的,我试一下,多谢啊, yick 发表于 2015-7-31 15:38
你说的很对,那么我现在只需要在定时器中断里来处理相应的脉冲计数就好了,可是我怎么知道什么时候(每隔 ...
看你的速度和轨迹要求了,比如飞思卡尔,实时性比较高,采集周期一般在10ms左右。 destiny、 发表于 2015-8-1 08:17
看你的速度和轨迹要求了,比如飞思卡尔,实时性比较高,采集周期一般在10ms左右。 ...
我的要求没那么高,编码格是20格的 自己想的不一定对:
你可以位置闭环,根据位置给定,位置闭环调节得到转速给定,然后再转速闭环,得到电压给定。
假设小车在xy坐标原点沿y轴前进,如果只有转速闭环,在初始调节的过程中,两轮积累的位置误差会让小车偏移一个角度后走直线,也就是说小车的x、y坐标会同时变化。
若位置闭环,在初始调节的过程中,两轮积累的位置误差会被纠正,小车运行过程中x坐标不会变化,会沿着平行于y轴的方向前进。
页:
[1]