新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2020-3-15
- 在线时间
- 4 小时
|
5金钱
急急急!废话不多说了,直接步入正题。目的是做一个ps2遥控小车,下面定时器1中断是小车的控制逻辑部分,每5ms定时对小车速度进行增量式pid计算,主函数循环接收ps2的摇杆模拟量数据。然后小弟现在有个没搞明白的问题,我们知道pid调节是对偏差进行计算,由下面Get_RC()函数知道-128/2~+127/2对应反向最大速度和正向最大速度码值,Read_Encoder(u8 TIMX)函数获取的仅仅是霍尔编码器的脉冲数,按照pid调节的思路和我理解的这个程序意思,假如在给定100%码值63.5的时候要保证编码器在5ms内脉冲能等于63.5才能稳住在最大速度处(给定63.5-编码反馈63.5=0偏差,输出为0,速度恒住),但是经过我的计算1.5m/s最大速度390脉冲每圈不可能达到5ms有63个脉冲,所以想请教请教各路大神们,这个程序该怎么理解呢,万分感谢!感激涕零!为这个程序已经困惑我一周了 上班族耗不起了
/**************************************************************************
函数功能:所有的控制代码都在这里面
5ms定时中断
严格保证采样和数据处理的时间同步
**************************************************************************/
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetFlagStatus(TIM1,TIM_FLAG_Update)==SET)//5ms定时中断
{
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //===清除定时器1中断标志位
if(delay_flag==1)
{
if(++delay_50==5) delay_50=0,delay_flag=0; //给主函数提供20ms的精准延时
}
Encoder_Left=Read_Encoder(2); //===读取编码器的值 //为了保证M法测速的时间基准,首先读取编码器数据
Encoder_Right=-Read_Encoder(3); //===读取编码器的值
Get_RC(); //获取给定速度
Kinematic_Analysis(Velocity,Angle); //运动学分析计算后轮差速
Motor_A=Incremental_PI_A(Encoder_Left,Target_A); //===速度闭环控制计算电机A最终PWM
Motor_B=Incremental_PI_B(Encoder_Right,Target_B); //===速度闭环控制计算电机B最终PWM
Xianfu_Pwm(); //===PWM限幅
Set_Pwm(Motor_A,Motor_B,Servo); //===赋值给PWM寄存器
Key(); //===扫描按键状态 单击双击可以改变小车运行状态
}
}
/**************************************************************************
函数功能:遥控
入口参数:无
返回 值:无
**************************************************************************/
void Get_RC(void)
{
int Yuzhi=2;
float LY,RX;
LY=PS2_LY-128; //计算偏差
RX=PS2_RX-128;
if(LY>-Yuzhi&&LY<Yuzhi)LY=0; //小角度设为死区 防止抖动出现异常
if(RX>-Yuzhi&&RX<Yuzhi)RX=0;
Velocity=-LY/2; //速度和摇杆的力度相关。
Angle=RX/200;
}
/**************************************************************************
函数功能:单位时间读取编码器计数
入口参数:定时器
返回 值:速度值
**************************************************************************/
int Read_Encoder(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0; break;
case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0; break;
case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0; break;
default: Encoder_TIM=0;
}
return Encoder_TIM;
}
|
|