PID详解3(摄像头循迹分析)
看了那么多成功的案例和大佬们的分享、讲解,终于轮到我们自己来设计PID了。
首先需要分析的是,想要用PID,我们得先知道,我们需要通过传感器拿到哪些参数,我们处理后要得到的是什么参数,然后才是设计PID控制器。这个很重要,毕竟“方向”才是最重要的。在很多以后的工作中,也一定要先弄明白方向和目的,避免犯迷糊。
分析:
- 我们通过PWM波控制车轮速度,通过两轮差速完成转向,所以我们需要的参数是赋给两轮的车速,但又不是速度本身,而是 T I M S e t C o m p a r e x ( T I M x , a x 1 ) TIM_SetComparex(TIMx,ax1) TIMSetComparex(TIMx,ax1)中的这个ax1的值。它与车速之间的关系并不是很明确。这里我们来计算一下具体的关系,不然就是一个隐患:
ps:今天是见识到优快云的鱼龙混杂了。。。看到好多个概念错误还写的贼自信,到处查资料,去伪存真,得到我下面的结论,应该是没什么问题了。
PWM在初始化时,需要两个参数自主设定:
1.TIM_Period:=ARR 定时器周期,
也就是当计数器内的值变化到该值时,相关事件标志位。
2.TIM_Prescaler:定时器预分频,
时钟源内部时钟经过这个分频处理才是定时器的时钟
在通用定时器中,内部时钟72MHZ,所以定时器内部时钟
CLK = 72M / (TIM_Prescaler + 1) Hz
也就是计数器每1s该时钟增加CLK次
然后计数器内数字变化成为TIM_Period后,结束。
For example:
if TIM_Prescaler = (7200 - 1)
=> CLK = 72M / 7200 = 10K
if TIM_Period = 5000-1 (from 0 to 5000 = 5000-1)
==>> 定时为0.5s(周期)的定时器(5000*(1/10KHz))
周期: T = ( T I M P e r i o d + 1 ) ∗ ( T I M P r e s c a l e r + 1 ) 72 M T = \frac{(TIM_Period + 1)*(TIM_Prescaler+1)}{72M} T=72M(TIMPeriod+1)∗(TIMPrescaler+1)
在此给定的定时器之上,我们再调用
function:TIM_SetComparex(TIMx,CCRx)
来看看波形:
首先了解一下两个参数:
TIM_OCPolarity 和TIM_OCInitTypeDef.TIM_OCMode :
2 .1 TIM_OCPolarity = TIM_OCPolarity_High,
高电位为有效电平。
2 .2 TIM_OCPolarity = TIM_OCPolarity_low,
低电位为有效电平。
1 .1 若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM1时:
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平
1 .2 若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM2时:
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平
这里我找到一个图:显然这里是
TIM_OCPolarity_High、TIM_OCMode_PWM2;
和
TIM_OCPolarity_low、TIM_OCMode_PWM1
初始为低电平,未到设定值时时低电平
这个图很容易让我们知道PWM的形成了,以及占空比的概念也很形象了。
占空比D = (t2 - t1)/t2 ,但这里我们并不能直接得到时间轴上的值,因此我们从比例相同的角度,用计数值来表示这个量。
D
=
1
−
(
C
C
R
/
(
A
R
R
+
1
)
D = 1 - (CCR/(ARR+1)
D=1−(CCR/(ARR+1)
~~~~
若采用High PWM1或Low 2,图有所变化
D = C C R / ( A R R + 1 ) D = CCR/(ARR+1) D=CCR/(ARR+1)
D的作用:
很多人抓到PWM都知道,我靠控制占空比控制车速,但其实很多人都不知道为什么可以控制,都是似懂非懂罢了。
这里其实要从电机角度来,其实占空比最终的目的是改变电机的电枢电压。
V
l
=
V
∗
D
V_l= V * D
Vl=V∗D
所以到底这个compare值和车速的数学表达式关系到底是什么很难确定,不同的电机、不同的环境都有影响,所以大家还是借助自己手上的电机实体进行测试吧。。。
设计PID控制器
磨磨蹭蹭这么久,总算到了设计PID的时候,为了上面这一段PID真的是花了不少时间。。其实一开始就看手册反倒不会这么麻烦,都怪我太相信博文了。。。
分析
我们来分析这个摄像头传感器的PID巡线:
err是什么:巡线为目标,则轨迹下起点与图像中线的距离可以作为err。
P控制器
V = K P ∗ e r r ( t ) V =K_P*err(t) V=KP∗err(t)
D控制器
V V V+= K D ∗ ( e r r [ t ] − e r r [ t − 1 ] ) K_D*(err[t]-err[t-1]) KD∗(err[t]−err[t−1])
I控制器
A
L
L
e
r
r
ALLerr
ALLerr+=err(t)$$
V
V
V+=
K
I
∗
(
A
L
L
e
r
r
)
K_I*(ALLerr)
KI∗(ALLerr)
最后的
TIM_sercmparex(TIMx,compare1)
TIM_sercmparey(TIMx,compare2)
compare1 = fixed + V
compare2 = fixed - V
具体实操
xxx-4.1
完成理论分析
4.1-
完成理论分析下一步我们就要开始实际设计编程了。
这里我们采用的是OV7725摄像头作为传感器。