|
发表于 2016-1-29 16:46:43
|
显示全部楼层
大师,你这段程序,不是很明白,请教一下,如果上次的方向和这次的PID结果相反,这个不就不成立了么? 为什么不是先计算PID,然后根据PID正负来设置IO,数值来设置PWM。
===================================================
当PID输出为正数时,PC3输出低电平,PC1/TIM1_CC1输出高电平有效的PWM脉冲。=
===================================================
1. 根据上次的方向标志设置IO口,
2. 然后PID,
3. 最后根据PID的结果设置PWM。
if (direction & X_DIRECTION_FLAG)
{
GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
}
else
{
GPIO_WriteLow(GPIOC, GPIO_PIN_3);
}
// Change Y direction
if (direction & Y_DIRECTION_FLAG)
{
GPIO_WriteHigh(GPIOC, GPIO_PIN_5);
}
else
{
GPIO_WriteLow(GPIOC, GPIO_PIN_5);
}
// PID calculation
xError = xPID.targetValue - xPos;
yError = yPID.targetValue - yPos;
xPWM = calcPID(&xPID, xError);
yPWM = calcPID(&yPID, yError);
// Set the direction and OC polarity based on the PID output (takes effect on next PWM cycle)
if (xPWM >= 0)
{
direction &= (u8) ~X_DIRECTION_FLAG;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_LOW);
} |
|