2回答

1收藏

GD32方案分享11:金属巡线思路

GD32 GD32 3678 人阅读 | 2 人回复 | 2017-05-28

大致代码框架写完了,但是手头传感器和线圈数量不够,过两天置备齐全了再说吧。
巡线考虑到实际铺设,选择铝膜胶带,一卷才10块钱,是不是很划算,
传感器最少使用两个,一个的话无法知道相对位置,不知道左偏还是右偏
用两个传感器就可以计算出车与铝箔胶带的相对位置,得出相对误差,再通过这个相对误差控制舵机打角,当然要求不高的场合不需要使用PID算法,当然建议使用,PID的具体有经典的位置式和增量式的,一般这种方向控制的选择位置式的,电机速度控制选择增量式的,如下有示例代码,这两天还有别的事情,项目就先告一段落了,过两天补发视频
  1. int16 CarTurn(struct PID_Servo *Servo)
  2. {       
  3.    Servo->NowError = Servo->SetPoint - Servo->FeedBack;
  4.          Servo->Kp = (Servo->NowError * Servo->NowError)/2+Servo->Kp_Base;
  5.          if(( Servo->NowError  < DEADLINE ) && ( Servo->NowError  > -DEADLINE ) )//设置调节死区1
  6.    {;}//do nothing
  7.    else
  8.    {
  9.         Servo->Kd_Error = Servo->NowError - Servo->PreError;        //计算微分项偏差
  10.         Servo->Ki_ErrorSum += Servo->NowError;                            //存储当前积分偏差
  11.         Servo->PreError = Servo->NowError;                                //存储当前偏差       
  12.         Servo->Out =Servo->Kp * Servo->NowError
  13.                                                                  + Servo->Ki * Servo->Ki_ErrorSum  
  14.                                                                  + Servo->Kd * Servo->Kd_Error;                      //位置式PID算法
  15.         Servo->Out =Servo_MID + Servo->Out;
  16.                     if(Servo->Out >= Servo_MAX)                           //防止调节溢出 限幅
  17.         {
  18.             Servo->Out = Servo_MAX;
  19.         }
  20.         else if(Servo->Out <= Servo_MIN)
  21.         {
  22.             Servo->Out= Servo_MIN;       
  23.         }
  24.     }
  25.           return Servo->Out;
  26. }

  27. int16 CarSpeed(struct PID_Speed *Speed)
  28. {
  29.         Speed->NowError = Speed->SetPoint - Speed->FeedBack;        //当前偏差
  30.         Speed->Kp_Error = Speed->NowError - Speed->PreError;        //比例项
  31.         Speed->Kd_Error = Speed->Kp_Error - Speed->Pre_Kp_Error;    //微分项
  32.        
  33.         Speed->PreError = Speed->NowError;                          //存储误差
  34.         Speed->Pre_Kp_Error = Speed->Kp_Error;

  35.   if((Speed->NowError < V_DEADLINE) && (Speed->NowError > -V_DEADLINE))
  36.         {        //设置调节死区
  37.                 ;
  38.         }
  39.         else
  40.         {
  41.                 Speed->Out += Speed->Kp * Speed->Kp_Error
  42.                             + Speed->Ki * Speed->NowError
  43.                 + Speed->Kd * Speed->Kd_Error;               
  44.         }

  45.         if(Speed->Out >= SPEED_MAX)
  46.         {
  47.                 Speed->Out = SPEED_MAX;
  48.         }
  49.         else if(Speed->Out <= SPEED_MIN)
  50.         {
  51.                 Speed->Out = SPEED_MIN;
  52.         }
  53.         return Speed->Out;
  54. }
复制代码
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

suoma

发表于 2017-5-29 10:57:24 | 只看该作者

到时候来个巡线视频
板凳

何昌昕

发表于 2017-5-29 15:18:24 | 只看该作者

http://v.youku.com/v_show/id_XMjc5MDgxODg0NA==.html?spm=a2hzp.8253869.0.0
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条