当stm32RCT6使用位置环pid控制麦轮转动一定路程时,在这个时间段内想让一边轮胎速度加大应该怎么做?
比如我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_L==b || Position_R==b || Position_HL==b || Position_HR==b){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_R>=Get_MuB() || Position_HL>=Get_MuB() || Position_HR>=Get_MuB()){Stop();}
当然在while中或一开始封装的函数中可以加else来判断是否成功进入if,但定时器中不行,会一直中断发数据,会使程序卡死。
else
{Serial_SendByte(1);}
结语
还在学习中,如有错误还请大佬们指出,有问题可相互交流