极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9525|回复: 0

平衡車求助

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

求大神們幫幫助 我是用arduino uno v3 加6050

  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. if (v2>255){v2=255;analogWrite(M21,0);analogWrite(M22,v2);}
  24.   else if (v2>0) {analogWrite(M21,0);analogWrite(M22,v2);}
  25.   else if (v2>-255) {analogWrite(M22,0);analogWrite(M21,-v2);}
  26.   else {v2=-255;analogWrite(M22,0);analogWrite(M21,-v2);}  
  27. }

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

  59. void serialEvent() {
  60.   while (Serial.available()) {

  61.     //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code

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

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 15:23 , Processed in 0.038106 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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