极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 31098|回复: 17

平衡車求助!!

[复制链接]
发表于 2014-4-13 12:32:38 | 显示全部楼层 |阅读模式
本帖最后由 iohongwal 于 2014-4-13 15:13 编辑

我自己了一個平衡車 我是用芯片厰家提拱的代碼來做的 車子可以根劇angle來向前走和向後走 但是不平衡 各位大神幫我看看是車子的結構問題 還是甚麼問題 圖片不夠的可以叫我上傳  電機我是用田宮的70093 齒輪組是用高速的
這是我用的芯片


車子






  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. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-4-13 14:57:32 | 显示全部楼层
代码问题,代码呢,看下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 15:10:50 | 显示全部楼层
杨帅 发表于 2014-4-13 14:57
代码问题,代码呢,看下?

已添加代碼
回复 支持 反对

使用道具 举报

发表于 2014-4-13 18:21:33 | 显示全部楼层
iohongwal 发表于 2014-4-13 15:10
已添加代碼

朋友,你这个程序调的是PID,我没弄过,我只简单的弄过陀螺仪和加速度计。你帖子的第一张图片那个传感器叫什么名字是IMU吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 19:55:50 | 显示全部楼层
杨帅 发表于 2014-4-13 18:21
朋友,你这个程序调的是PID,我没弄过,我只简单的弄过陀螺仪和加速度计。你帖子的第一张图片那个传感器叫 ...

6軸陀螺仪MPU6050
回复 支持 反对

使用道具 举报

发表于 2014-4-14 09:13:23 | 显示全部楼层
你这车体, 有点奇葩
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 12:41:58 | 显示全部楼层
ranqingfa 发表于 2014-4-14 09:13
你这车体, 有点奇葩

其實我知道 但我不知怎樣設計好
回复 支持 反对

使用道具 举报

发表于 2014-4-14 13:48:15 | 显示全部楼层
我现在也在用mpu6050做呢,只不过用的是stm32控制的,能互相交流学习下么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 19:08:56 | 显示全部楼层
捡贝壳的孩子 发表于 2014-4-14 13:48
我现在也在用mpu6050做呢,只不过用的是stm32控制的,能互相交流学习下么

我不很懂PID算法那方面 我用了arduino pid library 但輸出只有0~255
回复 支持 反对

使用道具 举报

发表于 2014-4-14 22:25:00 | 显示全部楼层
iohongwal 发表于 2014-4-14 12:41
其實我知道 但我不知怎樣設計好

你起码看看别人怎么设计的啊  成功的案例
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 23:03:19 | 显示全部楼层
ranqingfa 发表于 2014-4-14 22:25
你起码看看别人怎么设计的啊  成功的案例

我有看迥過 其實那輛車銅柱我還未裝完 其實高點是不是會更好
回复 支持 反对

使用道具 举报

发表于 2014-4-15 09:18:35 | 显示全部楼层
iohongwal 发表于 2014-4-14 23:03
我有看迥過 其實那輛車銅柱我還未裝完 其實高點是不是會更好

最好是搞点,你的车轮距太宽
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 10:52:14 | 显示全部楼层
ranqingfa 发表于 2014-4-15 09:18
最好是搞点,你的车轮距太宽

重物放最上面嗎
回复 支持 反对

使用道具 举报

发表于 2014-4-15 20:07:05 | 显示全部楼层
不是啊  车体结构改变
回复 支持 反对

使用道具 举报

发表于 2014-4-15 20:07:23 | 显示全部楼层
iohongwal 发表于 2014-4-15 10:52
重物放最上面嗎

你看过我的车子么
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 15:36 , Processed in 0.040224 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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