注册 登录
查看: 464|回复: 4

[平衡组] 关于官方直立程序【速度PID控制】的两个问题,求高手指教!!!!非常感激!

[复制链接]
发表于 2014-4-26 16:07:36 | 显示全部楼层 |阅读模式
在官方的直立程序中,在速度PID控制那一块的程序是这样的:
void MotorSpeedAdjustCal(void)
{
int nLeftSpeed, nRightSpeed;
int nDeltaValue, nP, nI;
int nSpeed;

nLeftSpeed = (int)g_nLeftMotorSpeedCount;
nRightSpeed = (int)g_nRightMotorSpeedCount;
nSpeed = (nLeftSpeed + nRightSpeed) / 2;

nDeltaValue = g_nMotorSpeedSet - nSpeed;
nP = mult_r(nDeltaValue, MOTOR_SPEED_P_INT);
nI = mult_r(nDeltaValue, MOTOR_SPEED_I_INT);
// nP = nDeltaValue * MOTOR_SPEED_P;
// nI = nDeltaValue * MOTOR_SPEED_I;

g_nMotorOutSpeedOld = g_nMotorOutSpeedNew;

g_nMotorOutSpeedKeep -= nI;
g_nMotorOutSpeedNew = (g_nMotorOutSpeedKeep >> 3) - nP;

if(g_nMotorOutSpeedKeep > MOTOR_OUT_MAX) g_nMotorOutSpeedKeep = MOTOR_OUT_MAX;
if(g_nMotorOutSpeedKeep < MOTOR_OUT_MIN) g_nMotorOutSpeedKeep = MOTOR_OUT_MIN;  

g_nLeftMotorOutKeep = g_nRightMotorOutKeep = g_nMotorOutSpeedKeep;
}
看来看去有两个问题不太明白,还望高手不吝赐教!!
问题一:为什么nPnI的公式一模一样,没有任何差别?那和直接用nI或者nP又有什么分别?
nP = mult_r(nDeltaValue, MOTOR_SPEED_P_INT);
nI = mult_r(nDeltaValue, MOTOR_SPEED_I_INT);
// nP = nDeltaValue * MOTOR_SPEED_P;
// nI = nDeltaValue * MOTOR_SPEED_I;
问题二:这两行代码是什么意思
g_nMotorOutSpeedKeep -= nI;
g_nMotorOutSpeedNew = (g_nMotorOutSpeedKeep >> 3) - nP;


回复

使用道具 举报

发表于 2014-4-26 16:23:32 | 显示全部楼层
没学过PID控制,这个我也不熟悉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-26 16:26:34 | 显示全部楼层
山外メ雲ジ 发表于 2014-4-26 16:23
没学过PID控制,这个我也不熟悉

多谢支持!希望更多路过的高手能看到,帮忙解答
回复 支持 反对

使用道具 举报

发表于 2014-4-26 23:33:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-27 00:35:59 | 显示全部楼层
锺离思涵 发表于 2014-4-26 23:33
看看这个帖子:
http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2013/01/07/2848974.html

嗯,非常感谢!!!但我还有个疑问,就是为什么要这样写(PID公式好像不是这样的):
fP = fDelta * SPEED_CONTROL_P;
fI = fDelta * SPEED_CONTROL_I;
SpeedControlIntegral += fI;
SpeedControlOutOld = SpeedControlOutNew;
SpeedControlOutNew = fP + SpeedControlIntegral;
如果我像下面这样写不知道对不对?
【课文上的PID公式是:E=K(p)*(iError-LastError) + K(i)*iError +K(d)*(iError-2*LastError+PreError)】
iError = SETPOINT - NextPoint;            //增量计算
PWM_Value= P_DATA*(iError-LastError) + I_DATA*iError ;
LastError=iError;
MotorPWMDuty += PWM_Value;
SpeedControlOutOld=SpeedControlOutNew;
SpeedControlOutNew=MotorPWMDuty;
回复 支持 反对

使用道具 举报

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

本版积分规则

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