OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2762|回复: 4

关于小车电机编码器测速的问题,救救孩纸吧大哥大姐大婶些

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-3-15
在线时间
4 小时
发表于 2020-3-25 23:20:39 | 显示全部楼层 |阅读模式
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;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-3-15
在线时间
4 小时
 楼主| 发表于 2020-3-26 10:59:01 来自手机 | 显示全部楼层
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2020-3-26 16:24:35 | 显示全部楼层
帮顶  
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-3-15
在线时间
4 小时
 楼主| 发表于 2020-3-26 17:48:45 来自手机 | 显示全部楼层
hou18 发表于 2020-3-26 16:24
帮顶

谢谢!!!!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-4-23
在线时间
1 小时
发表于 2020-6-9 15:35:23 | 显示全部楼层
楼主,解决了么?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 06:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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