极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8569|回复: 1

平衡車求助

[复制链接]
发表于 2014-3-25 13:46:56 | 显示全部楼层 |阅读模式
我用了這段代碼 當車車向后傾時要向前走 但向前傾時不會向后走

求大神們幫幫助


  1. unsigned char Re_buf[11],counter=0;
  2. unsigned char sign=0;
  3. int M11=5;
  4. int M12=6;
  5. int M21=9;
  6. int M22=10;

  7. float a[3],w[3],Angle[3],T;
  8. short sAccelerat[3],sAngleVelocity[3],sAngle[3],sT;
  9. void setup() {
  10.   // initialize serial:
  11.   Serial.begin(115200);
  12.   pinMode(M11,OUTPUT);analogWrite(M11,0);
  13.   pinMode(M12,OUTPUT);analogWrite(M12,0);
  14.   pinMode(M21,OUTPUT);analogWrite(M21,0);
  15.   pinMode(M22,OUTPUT);analogWrite(M22,0);
  16. }
  17. void SetMotor(float v1,float v2)
  18. {
  19.   if (v1>255){v1=255;analogWrite(M11,0);analogWrite(M12,v1);}
  20.   else if (v1>0) {analogWrite(M11,0);analogWrite(M12,v1);}
  21.   else if (v1>-255) {analogWrite(M12,0);analogWrite(M11,-v1);}
  22.   else  {v1=-255;analogWrite(M12,0);analogWrite(M11,-v1);}
  23.   
  24. if (v2>255){v2=255;analogWrite(M21,0);analogWrite(M22,v2);}
  25.   else if (v2>0) {analogWrite(M21,0);analogWrite(M22,v2);}
  26.   else if (v2>-255) {analogWrite(M22,0);analogWrite(M21,-v2);}
  27.   else {v2=-255;analogWrite(M22,0);analogWrite(M21,-v2);}  
  28. }

  29. float PID1(float e,float kp,float ki,float kd)
  30. {
  31.   static float es=0,sum=0;
  32.   float r;
  33.   sum+=e;
  34.   r = kp*e+ki*sum+kd*(e-es);
  35.   es=e;
  36.   return r;  
  37. }
  38. float PID2(float e,float kp,float ki,float kd)
  39. {
  40.   static float es=0,sum=0;
  41.   float r;
  42.   sum+=e;
  43.   r = kp*e+ki*sum+kd*(e-es);
  44.   es=e;
  45.   return r;  
  46. }
  47. void loop() {
  48.   float kp=30,ki=0.0,kd=10,r1,r2;
  49.   if (sign==0) return;//sign为数据更新标志,每隔10ms更新一次,也就是说以下代码每隔10ms控制一次。
  50.   sign=0;
  51.   kd = (float)analogRead(0)/1024*200;
  52.   r1=PID1(Angle[0],kp,ki,kd);//PID1、PID2函数就是第四节的PID函数,为了区分左右轮,所以分成两个。
  53.   r2=PID2(Angle[0],kp,ki,kd);
  54.   SetMotor(r1,r2);//设置电机转速。
  55.   Serial.print("angle:");
  56.   Serial.print(Angle[0]);Serial.print(" ");
  57.   Serial.print(r1);Serial.print(" ");
  58.   Serial.println(kd);Serial.print(" ");
  59. }

  60. void serialEvent() {
  61.   while (Serial.available()) {
  62.    
  63.     //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
  64.   
  65.     Re_buf[counter]=(unsigned char)Serial.read();
  66.     if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头              
  67.     counter++;      
  68.     if(counter==11)             //接收到11个数据
  69.     {   
  70.        counter=0;               //重新赋值,准备下一帧数据的接收
  71.        switch(Re_buf [1])
  72.         {
  73.         case 0x51:
  74.                 a[0] = float(short(Re_buf [3]<<8| Re_buf [2]))/32768*16;
  75.                 a[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*16;
  76.                 a[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*16;               
  77.                 break;
  78.         case 0x52:
  79.                 w[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*250;
  80.                 w[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*250;
  81.                 w[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*250;
  82.                 break;
  83.         case 0x53:
  84.                 Angle[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*180;
  85.                 Angle[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*180;
  86.                 Angle[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*180;
  87.                 T =  float(short(Re_buf [9]<<8| Re_buf [8]));///340.0+36.25   
  88.                 sign=1;
  89.                 break;
  90.         }
  91.     }      
  92.   }
  93. }
复制代码
回复

使用道具 举报

发表于 2014-3-25 13:55:44 | 显示全部楼层
本帖最后由 Super169 于 2014-3-25 13:57 编辑

Sorry, 看錯了....自刪...
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-11 04:01 , Processed in 0.060232 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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