做网站盈利,下载微信,承德网络推广,wordpress模板 charset当stm32RCT6使用位置环pid控制麦轮转动一定路程时#xff0c;在这个时间段内想让一边轮胎速度加大应该怎么做#xff1f;比如我pid的目标脉冲值为9000#xff0c;在运行到3000的时候车偏左了#xff0c;那我应该怎样让他回正#xff0c;我想到的办法是增加其最大的脉冲值在这个时间段内想让一边轮胎速度加大应该怎么做 比如我pid的目标脉冲值为9000在运行到3000的时候车偏左了那我应该怎样让他回正我想到的办法是增加其最大的脉冲值但在到达目标脉冲值前较多的时间内其速度是pwm波的最大值所以难以增大速度。还有办法是在pid函数中将其最大pwm输出的值限制为9000满pwm为10000当出现左偏的时候给左轮的pid算完的pwm进行加1000但实际效果难以看出现在应该用什么方法。 换种思路用pid速度环控速陀螺仪偏离后更改速度大小来矫正在使用pid时会记录脉冲数再使用位置环中的脉冲值相加来看圈数或目标位置到了直接pwm给0让其停。 在使用pwm让车停止时pid计算的定时器中pwm会重新赋值就会造成车在一瞬间停止过一会又会自动启动所以使用pwm让其停止不可取。 则可以直接设置目标速度为零让其停止在PID控制系统中目标速度是关键的输入信号。如果希望车辆停止最直接的方法就是将目标速度设置为0。 现在直接使用设置目标速度为0会停止但使用判断目标值是否到达后让其速度为0不能停止。 在对于目标值的判断开始放在主函数的while中但无法实现可能因为在执行别的代码 然后一位在定时器中断中的if判断可以不断地进行判断并且有优先级但在定时器中的if好像不能成功判断
最开始时是将其封装在一个函数中
void PanDuan(int b)
{if(Position_Lb || Position_Rb || Position_HLb || Position_HRb){Stop();}
}
void Stop(void)
{MuBiao(0,0,0,0);//给目标值为0速度将会清0但会有个过程
}
然后将其放在while中
if(Position_L Get_MuB() || Position_R Get_MuB() || Position_HL Get_MuB() || Position_HR Get_MuB() ){Stop();}
并且将目标值封装在一个函数中保证数值的准确
int Get_MuB(void)
{return MuB;}
然后放在定时器中断中但要明白定时器是一段时间进一次则不一定进的那一次恰好相等所以写为
if(Position_L Get_MuB() || Position_RGet_MuB() || Position_HLGet_MuB() || Position_HRGet_MuB()){Stop();}
当然在while中或一开始封装的函数中可以加else来判断是否成功进入if但定时器中不行会一直中断发数据会使程序卡死。
else
{Serial_SendByte(1);} 结语还在学习中如有错误还请大佬们指出有问题可相互交流