极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9548|回复: 0

求大神們 幫助解釋下 程碼的意思 我不是很懂

[复制链接]
发表于 2014-3-21 23:13:43 | 显示全部楼层 |阅读模式
這是串口MPU6050 的PID 示範程式 我不是看得很懂

  1. /*
  2. This code is used for connecting arduino to serial mpu6050 module, and test in arduino uno R3 board.
  3. connect map:
  4. arduino   mpu6050 module
  5. VCC    5v/3.3v
  6. RX     TX->1
  7. GND    GND
  8. note:
  9. because arduino download and mpu6050 are using the same serial port, you need to un-connect 6050 module when you want to download program to arduino.
  10. Created 14 Nov 2013
  11. by Zhaowen

  12. serial mpu6050 module can be found in the link below:
  13. http://item.taobao.com/item.htm?id=19785706431
  14. */

  15. unsigned char Re_buf[11],counter=0;
  16. unsigned char sign=0;
  17. int M11=5;
  18. int M12=6;
  19. int M21=9;
  20. int M22=10;

  21. float a[3],w[3],Angle[3],T;
  22. short sAccelerat[3],sAngleVelocity[3],sAngle[3],sT;
  23. void setup() {
  24.   // initialize serial:
  25.   Serial.begin(115200);
  26.   pinMode(M11,OUTPUT);analogWrite(M11,0);
  27.   pinMode(M12,OUTPUT);analogWrite(M12,0);
  28.   pinMode(M21,OUTPUT);analogWrite(M21,0);
  29.   pinMode(M22,OUTPUT);analogWrite(M22,0);
  30. }
  31. void SetMotor(float v1,float v2)
  32. {
  33.   if (v1>255){v1=255;analogWrite(M11,0);analogWrite(M12,v1);}
  34.   else if (v1>0) {analogWrite(M11,0);analogWrite(M12,v1);}
  35.   else if (v1>-255) {analogWrite(M12,0);analogWrite(M11,-v1);}
  36.   else  {v1=-255;analogWrite(M12,0);analogWrite(M11,-v1);}
  37.   
  38. if (v2>255){v2=255;analogWrite(M21,0);analogWrite(M22,v2);}
  39.   else if (v2>0) {analogWrite(M21,0);analogWrite(M22,v2);}
  40.   else if (v2>-255) {analogWrite(M22,0);analogWrite(M21,-v2);}
  41.   else {v2=-255;analogWrite(M22,0);analogWrite(M21,-v2);}  
  42. }

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

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

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 04:03 , Processed in 0.033628 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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