久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 28971|回復: 32
打印 上一主題 下一主題
收起左側

自平衡小車控制(stc12+mpu6050程序)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72008 發表于 2015-1-12 14:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/***********************************************************************
// 兩輪自平衡車最終版控制程序(6軸MPU6050+互補濾波+PWM電機)
// 單片機STC12C5A60S2
// 晶振:20M
// 日期:2014.11.26 - ?
***********************************************************************/

#include <REG52.H>
#include <math.h>     
#include <stdio.h>   
#include <INTRINS.H>

typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned int   uint;

//******功能模塊頭文件*******

#include "DELAY.H"    //延時頭文件
//--------------------------------------------
#include "STC_ISP.H"    //程序燒錄頭文件
#include "SET_SERIAL.H"//串口頭文件

#include "SET_PWM.H"//PWM頭文件
#include "MOTOR.H"//電機控制頭文件
#include "MPU6050.H"//MPU6050頭文件
//-----------------這些文件---------------------------



//******角度參數************

float Gyro_y;        //Y軸陀螺儀數據暫存

//--------------加速度和角度的轉化------------------


float Angle_gy;      //由角速度計算的傾斜角度
//陀螺儀直接反應角度

float Accel_x;     //X軸加速度值暫存
float Angle_ax;      //由加速度計算的傾斜角度 、

float Angle;         //小車最終傾斜角度
uchar value; //角度正負極性標記

//******PWM參數*************

int   speed_mr; //右電機  轉速//這個的測量---------轉盤
int   speed_ml; //左電機  轉速
int   PWM_R;         //右輪PWM值計算
int   PWM_L;         //左輪PWM值計算
float PWM;           //綜合PWM計算
float PWMI; //PWM積分值

//******電機參數*************

float speed_r_l;//電機轉速
float speed;        //電機轉速濾波
float position;    //位移

//******藍牙遙控參數*************
uchar remote_char;
char  turn_need;
char  speed_need;

//*********************************************************
//定時器100Hz數據更新中斷 T1定時器
//*********************************************************

void Init_Timer1(void)//10毫秒@20MHz,100Hz刷新頻率
{
AUXR &= 0xBF;//定時器時鐘12T模式
TMOD &= 0x0F;//設置定時器模式
TMOD |= 0x10;//設置定時器模式
TL1 = 0xE5;    //設置定時初值
TH1 = 0xBE;    //設置定時初值
TF1 = 0;    //清除TF1標志
TR1 = 1;    //定時器1開始計時
}



//*********************************************************
//中斷控制初始化
//*********************************************************

void Init_Interr(void)
{
EA = 1;     //開總中斷
    EX0 = 1;    //開外部中斷INT0
    EX1 = 1;    //開外部中斷INT1
    IT0 = 1;    //下降沿觸發
    IT1 = 1;    //下降沿觸發
ET1 = 1;    //開定時器1中斷
}



//******卡爾曼參數************

float code Q_angle=0.001;  
float code Q_gyro=0.003;
float code R_angle=0.5;
float code dt=0.01;                  //dt為kalman濾波器采樣時間;
char  code C_0 = 1;
float xdata Q_bias, Angle_err;
float xdata PCt_0, PCt_1, E;
float xdata K_0, K_1, t_0, t_1;
float xdata Pdot[4] ={0,0,0,0};
float xdata PP[2][2] = { { 1, 0 },{ 0, 1 } };

//*********************************************************
// 卡爾曼濾波
//*********************************************************

//Kalman濾波,20MHz的處理時間約0.77ms;

void Kalman_Filter(float Accel,float Gyro)  // 濾波,輸出標準的方波驅動電機
{
Angle+=(Gyro - Q_bias) * dt; //先驗估計陀螺角度


Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先驗估計誤差協方差的微分

Pdot[1]=- PP[1][1];
Pdot[2]=- PP[1][1];
Pdot[3]=Q_gyro;

PP[0][0] += Pdot[0] * dt;   // Pk-先驗估計誤差協方差微分的積分
PP[0][1] += Pdot[1] * dt;   // =先驗估計誤差協方差
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;

Angle_err = Accel - Angle;//zk-先驗估計

PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];

E = R_angle + C_0 * PCt_0;

K_0 = PCt_0 / E;
K_1 = PCt_1 / E;

t_0 = PCt_0;
t_1 = C_0 * PP[0][1];

PP[0][0] -= K_0 * t_0; //后驗估計誤差協方差
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;

Angle+= K_0 * Angle_err; //后驗估計
Q_bias+= K_1 * Angle_err; //后驗估計
Gyro_y   = Gyro - Q_bias; //輸出值(后驗估計)的微分=角速度

}



//*********************************************************
// 傾角計算(卡爾曼融合)
//*********************************************************

void Angle_Calcu(void)
{
//------加速度--------------------------

//范圍為2g時,換算關系:16384 LSB/g
//角度較小時,x=sinx得到角度(弧度), deg = rad*180/3.14
//因為x>=sinx,故乘以1.3適當放大

Accel_x  = GetData(ACCEL_XOUT_H);  //讀取X軸加速度         存在ACCEL_XOUT_H 寄存器
Angle_ax = (Accel_x - 1100) /16384;   //去除零點偏移,計算得到角度(弧度)
Angle_ax = Angle_ax*1.2*180/3.14;     //弧度轉換為度,


    //-------角速度-------------------------

//范圍為2000deg/s時,換算關系:16.4 LSB/(deg/s)

Gyro_y = GetData(GYRO_YOUT_H);      //靜止時角速度Y軸輸出為  【-30】 左右
Gyro_y = -(Gyro_y + 30)/16.4;         //去除零點偏移,計算角速度值,  【負號為方向處理】
//Angle_gy = Angle_gy + Gyro_y*0.01;  //角速度積分得到傾斜角度.


//-------卡爾曼濾波融合-----------------------

Kalman_Filter(Angle_ax,Gyro_y);       //卡爾曼濾波計算傾角


/*//-------互補濾波-----------------------

//補償原理是取當前傾角和加速度獲得傾角差值進行放大,然后與
    //陀螺儀角速度疊加后再積分,從而使傾角最跟蹤為加速度獲得的角度
//0.5為放大倍數,可調節補償度;0.01為系統周期10ms

Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);*/
  
}  



//*********************************************************
//電機轉速和位移值計算
//*********************************************************

void Psn_Calcu(void)
{

speed_r_l =(speed_mr + speed_ml)*0.5;
speed *= 0.7;//上一次的                  //車輪速度濾波
speed += speed_r_l*0.3;
position += speed;                  //積分得到位移
position += speed_need;//加上藍牙位移,等于總的移動
if(position<-6000) position = -6000;
if(position> 6000) position =  6000;


}


static float code Kp  = 9.0;       //PID參數
static float code Kd  = 2.6;    //PID參數
static float code Kpn = 0.01;      //PID參數
static float code Ksp = 2.0;    //PID參數

//*********************************************************
//電機PWM值計算
//*********************************************************

void PWM_Calcu(void)
{

if(Angle<-40||Angle>40)               //角度過大,關閉電機
{  
  CCAP0H = 0;
      CCAP1H = 0;
  return;
}
PWM  = Kp*Angle + Kd*Gyro_y;          //PID:角速度和角度
PWM += Kpn*position + Ksp*speed;      //PID:速度和位置
PWM_R = PWM + turn_need;
PWM_L = PWM - turn_need;   //藍牙的傾斜,
PWM_Motor(PWM_L,PWM_R);

}




//*********************************************************
//手機藍牙遙控
//*********************************************************

void Bluetooth_Remote(void)
{

remote_char = receive_char();   //接收藍牙串口數據

if(remote_char ==0x02) speed_need = -80;   //前進
else if(remote_char ==0x01) speed_need = 80;   //后退
     else speed_need = 0;   //不動

    if(remote_char ==0x03) turn_need = 15;   //左轉
else if(remote_char ==0x04) turn_need = -15;   //右轉
     else turn_need = 0;   //不轉

}


/*=================================================================================*/

//*********************************************************
//main
//*********************************************************
void main()
{

delaynms(500);   //上電延時
Init_PWM();       //PWM初始化
    Init_Timer0();     //初始化定時器0,作為PWM時鐘源
Init_Timer1();     //初始化定時器1
Init_Interr();     //中斷初始化
Init_Motor();   //電機控制初始化
Init_BRT();   //串口初始化(獨立波特率)
InitMPU6050();     //初始化MPU6050
delaynms(500);   

while(1)
{
   
Bluetooth_Remote();

}
}


/*=================================================================================*/

//********timer1中斷***********************

void Timer1_Update(void) interrupt 3
{

   TL1 = 0xE5;    //設置定時初值10MS
   TH1 = 0xBE;

   //STC_ISP();                    //程序下載
   Angle_Calcu();                  //傾角計算
   Psn_Calcu();                    //電機位移計算
   PWM_Calcu();                    //計算PWM值

   speed_mr = speed_ml = 0;

}


//********右電機中斷***********************

void INT_L(void) interrupt 0
{

   if(SPDL == 1)  { speed_ml++; } //左電機前進
   else      { speed_ml--; } //左電機后退
   LED = ~LED;

}


//********左電機中斷***********************

void INT_R(void) interrupt 2
{

   if(SPDR == 1)  { speed_mr++; } //右電機前進
   else      { speed_mr--; } //右電機后退
   LED = ~LED;

}

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

使用道具 舉報

沙發
ID:76321 發表于 2015-4-7 12:21 | 只看該作者
本帖最后由 安生 于 2015-4-7 12:24 編輯

樓主乃神人也:能給個電路圖和完整軟件嗎?我退休在家,有時間,對單片機只知點毛皮,正在學習,想做一個玩玩。謝謝啦。dxq731@126.com
回復

使用道具 舉報

板凳
ID:81109 發表于 2015-5-25 20:59 | 只看該作者
能幫我把藍牙那部分的程序去掉嗎?多了藍牙那部分的程序,我就看不明白了,拜托了,謝謝了
如果弄出來后發到我郵箱1002831161@qq.com 好么?謝謝了,你很棒,我很需要你的幫助
回復

使用道具 舉報

地板
ID:84102 發表于 2015-6-27 20:47 | 只看該作者
你好,現在我用51單片機做著自平衡車,不過到達pid調試的時候就不知怎么下手了,新手,希望樓主能給我一個完整資料參考一下嗎?如果可以,那真是感激不盡
回復

使用道具 舉報

5#
ID:84102 發表于 2015-6-27 20:49 | 只看該作者
回復

使用道具 舉報

6#
ID:84102 發表于 2015-6-27 20:50 | 只看該作者
對了 我的qq郵箱是995709242@qq.com
回復

使用道具 舉報

7#
ID:84229 發表于 2015-6-29 11:59 | 只看該作者
能把原理圖共享一下,就更完美了,謝謝樓主的分享。尊敬、
回復

使用道具 舉報

8#
ID:72399 發表于 2015-7-23 14:28 | 只看該作者
這個程序還沒有完整把,你有角度傳感器的資料和程序嗎
回復

使用道具 舉報

9#
ID:78573 發表于 2015-7-28 18:13 | 只看該作者
感謝,這位牛人
回復

使用道具 舉報

10#
ID:58502 發表于 2015-8-1 13:11 | 只看該作者
頭文件呢
回復

使用道具 舉報

11#
ID:86621 發表于 2015-8-7 18:58 | 只看該作者
能給完整資料嗎
回復

使用道具 舉報

12#
ID:88333 發表于 2015-8-14 16:04 | 只看該作者
樓主,能給我頭文件嗎?QQ郵箱979690676。
回復

使用道具 舉報

13#
ID:89055 發表于 2015-8-29 14:35 來自手機 | 只看該作者
能提供下完整程序嗎?我郵箱是857047534@qq. com
回復

使用道具 舉報

14#
ID:89553 發表于 2015-9-7 10:59 | 只看該作者
求完整資料,謝謝樓主了
回復

使用道具 舉報

15#
ID:89553 發表于 2015-9-7 11:00 | 只看該作者
求完整程序,謝樓主了。2841208412@qq.com
回復

使用道具 舉報

16#
ID:79544 發表于 2015-11-2 13:00 | 只看該作者
值得尊敬,謝謝分享。能把頭文件也分享大家都可以做出來啦。
回復

使用道具 舉報

17#
ID:70736 發表于 2016-3-1 10:31 | 只看該作者
樓主共享的資料可否打包一下。!
回復

使用道具 舉報

18#
ID:104472 發表于 2016-3-1 16:21 | 只看該作者
分享,可以不發原文件,但希望樓主積極和大家交流
回復

使用道具 舉報

19#
ID:124330 發表于 2016-7-16 22:53 來自手機 | 只看該作者
樓主可以給個完整程序嗎?1543921814@qq.com   謝謝哦
回復

使用道具 舉報

20#
ID:137079 發表于 2016-8-18 20:16 | 只看該作者
樓主可以給個完整程序嗎?2428784068@qq.com   謝謝樓主
回復

使用道具 舉報

21#
ID:143094 發表于 2016-10-17 18:35 | 只看該作者
求完整文件,謝謝偉大樓主,10247451532@qq.com
回復

使用道具 舉報

22#
ID:146045 發表于 2016-11-14 13:33 | 只看該作者
資料不錯
回復

使用道具 舉報

23#
ID:139660 發表于 2017-2-26 18:33 | 只看該作者
樓主,我想看看子程序是怎么寫的。郵箱:876623863@163.com
謝謝樓主!
回復

使用道具 舉報

24#
ID:230689 發表于 2017-9-3 23:43 | 只看該作者
樓主可以給個完整程序嗎 1374679043@qq.com謝謝!
回復

使用道具 舉報

25#
ID:221145 發表于 2017-10-16 10:11 | 只看該作者
感謝分享,借鑒
回復

使用道具 舉報

26#
ID:256390 發表于 2017-12-3 08:15 | 只看該作者
感謝樓主
回復

使用道具 舉報

27#
ID:253767 發表于 2017-12-24 08:55 | 只看該作者
大家都很渴求,謝謝分享
回復

使用道具 舉報

28#
ID:380389 發表于 2018-10-14 23:04 | 只看該作者
能幫我把藍牙那部分的程序去掉嗎?多了藍牙那部分的程序,我就看不明白了,拜托了,謝謝了
如果弄出來后發到我郵箱2797231135@qq.com 好么?謝謝了,你很棒,我很需要你的幫助
回復

使用道具 舉報

29#
ID:380389 發表于 2018-12-21 17:04 | 只看該作者
請樓主分享完整程序
回復

使用道具 舉報

30#
ID:780742 發表于 2021-3-17 22:59 | 只看該作者
樓主有其他頭文件的代碼嗎?求完整代碼
回復

使用道具 舉報

31#
ID:780742 發表于 2021-3-17 23:27 | 只看該作者
感謝樓主,求proteus仿真原理圖
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 不卡的av电影| 国产一级片一区二区 | 成年人在线播放 | 精品视频久久久久久 | 欧美国产激情 | 亚洲成人观看 | 欧美一二精品 | 国产一区二区自拍 | 日本黄色免费视频 | av第一页 | 成人自拍视频网站 | 中文字幕亚洲区一区二 | caoporon| 国产精品久久久久久久久久久久午夜片 | 久久精品久久久久久 | 81精品国产乱码久久久久久 | 国产精品美女久久久久aⅴ国产馆 | 成人在线不卡 | 中文字幕日韩欧美 | 久久国产日韩 | 国产精品国产精品国产专区不片 | 男人的天堂久久 | 色橹橹欧美在线观看视频高清 | 中文字幕精品一区二区三区精品 | 精品欧美一区二区三区久久久 | 国产在线视频一区 | 国产精品久久久久久久久 | 久久精品欧美一区二区三区不卡 | 国产成人精品一区二区 | 亚洲精品久久久久国产 | 国产日韩精品一区 | 99成人在线视频 | 岛国毛片在线观看 | 欧美又大粗又爽又黄大片视频 | 久久久久高清 | 国产午夜精品理论片a大结局 | 久久久久久国产精品免费免费男同 | 国产精品久久av | 欧美成视频在线观看 | 欧美一级二级视频 | 天天玩天天操天天干 |