PID详解3(摄像头循迹分析)

PID详解3(摄像头循迹分析)

看了那么多成功的案例和大佬们的分享、讲解,终于轮到我们自己来设计PID了。

首先需要分析的是,想要用PID,我们得先知道,我们需要通过传感器拿到哪些参数,我们处理后要得到的是什么参数,然后才是设计PID控制器。这个很重要,毕竟“方向”才是最重要的。在很多以后的工作中,也一定要先弄明白方向和目的,避免犯迷糊。

分析:
  1. 我们通过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:今天是见识到CSDN的鱼龙混杂了。。。看到好多个概念错误还写的贼自信,到处查资料,去伪存真,得到我下面的结论,应该是没什么问题了。

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=VD
所以到底这个compare值和车速的数学表达式关系到底是什么很难确定,不同的电机、不同的环境都有影响,所以大家还是借助自己手上的电机实体进行测试吧。。。

设计PID控制器

磨磨蹭蹭这么久,总算到了设计PID的时候,为了上面这一段PID真的是花了不少时间。。其实一开始就看手册反倒不会这么麻烦,都怪我太相信博文了。。。

分析

我们来分析这个摄像头传感器的PID巡线:

err是什么:巡线为目标,则轨迹下起点与图像中线的距离可以作为err。

P控制器

V = K P ∗ e r r ( t ) V =K_P*err(t) V=KPerr(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[t1])

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摄像头作为传感器。

  • 24
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值