注册 登录
查看: 366|回复: 8

[平衡组] 关于速度控制中脉冲计数时保不保留负号的问题的探讨,求喷!!求指教!!

[复制链接]
发表于 2014-5-1 00:27:40 | 显示全部楼层 |阅读模式
看往届的例程时发现有的在进行速度脉冲计数时,并没有保留负号,即把采集到的数据都绝对值化了,最终得到一个大于0的数。
可是想来想去,隐隐约约感觉到有点不对劲。
如果不保留负号(车子后退的话采集到的脉冲数是负的)的话,那么:
假设我们设定目标速度为0,刚开始车子后退,
则 【 iError = Set_Speed - Car_Speed 】是一个小于0的负数,通过PID运算出来的自然也是一个小于0的负数,速度控制输出 SpeedControlOut 自然也是一个小于0的负数。
那么 【 PowerValue = AngleControlOut - SpeedControlOut; //直立(速度控制+角度控制) 】
得出的绝对值将变小,导致车子由于惯性越发往后倒,而此时角度控制部分要马上响应,最终是车子速度还是保持后退状态,根本无法为设定的目标速度0.
而理论上,如果车子一开始就后退的话,由于目标速度为0,要使车子停下来,电机应该加快往后转才对,也就是说【 PowerValue = AngleControlOut - SpeedControlOut; //直立(速度控制+角度控制) 】得出的绝对值要不断增大。
那么,很明显之前不保留负号的做法是错误的!
不知各位看法如何,求喷,求指教!!!
回复

使用道具 举报

 楼主| 发表于 2014-5-1 09:54:30 | 显示全部楼层
自己顶一下
回复 支持 反对

使用道具 举报

发表于 2014-5-1 10:12:56 | 显示全部楼层
基本上都不存在后退的情况,所以往届的例程不用负数是没问题的。
平衡组才有可能后退,其实后退了,测到速度变大了,也没 所谓,限制电机最低速度就好了,就是要降速,所以电机速度要减下,等加速的时候,重新测到的速度是准确的。

实验才是检验真理的唯一标准。试过才知道行不行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-1 10:28:41 | 显示全部楼层
韦嘉淑 发表于 2014-5-1 10:12
基本上都不存在后退的情况,所以往届的例程不用负数是没问题的。
平衡组才有可能后退,其实后退了,测到速 ...

嗯,试了才知道,有道理。不知你们调试的过程中有没有遇到加速度中值一直变的情况,我们加速度计中值总是变,搞得很郁闷,有时跑着跑着车子就越来越倾斜了(中值变了)。这时又得重新调中值,非常麻烦,不知你有没有什么解决的方法
回复 支持 反对

使用道具 举报

发表于 2014-5-1 10:35:36 | 显示全部楼层
草原上的星星 发表于 2014-5-1 10:28
嗯,试了才知道,有道理。不知你们调试的过程中有没有遇到加速度中值一直变的情况,我们加速度计中值总是 ...

每次上电都重新读中值,不要用宏定义,改成变量的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-1 10:37:18 | 显示全部楼层
栾端静 发表于 2014-5-1 10:35
每次上电都重新读中值,不要用宏定义,改成变量的。

嗯,改成变量后该怎么做?有没有自动调整中值的方法?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-1 10:53:17 | 显示全部楼层
栾端静 发表于 2014-5-1 10:35
每次上电都重新读中值,不要用宏定义,改成变量的。

我改成变量了。速度控制这一块参考的是官方的程序,可是现在无论怎么调 I 参数,都起不到抑制车子的效果,我从1开始调的,现在都到小数点后6位了。。。。真心无语死了!!!而且我发现当 I 参数为0.1的时候车子倾斜的很厉害,调成0.01,然后稍微好一点,再调成0.001又稍微好一点。这是什么原理???理论上,车子只要有速度,它应该马上调节是速度为0才对啊,现在无论我怎么调都没有效果
回复 支持 反对

使用道具 举报

发表于 2014-5-21 10:35:51 | 显示全部楼层
你的速度闭环是有问题的,I没有起到调节作用,加上I后整个状态就不对了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-21 10:49:11 | 显示全部楼层
734168 发表于 2014-5-21 10:35
你的速度闭环是有问题的,I没有起到调节作用,加上I后整个状态就不对了。

我是模仿官方的例程做的,调 I 参数时效果不明显,只有调 P 参数时效果才比较明显,不知哪出了问题,求指教!
  1. CAR_speed=(MotorPulseSigma_L + MotorPulseSigma_R)/2;
  2.     CAR_speed=CAR_speed/20;                      //将脉冲数转成r/s.因为200线的编码器每转产生200个脉冲,这里定时100ms采集脉冲数

  3.     iError = SETPOINT - CAR_speed;            //增量计算
  4.     fP = iError * P_DATA;
  5.     fI = iError * (I_DATA);
  6.     SpeedControlIntegral += fI;

  7.     SpeedControlOutOld=SpeedControlOutNew;
  8.     SpeedControlOutNew=fP + SpeedControlIntegral;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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