wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17660|回復: 6
打印 上一主題 下一主題
收起左側(cè)

一個arduino 平衡車代碼,大家試試看

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:205893 發(fā)表于 2017-5-29 17:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/****************************************************************************
   作者:平衡小車之家
   產(chǎn)品名稱:Minibalance For Arduino
****************************************************************************/
#include <DATASCOPE.h>      //這是PC端上位機的庫文件
#include <PinChangeInt.h>    //外部中斷
#include <MsTimer2.h>        //定時中斷
#include <KalmanFilter.h>    //卡爾曼濾波
#include "I2Cdev.h"        
#include "MPU6050_6Axis_MotionApps20.h"//MPU6050庫文件
#include "Wire.h"  
#include <EEPROM.h>         
MPU6050 Mpu6050; //實例化一個 MPU6050 對象,對象名稱為 Mpu6050
DATASCOPE data;//實例化一個 上位機 對象,對象名稱為 data
KalmanFilter KalFilter;//實例化一個卡爾曼濾波器對象,對象名稱為 KalFilter
int16_t ax, ay, az, gx, gy, gz;  //MPU6050的三軸加速度和三軸陀螺儀數(shù)據(jù)
#define KEY 3     //按鍵引腳
#define IN1 12   //TB6612FNG驅(qū)動模塊控制信號 共6個
#define IN2 13
#define IN3 7
#define IN4 6
#define PWMA 10
#define PWMB 9
#define ENCODER_L 2  //編碼器采集引腳 每路2個 共4個
#define DIRECTION_L 5
#define ENCODER_R 4
#define DIRECTION_R 8
#define ZHONGZHI 0//小車的機械中值  DIFFERENCE
#define DIFFERENCE 2
int Balance_Pwm, Velocity_Pwm, Turn_Pwm;   //直立 速度 轉(zhuǎn)向環(huán)的PWM
int Motor1, Motor2;      //電機疊加之后的PWM
float Battery_Voltage;   //電池電壓 單位是V
volatile long Velocity_L, Velocity_R = 0;   //左右輪編碼器數(shù)據(jù)
int Velocity_Left, Velocity_Right = 0;     //左右輪速度
int Flag_Qian, Flag_Hou, Flag_Left, Flag_Right; //遙控相關變量
int Angle, Show_Data,PID_Send;  //用于顯示的角度和臨時變量
unsigned char Flag_Stop = 1,Send_Count,Flash_Send;  //停止標志位和上位機相關變量
float Balance_Kp=15,Balance_Kd=0.4,Velocity_Kp=2,Velocity_Ki=0.01;
//***************下面是卡爾曼濾波相關變量***************//
float K1 = 0.05; // 對加速度計取值的權(quán)重
float Q_angle = 0.001, Q_gyro = 0.005;
float R_angle = 0.5 , C_0 = 1;
float dt = 0.005; //注意:dt的取值為濾波器采樣時間 5ms
int addr = 0;
/**************************************************************************
函數(shù)功能:檢測小車是否被拿起
入口參數(shù):Z軸加速度 平衡傾角 左輪編碼器 右輪編碼器
返回  值:0:無事件 1:小車被拿起
**************************************************************************/
int Pick_Up(float Acceleration, float Angle, int encoder_left, int encoder_right){
  static unsigned int flag, count0, count1, count2;
  if (flag == 0) //第一步
  {
    if (abs(encoder_left) + abs(encoder_right) < 15)         count0++;  //條件1,小車接近靜止
    else       count0 = 0;
    if (count0 > 10)      flag = 1, count0 = 0;
  }
  if (flag == 1) //進入第二步
  {
    if (++count1 > 400)       count1 = 0, flag = 0;                         //超時不再等待2000ms
    if (Acceleration > 27000 && (Angle > (-14 + ZHONGZHI)) && (Angle < (14 + ZHONGZHI)))  flag = 2; //條件2,小車是在0度附近被拿起
  }
  if (flag == 2)  //第三步
  {
    if (++count2 > 200)       count2 = 0, flag = 0;       //超時不再等待1000ms
    if (abs(encoder_left + encoder_right) > 300)           //條件3,小車的輪胎因為正反饋達到最大的轉(zhuǎn)速      
     {
        flag = 0;  return 1;
      }                                          
  }
  return 0;
}
/**************************************************************************
函數(shù)功能:檢測小車是否被放下 作者:平衡小車之家
入口參數(shù): 平衡傾角 左輪編碼器 右輪編碼器
返回  值:0:無事件 1:小車放置并啟動
**************************************************************************/
int Put_Down(float Angle, int encoder_left, int encoder_right){
  static u16 flag, count;
  if (Flag_Stop == 0)         return 0;                   //防止誤檢
  if (flag == 0)
  {
    if (Angle > (-10 + ZHONGZHI) && Angle < (10 + ZHONGZHI) && encoder_left == 0 && encoder_right == 0)      flag = 1; //條件1,小車是在0度附近的
  }
  if (flag == 1)
  {
    if (++count > 100)       count = 0, flag = 0;  //超時不再等待 500ms
    if (encoder_left > 12 && encoder_right > 12 && encoder_left < 80 && encoder_right < 80) //條件2,小車的輪胎在未上電的時候被人為轉(zhuǎn)動
    {
      flag = 0;
      flag = 0;
      return 1;    //檢測到小車被放下
    }
  }
  return 0;
}
/**************************************************************************
函數(shù)功能:異常關閉電機 作者:平衡小車之家
入口參數(shù):傾角和電池電壓
返回  值:1:異常  0:正常
**************************************************************************/
unsigned char Turn_Off(float angle, float voltage)
{
  unsigned char temp;
  if (angle < -40 || angle > 40 || 1 == Flag_Stop || voltage < 11.1) //電池電壓低于11.1V關閉電機 //===傾角大于40度關閉電機//===Flag_Stop置1關閉電機
  {                                                                        
    temp = 1;                                          
    analogWrite(PWMA, 0);  //PWM輸出為0
    analogWrite(PWMB, 0); //PWM輸出為0
  }
  else    temp = 0;   //不存在異常,返回0
  return temp;
}
/**************************************************************************
函數(shù)功能:虛擬示波器往上位機發(fā)送數(shù)據(jù) 作者:平衡小車之家
入口參數(shù):無
返回  值:無
**************************************************************************/
void DataScope(void)
{
  int i;
  data.DataScope_Get_Channel_Data(Angle, 1);  //顯示第一個數(shù)據(jù),角度
  data.DataScope_Get_Channel_Data(Velocity_Left, 2);//顯示第二個數(shù)據(jù),左輪速度  也就是每40ms輸出的脈沖計數(shù)
  data.DataScope_Get_Channel_Data(Velocity_Right, 3);//顯示第三個數(shù)據(jù),右輪速度 也就是每40ms輸出的脈沖計數(shù)
  data.DataScope_Get_Channel_Data(Battery_Voltage, 4);//顯示第四個數(shù)據(jù),電池電壓,單位V
  Send_Count = data.DataScope_Data_Generate(4);
  for ( i = 0 ; i < Send_Count; i++)
  {
    Serial.write(DataScope_OutPut_Buffer[i]);  
  }
  delay(50);  //上位機必須嚴格控制發(fā)送時序
}
/**************************************************************************
函數(shù)功能:按鍵掃描  作者:平衡小車之家
入口參數(shù):無
返回  值:按鍵狀態(tài),1:單擊事件,0:無事件。
**************************************************************************/
unsigned char My_click(void){
  static unsigned char flag_key = 1; //按鍵按松開標志
  unsigned char Key;   
  Key = digitalRead(KEY);   //讀取按鍵狀態(tài)
  if (flag_key && Key == 0) //如果發(fā)生單擊事件
  {
    flag_key = 0;
    return 1;            // 單擊事件
  }
  else if (1 == Key)     flag_key = 1;
  return 0;//無按鍵按下
}
/**************************************************************************
函數(shù)功能:直立PD控制  作者:平衡小車之家
入口參數(shù):角度、角速度
返回  值:直立控制PWM
**************************************************************************/
int balance(float Angle, float Gyro)
{
  float Bias;
  int balance;
  Bias = Angle - 0;   //===求出平衡的角度中值 和機械相關
  balance = Balance_Kp * Bias + Gyro * Balance_Kd; //===計算平衡控制的電機PWM  PD控制   kp是P系數(shù) kd是D系數(shù)
  return balance;
}
/**************************************************************************
函數(shù)功能:速度PI控制 作者:平衡小車之家
入口參數(shù):左輪編碼器、右輪編碼器
返回  值:速度控制PWM
**************************************************************************/
int velocity(int encoder_left, int encoder_right)
{
  static float Velocity, Encoder_Least, Encoder, Movement;
  static float Encoder_Integral, Target_Velocity;
  float kp = 2, ki = kp / 200;    //PI參數(shù)
  if       ( Flag_Qian == 1)Movement = 600;
  else   if ( Flag_Hou == 1)Movement = -600;
  else    //這里是停止的時候反轉(zhuǎn),讓小車盡快停下來
  {
    Movement = 0;
    if (Encoder_Integral > 300)   Encoder_Integral -= 200;
    if (Encoder_Integral < -300)  Encoder_Integral += 200;
  }
  //=============速度PI控制器=======================//
  Encoder_Least = (encoder_left + encoder_right) - 0;               //===獲取最新速度偏差==測量速度(左右編碼器之和)-目標速度(此處為零)
  Encoder *= 0.7;                                                   //===一階低通濾波器
  Encoder += Encoder_Least * 0.3;                                   //===一階低通濾波器
  Encoder_Integral += Encoder;                                      //===積分出位移 積分時間:40ms
  Encoder_Integral = Encoder_Integral - Movement;                   //===接收遙控器數(shù)據(jù),控制前進后退
  if (Encoder_Integral > 21000)    Encoder_Integral = 21000;        //===積分限幅
  if (Encoder_Integral < -21000) Encoder_Integral = -21000;         //===積分限幅
  Velocity = Encoder * Velocity_Kp + Encoder_Integral * Velocity_Ki;                  //===速度控制
  if (Turn_Off(KalFilter.angle, Battery_Voltage) == 1 || Flag_Stop == 1)    Encoder_Integral = 0;//小車停止的時候積分清零
  return Velocity;
}
/**************************************************************************
函數(shù)功能:轉(zhuǎn)向控制 作者:平衡小車之家
入口參數(shù):Z軸陀螺儀
返回  值:轉(zhuǎn)向控制PWM
**************************************************************************/
int turn(float gyro)//轉(zhuǎn)向控制
{
  static float Turn_Target, Turn, Turn_Convert = 3;
  float Turn_Amplitude = 80, Kp = 2, Kd = 0.001;  //PD參數(shù)
  if (1 == Flag_Left)             Turn_Target += Turn_Convert;  //根據(jù)遙控指令改變轉(zhuǎn)向偏差
  else if (1 == Flag_Right)       Turn_Target -= Turn_Convert;//根據(jù)遙控指令改變轉(zhuǎn)向偏差
  else Turn_Target = 0;
  if (Turn_Target > Turn_Amplitude)  Turn_Target = Turn_Amplitude; //===轉(zhuǎn)向速度限幅
  if (Turn_Target < -Turn_Amplitude) Turn_Target = -Turn_Amplitude;
  Turn = -Turn_Target * Kp + gyro * Kd;         //===結(jié)合Z軸陀螺儀進行PD控制
  return Turn;
}
/**************************************************************************
函數(shù)功能:賦值給PWM寄存器 作者:平衡小車之家
入口參數(shù):左輪PWM、右輪PWM
返回  值:無
**************************************************************************/
void Set_Pwm(int moto1, int moto2)
{
  if (moto1 > 0)     digitalWrite(IN1, HIGH),      digitalWrite(IN2, LOW);  //TB6612的電平控制
  else             digitalWrite(IN1, LOW),       digitalWrite(IN2, HIGH); //TB6612的電平控制
  analogWrite(PWMA, abs(moto1)); //賦值給PWM寄存器
  if (moto2 < 0) digitalWrite(IN3, HIGH),     digitalWrite(IN4, LOW); //TB6612的電平控制
  else        digitalWrite(IN3, LOW),      digitalWrite(IN4, HIGH); //TB6612的電平控制
  analogWrite(PWMB, abs(moto2));//賦值給PWM寄存器
}
/**************************************************************************
函數(shù)功能:限制PWM賦值  作者:平衡小車之家
入口參數(shù):無
返回  值:無
**************************************************************************/
void Xianfu_Pwm(void)
{
  int Amplitude = 250;  //===PWM滿幅是255 限制在250
  if(Flag_Qian==1)  Motor2-=DIFFERENCE;  //DIFFERENCE是一個衡量平衡小車電機和機械安裝差異的一個變量。直接作用于輸出,讓小車具有更好的一致性。
  if(Flag_Hou==1)   Motor2-=DIFFERENCE-2;
  if (Motor1 < -Amplitude) Motor1 = -Amplitude;
  if (Motor1 > Amplitude)  Motor1 = Amplitude;
  if (Motor2 < -Amplitude) Motor2 = -Amplitude;
  if (Motor2 > Amplitude)  Motor2 = Amplitude;
}
/**************************************************************************
函數(shù)功能:5ms控制函數(shù) 核心代碼 作者:平衡小車之家
入口參數(shù):無
返回  值:無
**************************************************************************/
void control()
{
  static int Velocity_Count, Turn_Count, Encoder_Count;
  static float Voltage_All,Voltage_Count;
  int Temp;
  sei();//全局中斷開啟
  Mpu6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  //獲取MPU6050陀螺儀和加速度計的數(shù)據(jù)
  KalFilter.Angletest(ax, ay, az, gx, gy, gz, dt, Q_angle, Q_gyro, R_angle, C_0, K1);          //通過卡爾曼濾波獲取角度
  Angle = KalFilter.angle;//Angle是一個用于顯示的整形變量
  Balance_Pwm = balance(KalFilter.angle, KalFilter.Gyro_x);//直立PD控制 控制周期5ms
  if (++Velocity_Count >= 8) //速度控制,控制周期40ms
  {
    Velocity_Left = Velocity_L;    Velocity_L = 0;  //讀取左輪編碼器數(shù)據(jù),并清零,這就是通過M法測速(單位時間內(nèi)的脈沖數(shù))得到速度。
    Velocity_Right = Velocity_R;    Velocity_R = 0; //讀取右輪編碼器數(shù)據(jù),并清零
    Velocity_Pwm = velocity(Velocity_Left, Velocity_Right);//速度PI控制,控制周期40ms
    Velocity_Count = 0;
  }
  if (++Turn_Count >= 4)//轉(zhuǎn)向控制,控制周期20ms
  {
    Turn_Pwm = turn(gz);
    Turn_Count = 0;
  }
  Motor1 = Balance_Pwm - Velocity_Pwm + Turn_Pwm;  //直立速度轉(zhuǎn)向環(huán)的疊加
  Motor2 = Balance_Pwm - Velocity_Pwm - Turn_Pwm; //直立速度轉(zhuǎn)向環(huán)的疊加
  Xianfu_Pwm();//限幅
  if (Pick_Up(az, KalFilter.angle, Velocity_Left, Velocity_Right))   Flag_Stop = 1;  //===如果被拿起就關閉電機//===檢查是否小車被那起
  if (Put_Down(KalFilter.angle, Velocity_Left, Velocity_Right))      Flag_Stop = 0;              //===檢查是否小車被放下
  if (Turn_Off(KalFilter.angle, Battery_Voltage) == 0)        Set_Pwm(Motor1, Motor2);//如果不存在異常,賦值給PWM寄存器控制電機
  if (My_click()) Flag_Stop = !Flag_Stop;   //中斷剩余的時間掃描一下按鍵狀態(tài)
  Temp = analogRead(0);  //采集一下電池電壓
  Voltage_Count++;       //平均值計數(shù)器
  Voltage_All+=Temp;     //多次采樣累積
  if(Voltage_Count==200) Battery_Voltage=Voltage_All*0.05371/200,Voltage_All=0,Voltage_Count=0;//求平均值
}
/**************************************************************************
函數(shù)功能:初始化 相當于STM32里面的Main函數(shù) 作者:平衡小車之家
入口參數(shù):無
返回  值:無
**************************************************************************/
void setup() {
  pinMode(IN1, OUTPUT);        //TB6612控制引腳,控制電機1的方向,01為正轉(zhuǎn),10為反轉(zhuǎn)
  pinMode(IN2, OUTPUT);          //TB6612控制引腳,
  pinMode(IN3, OUTPUT);          //TB6612控制引腳,控制電機2的方向,01為正轉(zhuǎn),10為反轉(zhuǎn)
  pinMode(IN4, OUTPUT);          //TB6612控制引腳,
  pinMode(PWMA, OUTPUT);         //TB6612控制引腳,電機PWM
  pinMode(PWMB, OUTPUT);         //TB6612控制引腳,電機PWM
  digitalWrite(IN1, 0);          //TB6612控制引腳拉低
  digitalWrite(IN2, 0);          //TB6612控制引腳拉低
  digitalWrite(IN3, 0);          //TB6612控制引腳拉低
  digitalWrite(IN4, 0);          //TB6612控制引腳拉低
  analogWrite(PWMA, 0);          //TB6612控制引腳拉低
  analogWrite(PWMB, 0);          //TB6612控制引腳拉低
  pinMode(2, INPUT);       //編碼器引腳
  pinMode(4, INPUT);       //編碼器引腳
  pinMode(5, INPUT);       //編碼器引腳
  pinMode(8, INPUT);       //編碼器引腳
  pinMode(3, INPUT);       //按鍵引腳
  Wire.begin();             //加入 IIC 總線
  Serial.begin(9600);       //開啟串口,設置波特率為 9600
  delay(1500);              //延時等待初始化完成
  Mpu6050.initialize();     //初始化MPU6050
  delay(20);
  if(digitalRead(KEY)==0) {    //讀取EEPROM的參數(shù)
  Balance_Kp =  (float)((EEPROM.read(addr+0)*256)+EEPROM.read(addr+1) )/100;
  Balance_Kd =  (float)((EEPROM.read(addr+2)*256)+EEPROM.read(addr+3))/100;
  Velocity_Kp = (float)((EEPROM.read(addr+4)*256)+EEPROM.read(addr+5))/100;
  Velocity_Ki = (float)((EEPROM.read(addr+6)*256)+EEPROM.read(addr+7))/100;
  }
  MsTimer2::set(5, control);  //使用Timer2設置5ms定時中斷
  MsTimer2::start();          //使用中斷使能
  attachInterrupt(0, READ_ENCODER_L, CHANGE);           //開啟外部中斷 編碼器接口1
  attachPinChangeInterrupt(4, READ_ENCODER_R, CHANGE);  //開啟外部中斷 編碼器接口2
}
/**************************************************************************
函數(shù)功能:主循環(huán)程序體
入口參數(shù):無
返回  值:無
**************************************************************************/
void loop() {
  int Voltage_Temp;
  static unsigned char flag;
  unsigned char Balance_Kp_Temp=0,Balance_Kd_Temp=0,Velocity_Kp_Temp=0,Velocity_Ki_Temp=0;
  Voltage_Temp = (Battery_Voltage - 11.1) * 60;  //根據(jù)APP的協(xié)議對電池電壓變量進行處理
  if (Voltage_Temp > 100)Voltage_Temp = 100;
  if (Voltage_Temp < 0)Voltage_Temp = 0;
  if (Flag_Stop == 0)
  {
    Serial.begin(9600);       //開啟串口,設置波特率為 9600
    flag=!flag;
      if(PID_Send==1)//發(fā)送PID參數(shù)
  {
    Serial.print("{C");
    Serial.print((int)(Balance_Kp*100));   //左輪編碼器
    Serial.print(":");
    Serial.print((int)(Balance_Kd*100));  //右輪編碼器
    Serial.print(":");
    Serial.print((int)(Velocity_Kp*100));  //電池電壓
    Serial.print(":");
    Serial.print((int)(Velocity_Ki*100));  //平衡傾角
    Serial.print("}$");
    PID_Send=0;
  }
    else if(flag==0)
    {
    Serial.print("{A");
    Serial.print(abs(Velocity_Left / 2));   //左輪編碼器
    Serial.print(":");
    Serial.print(abs(Velocity_Right / 2));  //右輪編碼器
    Serial.print(":");
    Serial.print(Voltage_Temp);  //電池電壓
    Serial.print(":");
    Serial.print(Angle);  //平衡傾角
    Serial.print("}$");
    }
      else
    {
    Serial.print("{B");
    Serial.print(Angle);   
    Serial.print(":");
    Serial.print(Voltage_Temp);  
    Serial.print(":");
    Serial.print(Velocity_Left/2);
    Serial.print(":");
    Serial.print(Velocity_Right/2);
    Serial.print("}$");
    }
    delay(50);
  }
  else    Serial.begin(128000), DataScope(); //使用上位機時,波特率是128000
    if(Flash_Send==1)        //寫入PID參數(shù)到EEPROM,由app控制該指令
    {
     EEPROM.write(addr,     ((unsigned int)(Balance_Kp*100)&0xff00)>>8);
     EEPROM.write(addr+1,   (unsigned int)(Balance_Kp*100)&0xff);
     EEPROM.write(addr+2,   ((unsigned int)(Balance_Kd*100)&0xff00)>>8);
     EEPROM.write(addr+3,   (unsigned int)(Balance_Kd*100)&0xff);
     EEPROM.write(addr+4,   ((unsigned int)(Velocity_Kp*100)&0xff00)>>8);
     EEPROM.write(addr+5,   (unsigned int)(Velocity_Kp*100)&0xff);
     EEPROM.write(addr+6,   ((unsigned int)(Velocity_Ki*100)&0xff00)>>8);
     EEPROM.write(addr+7,   (unsigned int)(Velocity_Ki*100)&0xff);
     Flash_Send=0;
    }
}
/**************************************************************************
函數(shù)功能:外部中斷讀取編碼器數(shù)據(jù),具有二倍頻功能 注意外部中斷是跳變沿觸發(fā)
入口參數(shù):無
返回  值:無
**************************************************************************/
void READ_ENCODER_L() {
  if (digitalRead(ENCODER_L) == LOW) {     //如果是下降沿觸發(fā)的中斷
    if (digitalRead(DIRECTION_L) == LOW)      Velocity_L--;  //根據(jù)另外一相電平判定方向
    else      Velocity_L++;
  }
  else {     //如果是上升沿觸發(fā)的中斷
    if (digitalRead(DIRECTION_L) == LOW)      Velocity_L++; //根據(jù)另外一相電平判定方向
    else     Velocity_L--;
  }
}
/**************************************************************************
函數(shù)功能:外部中斷讀取編碼器數(shù)據(jù),具有二倍頻功能 注意外部中斷是跳變沿觸發(fā)
入口參數(shù):無
返回  值:無
**************************************************************************/
void READ_ENCODER_R() {
  if (digitalRead(ENCODER_R) == LOW) { //如果是下降沿觸發(fā)的中斷
    if (digitalRead(DIRECTION_R) == LOW)      Velocity_R--;//根據(jù)另外一相電平判定方向
    else      Velocity_R++;
  }
  else {   //如果是上升沿觸發(fā)的中斷
    if (digitalRead(DIRECTION_R) == LOW)      Velocity_R++; //根據(jù)另外一相電平判定方向
    else     Velocity_R--;
  }
}
/**************************************************************************
函數(shù)功能:串口接收中斷
入口參數(shù):無
返回  值:無
**************************************************************************/
void serialEvent()
{   
    static unsigned char Flag_PID,Receive[10],Receive_Data,i,j;
   static float Data;

   while (Serial.available()) {

    Receive_Data=Serial.read();  
    if(Receive_Data==0x7B) Flag_PID=1;  //參數(shù)指令起始位
    if(Receive_Data==0x7D) Flag_PID=2;  //參數(shù)指令停止位
    if(Flag_PID==1)
     {
      Receive[i]=Receive_Data;     //記錄數(shù)據(jù)
      i++;
     }
    else  if(Flag_PID==2)  //執(zhí)行指令
     {
           if(Receive[3]==0x50)          PID_Send=1;   //獲取PID參數(shù)
           else  if(Receive[3]==0x57)    Flash_Send=1; //掉電保存參數(shù)
           else  if(Receive[1]!=0x23)    //更新PID參數(shù)
           {               
            for(j=i;j>=4;j--)
            {
              Data+=(Receive[j-1]-48)*pow(10,i-j);   //通訊協(xié)議
            }
            switch(Receive[1])
             {
               case 0x30:  Balance_Kp=Data/100;break;
               case 0x31:  Balance_Kd=Data/100;break;
               case 0x32:  Velocity_Kp=Data/100;break;
               case 0x33:  Velocity_Ki=Data/100;break;
               case 0x34:  break; //9個通道,預留5個
               case 0x35:  break;
               case 0x36:  break;
               case 0x37:  break;
               case 0x38:  break;
             }
           }         
           Flag_PID=0; //相關標志位清零
           i=0;
           j=0;
           Data=0;
     }
       else  //藍牙遙控指令
       {
              switch (Receive_Data)   {
                 //這是MinibalanceV1.0的APP發(fā)送指令
                  case 0x01: Flag_Qian = 1, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 0;   break;              //前進
                  case 0x02: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;              //右轉(zhuǎn)
                  case 0x03: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;              //右轉(zhuǎn)
                  case 0x04: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;              //右轉(zhuǎn)
                  case 0x05: Flag_Qian = 0, Flag_Hou = 1, Flag_Left = 0, Flag_Right = 0;   break;              //后退
                  case 0x06: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;   break;               //左轉(zhuǎn)
                  case 0x07: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;   break;               //左轉(zhuǎn)
                  case 0x08: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;   break;               //左轉(zhuǎn)
                  //這是MinibalanceV3.5的APP發(fā)送指令
                  case 0x41: Flag_Qian = 1, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 0;   break;              //前進
                  case 0x42: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;             //右轉(zhuǎn)
                  case 0x43: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;             //右轉(zhuǎn)
                  case 0x44: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 1;   break;              //右轉(zhuǎn)
                  case 0x45:  Flag_Qian = 0, Flag_Hou = 1, Flag_Left = 0, Flag_Right = 0;   break;             //后退
                  case 0x46: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;    break;               //左轉(zhuǎn)
                  case 0x47: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;   break;               //左轉(zhuǎn)
                  case 0x48: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 1, Flag_Right = 0;   break;             //左轉(zhuǎn)
                  default: Flag_Qian = 0, Flag_Hou = 0, Flag_Left = 0, Flag_Right = 0;    break;                //停止
                }
        }
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
板凳
ID:373506 發(fā)表于 2018-7-17 23:38 | 只看該作者
你好,有庫文件嘛

#include <DATASCOPE.h>      //這是PC端上位機的庫文件
#include <PinChangeInt.h>    //外部中斷
#include <MsTimer2.h>        //定時中斷
#include <KalmanFilter.h>    //卡爾曼濾波
#include "I2Cdev.h"        
#include "MPU6050_6Axis_MotionApps20.h"//MPU6050庫文件
回復

使用道具 舉報

地板
ID:324611 發(fā)表于 2018-8-14 17:48 | 只看該作者
謝謝樓主了。好東西。
回復

使用道具 舉報

5#
ID:576718 發(fā)表于 2019-7-6 15:40 | 只看該作者
666,試試

回復

使用道具 舉報

6#
ID:516946 發(fā)表于 2019-11-22 11:54 | 只看該作者
可惜不能用啊
回復

使用道具 舉報

7#
ID:516946 發(fā)表于 2019-11-22 11:55 | 只看該作者

你好,問下你的這個代碼可用不
回復

使用道具 舉報

8#
ID:1094965 發(fā)表于 2023-10-2 16:59 | 只看該作者
很詳細
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
免费观看在线午夜影视| 日韩激情av在线| 久久天堂电影| 一区二区三国产精华液| 成年人午夜视频| 日本人69视频| 亚洲欧美日韩精品综合在线观看 | 男女羞羞视频网站| 亚洲成人777777| 精品国产国产综合精品| 亚洲激情在线观看视频| 日韩精品av一区二区三区| 久久久久久久国产精品| 日韩精品一区二区三区在线| 亚洲黄色av一区| 国产福利一区在线| 国自产拍偷拍福利精品免费一| 日韩第一区第二区| xxxx视频在线| 五月激情在线| 8mav模特福利视频在线观看| 自拍亚洲色图| 正在播放木下凛凛xv99| 日本裸体美女视频| 中国免费黄色片| 欧美日韩亚洲一| 亚洲欧美综合一区| 91国产丝袜在线放| 97精品在线观看| 亚洲色图美腿丝袜| 7777精品伊人久久久大香线蕉完整版| 欧美特黄不卡| 午夜小视频福利在线观看| 美臀av在线| 狠狠干天天干| bdsm国产| 欧美性猛交xxxx乱大交丰满| 99精品在线视频观看| 亚洲精品1区2区3区| 日韩欧美在线视频播放| 黄色在线免费播放| 91高清国产视频| 日本精品一区在线观看| 日韩最新中文字幕| 欧洲一区二区在线观看| 成人三级在线| 91九色综合久久| 国产精品 欧美在线| 欧美激情视频一区| 久久在精品线影院精品国产| 亚洲欧洲在线免费| 亚洲成人免费网站| 欧美mv日韩mv国产| 91精品国产综合久久小美女| 在线日韩国产精品| 色噜噜狠狠色综合中国| 福利二区91精品bt7086| 午夜久久久久久久久| 亚洲三级电影全部在线观看高清| 国产日产亚洲精品系列| 久久人人97超碰com| 91蜜桃免费观看视频| 99久久综合色| 99久久精品国产一区二区三区 | 免费在线观看黄网站| 中文字幕人妻一区二| 久久久久亚洲av片无码| 色哟哟一一国产精品| 少妇太紧太爽又黄又硬又爽小说| 人妻aⅴ无码一区二区三区| 欧美老熟妇乱大交xxxxx| 精品无码国产一区二区三区51安| 无码人妻丰满熟妇啪啪网站| 男人的天堂影院| 在线观看福利片| 99久久久无码国产精品衣服| 又色又爽的视频| 777777国产7777777| 欧美国产精品一二三| 国产一级片免费| 欧洲一级黄色片| 国产一区二区三区精品在线| 日韩高清dvd碟片| 妺妺窝人体色www婷婷| 日韩精品手机在线| 国产精品久久久久久在线| 亚洲黄色a级片| 久久久久88色偷偷| 午夜私人影院在线观看| 欧美色老女人| 青青草在线视频免费观看| 99riav在线| 欧美男女交配| 欧美五码在线| 欧美精选一区| 国产成人一区二区精品非洲| 久久精品视频在线免费观看| 亚洲一区二区三区小说| 欧美精品色综合| 亚洲午夜精品久久久久久性色 | 日本三级网站在线观看| 国产精品午夜一区二区| 性xxxx视频| 灌醉mj刚成年的大学平面模特| 中文字幕伊人| 在线免费观看污| **日韩最新| 国产精品久久天天影视| 日韩精彩视频在线观看| 久久久蜜桃精品| 狠狠躁夜夜躁久久躁别揉| 精品国产91乱码一区二区三区 | 亚洲国产高清高潮精品美女| 蜜桃精品视频在线| 久久综合九色综合欧美亚洲| 亚洲国产成人精品视频| 精品国产不卡一区二区三区| 久久久久国色av免费观看性色 | 国产精品极品在线观看| 欧美三区在线| av中文一区二区三区| 亚洲一区二区三区四区五区中文| 日韩免费观看高清完整版在线观看| 久久伊人91精品综合网站| 亚洲永久在线观看| 男人日女人视频网站| 日本性生活一级片| 久久久久久久久久影院| 日韩在线天堂| 污视频网站在线观看| 成人福利视频| 日韩激情图片| 国产91在线观看| 欧美日韩亚洲成人| 日韩在线免费高清视频| 91超碰rencao97精品| 日韩久久久久久久久久久久| caopor在线| 久久国产视频播放| 国产精品亚洲lv粉色| 国产成人亚洲精品乱码在线观看| 欧洲视频在线免费观看| 五月天国产在线| 亚洲h色精品| 国产精品一区二区无线| 色成人在线视频| 中文字幕在线亚洲| 看高清中日韩色视频| 高潮一区二区三区| 国产高潮国产高潮久久久91| 在线观看免费国产成人软件| 日本桃色视频| 国产成人精品一区二区三区视频| 久久不见久久见免费视频7| 国产一区二区免费看| 一区二区三区产品免费精品久久75| 亚洲精品天天看| 国产高清精品一区| 激情视频综合网| 欧美黄色aaa| 亚洲欧美一区二区三| 成年女人午夜毛片免费看| 国产一区二区三区不卡在线| 欧美美女福利视频| 翔田千里一区二区| 中文字幕在线不卡| 中文字幕日韩精品在线| 麻豆91蜜桃| 天堂av.com| 97精品人妻一区二区三区香蕉| 人人插人人干| 久久久久久久| 日韩精品91亚洲二区在线观看| 亚洲黄网站在线观看| 欧美精品在线极品| 四虎影院一区二区三区| 国产一区二区三区精品在线| 成人黄色免费视频| 噜噜噜在线观看播放视频| 欧美精品第一区| 成人av免费在线播放| 亚洲精品久久久久久久久久久| 成人精品久久久| 手机在线播放av| 亚洲视频一区在线播放| 在线视频观看你懂的| 奇米色欧美一区二区三区| 99国产精品一区| 国产亚洲精品久久久| 免费在线观看一区二区| 免费成人深夜天涯网站| 天堂中文资源在线观看| www红色一片_亚洲成a人片在线观看_| 亚洲成人二区| 亚洲一区在线视频观看| 人人做人人澡人人爽欧美| 成年人视频网站免费观看| 久久国产香蕉视频| 日本免费高清视频| 精品视频亚洲| 午夜精品在线视频一区| 国产精品久久久久久久久借妻| 男生和女生一起差差差视频| wwwxxxx国产| 97超碰资源站在线观看| 欧美黄污视频| 一本色道a无线码一区v| 91在线色戒在线| 午夜男人的天堂| 91野花视频| 欧美影视资讯| 国产裸体免费无遮挡| 97超碰中文字幕| 天使と恶魔の榨精在线播放| 久久精品国产精品青草| 欧美一卡二卡三卡| 午夜精品短视频| 久久久久99精品成人片试看| h短视频大全在线观看| 在线看成人短视频| 性久久久久久久| 91美女片黄在线观看游戏| 国产精品久久久免费观看| 影音先锋5566资源站| 成人亚洲网站| 亚洲欧洲av在线| 欧美一区二区视频97| 先锋资源av在线| 99久久99久久免费精品小说| 香蕉成人在线| 综合电影一区二区三区| 欧美综合第一页| 在线免费看黄视频| 蜜桃传媒九九九| 精品72久久久久中文字幕| 91成人在线精品| 久久精品国产精品青草色艺| 九九热在线视频播放| 天堂av在线免费观看| 久久久久久9| 亚洲视频自拍偷拍| 国产女大学生av| 8x8x拔插拔插影库永久免费 | 久久久久久久久久久黄色| 亚洲欧美日韩中文在线| 国产精品自拍片| 跑男十一季在线观看免费| 超薄肉色丝袜脚交一区二区| 国产精品久久久久精k8| 国产精品久久久久秋霞鲁丝| 欧美肥妇bbwbbw| 天堂av在线7| 日欧美一区二区| 日韩视频免费中文字幕| 欧美美女一级片| 色噜噜在线网| 成人vr资源| 欧美日韩一区二区在线观看视频 | 玖玖在线播放| 国产精品一区二区久久不卡 | 五月天激情小说综合| 国产欧美日本在线| 国产午夜免费福利| 三妻四妾完整版在线观看电视剧| 成人午夜精品一区二区三区| 成人国产精品日本在线| 欧美a视频在线观看| 免费影视亚洲| 中文字幕一区在线观看视频| 懂色一区二区三区av片| 91丨九色丨蝌蚪丨对白| 国产精品高潮久久| 亚洲国产一区二区a毛片| 亚洲视频导航| 国产 日韩 欧美 精品| 成人h动漫免费观看网站| 午夜精彩视频在线观看不卡| 亚洲欧美日韩国产成人综合一二三区| 区日韩二区欧美三区| 日韩精品三区| 婷婷国产在线综合| 亚洲欧美影院| 久久久精品久久久久特色影视 | 中文字幕一区av| 日本午夜一区二区三区| 国产高清免费在线观看| 欧美日韩看看2015永久免费 | 91在线一区| 福利视频一区二区| 中文字幕无码精品亚洲资源网久久| 久热精品免费视频| 日韩欧美精品| 日韩视频免费在线观看| 国产探花一区二区三区| 在线播放色视频| 丰满亚洲少妇av| 91精品久久久久久久久久另类 | 激情久久综合网| 一级香蕉视频在线观看| 久久99精品久久久久久| 国产精品亚洲网站| 中文字幕人妻一区二区三区视频| 欧美色999| 欧美麻豆精品久久久久久| 欧美日韩在线免费播放| 黑人巨大精品欧美一区二区奶水| 国产a区久久久| 亚洲最大的av网站| 少妇av在线播放| 国内黄色精品| 久久久精品电影| 美日韩一二三区| 国产三级一区| 亚洲精品一线二线三线| 国产成人一区二区三区别| 亚洲在线天堂| 91精品啪在线观看国产81旧版| 在线视频中文亚洲| 麻豆一区在线观看| 91美女视频在线| 99精品热视频| 日韩中文一区二区三区| 欧美性猛交xxxxbbb| 一区在线视频观看| 91精品国产色综合久久不卡98口| 黑人狂躁日本娇小| 自拍偷拍亚洲视频| 欧美亚洲综合一区| 在线观看免费视频污| 国产大片在线免费观看| 亚洲va韩国va欧美va精品| 在线看免费毛片| 三级在线电影| 精品久久久久久久久久久| 亚洲精品一二三四| 国产人成网在线播放va免费| 一本色道久久综合亚洲aⅴ蜜桃 | 夜夜嗨av禁果av粉嫩avhd| 国产欧美一区| 久久视频在线播放| 日韩视频在线观看一区| 国产一区二区三区四区大秀| 色一区av在线| 中文无码精品一区二区三区| 日本欧美肥老太交大片| 国内精品久久久久| 国产精品久久久久久久久毛片 | 国产精品国产三级国产普通话三级| 国产成人无码精品久久久性色| 欧美中文在线| 午夜精品123| 变态另类丨国产精品| 国产福利在线播放麻豆| 制服丝袜在线91| 麻豆网址在线观看| 福利一区三区| 久久亚洲精品成人| 国产区精品在线| 综合在线视频| 成人在线一区二区| 一本大道五月香蕉| 成a人片亚洲日本久久| av网站手机在线观看| 性视频一区二区三区| 国产亚洲欧洲一区高清在线观看| 激情内射人妻1区2区3区 | 九九视频精品免费| 欧洲精品一区色| **毛片在线网站| 91久久国产最好的精华液| 精品少妇一区二区三区免费观| 精品176极品一区| 亚洲人a成www在线影院| 亚洲午夜18毛片在线看| 中文字幕一区二区av | 亚洲精品国产欧美| 久久午夜鲁丝片| 伊人青青综合网| 欧美日韩电影一区二区| 一本大道香蕉久在线播放29| 富二代精品短视频| 五月综合色婷婷| 久久一级电影| 99c视频在线| 1024在线视频| 欧美日韩国产一级二级| 免费三级在线观看| 在线观看欧美理论a影院| 久久久久久久久电影| 日本韩国免费观看| 91麻豆精东视频| 一级黄色大片免费看| 欧美男人天堂| 中文字幕av一区中文字幕天堂| 黄色福利在线观看| 国产真实乱对白精彩久久| 蜜臀视频一区二区三区| 国产精品伦一区二区| 欧美极品第一页| 性欧美高清强烈性视频|