jiangyue 发表于 2016-12-21 20:34:03

非常希望大家能帮小弟解答这段程序的意义

        ;程序的目的时求得两个轮子的速度矢量,但是却不知道为何是这样
    speed.left =TIM_GetCounter(TIM3)-0x7fff;
          speed.right=TIM_GetCounter(TIM4)-0x7fff;/

          speed.average*=0.7;
          speed.average+=((float)(speed.left+speed.right))*0.5*0.3       
                       TIM_SetCounter(TIM3, 0x7fff);
                  TIM_SetCounter(TIM4, 0x7fff);                                               

watershade 发表于 2016-12-22 21:42:27

jiangyue 发表于 2016-12-22 09:58
speed.average的用途使用做一个速度pid环的输入,大神还想请教一下,这个kp是如何确定的, ...

sorry。我用了Kp让你误以为这是PID控制。如果你了解滤波算法就知道这是一个滤波的一种方法。

正常情况下VA = (Vl + Vr )/2
但是如果你将前一次的平均值取一部分去中和新获取值的波动。这就挺好了。但是这还不是最好的。你可以根据你实际测得的波动看看波动的变化情况,在指定滤波的深度或者更改更好的滤波算法

jackten 发表于 2016-12-22 10:06:09

顶                                       

斜阳__ 发表于 2016-12-22 08:57:41

帮顶         

watershade 发表于 2016-12-21 21:01:29

显然程序应该设置TIM3和TIM7为编码器模式。而且设置初始值为0x7fff为初始值。应该是为了确定是正转还是反转。两个定时器分别记录一路的counter。正如代码注释一样一个是左轮,一个是右轮。

然后我们这里记speed.average为VA,左右轮的叫做Vl和Vr。
那么每一次更新后
VA_k = Kp * VA_(k-1) + (1 - Kp) *(Vl_k + Vr_k)/2
这里的Kp是0.7

那么这里的VA到底是干什么用的呐?是用来计算Vx和Vy以及Phi呐还是什么。就需要你提供如何利用VA的那段代码

5265325 发表于 2016-12-22 08:49:42

:lol:lol:lol:lol

jiangyue 发表于 2016-12-22 09:58:36

watershade 发表于 2016-12-21 21:01
显然程序应该设置TIM3和TIM7为编码器模式。而且设置初始值为0x7fff为初始值。应该是为了确定是正转还是反转 ...

speed.average的用途使用做一个速度pid环的输入,大神还想请教一下,这个kp是如何确定的,

ts2000 发表于 2016-12-22 14:58:34

看不明白。。。。帮顶吧

sssdd 发表于 2016-12-22 16:15:57

表达式是:
(左边轮速度+右边轮速度)/2 =平均速度矢量。
前面两句就是在求速度。定时测量,计数就是速度。
然后,PID?出来了。
真正的速度平均值=历史的速度值*0.7+当前的速度值*0.3.这个算1阶IIR滤波器,因数是0.3。
所以,最后一句只是个滤波函数。

anobodykey 发表于 2016-12-22 16:43:33

帮顶,帮顶
页: [1] 2
查看完整版本: 非常希望大家能帮小弟解答这段程序的意义