久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
自平衡小車控制(stc12+mpu6050程序)
[打印本頁(yè)]
作者:
liuyy
時(shí)間:
2015-1-12 14:26
標(biāo)題:
自平衡小車控制(stc12+mpu6050程序)
/***********************************************************************
// 兩輪自平衡車最終版控制程序(6軸MPU6050+互補(bǔ)濾波+PWM電機(jī))
// 單片機(jī)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" //延時(shí)頭文件
//--------------------------------------------
#include "STC_ISP.H" //程序燒錄頭文件
#include "SET_SERIAL.H"//串口頭文件
#include "SET_PWM.H"//PWM頭文件
#include "MOTOR.H"//電機(jī)控制頭文件
#include "MPU6050.H"//MPU6050頭文件
//-----------------這些文件---------------------------
//******角度參數(shù)************
float Gyro_y; //Y軸陀螺儀數(shù)據(jù)暫存
//--------------加速度和角度的轉(zhuǎn)化------------------
float Angle_gy; //由角速度計(jì)算的傾斜角度
//陀螺儀直接反應(yīng)角度
float Accel_x; //X軸加速度值暫存
float Angle_ax; //由加速度計(jì)算的傾斜角度 、
float Angle; //小車最終傾斜角度
uchar value; //角度正負(fù)極性標(biāo)記
//******PWM參數(shù)*************
int speed_mr; //右電機(jī) 轉(zhuǎn)速//這個(gè)的測(cè)量---------轉(zhuǎn)盤
int speed_ml; //左電機(jī) 轉(zhuǎn)速
int PWM_R; //右輪PWM值計(jì)算
int PWM_L; //左輪PWM值計(jì)算
float PWM; //綜合PWM計(jì)算
float PWMI; //PWM積分值
//******電機(jī)參數(shù)*************
float speed_r_l;//電機(jī)轉(zhuǎn)速
float speed; //電機(jī)轉(zhuǎn)速濾波
float position; //位移
//******藍(lán)牙遙控參數(shù)*************
uchar remote_char;
char turn_need;
char speed_need;
//*********************************************************
//定時(shí)器100Hz數(shù)據(jù)更新中斷 T1定時(shí)器
//*********************************************************
void Init_Timer1(void)//10毫秒@20MHz,100Hz刷新頻率
{
AUXR &= 0xBF;//定時(shí)器時(shí)鐘12T模式
TMOD &= 0x0F;//設(shè)置定時(shí)器模式
TMOD |= 0x10;//設(shè)置定時(shí)器模式
TL1 = 0xE5; //設(shè)置定時(shí)初值
TH1 = 0xBE; //設(shè)置定時(shí)初值
TF1 = 0; //清除TF1標(biāo)志
TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí)
}
//*********************************************************
//中斷控制初始化
//*********************************************************
void Init_Interr(void)
{
EA = 1; //開(kāi)總中斷
EX0 = 1; //開(kāi)外部中斷INT0
EX1 = 1; //開(kāi)外部中斷INT1
IT0 = 1; //下降沿觸發(fā)
IT1 = 1; //下降沿觸發(fā)
ET1 = 1; //開(kāi)定時(shí)器1中斷
}
//******卡爾曼參數(shù)************
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濾波器采樣時(shí)間;
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的處理時(shí)間約0.77ms;
void Kalman_Filter(float Accel,float Gyro) // 濾波,輸出標(biāo)準(zhǔn)的方波驅(qū)動(dòng)電機(jī)
{
Angle+=(Gyro - Q_bias) * dt; //先驗(yàn)估計(jì)陀螺角度
Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先驗(yàn)估計(jì)誤差協(xié)方差的微分
Pdot[1]=- PP[1][1];
Pdot[2]=- PP[1][1];
Pdot[3]=Q_gyro;
PP[0][0] += Pdot[0] * dt; // Pk-先驗(yàn)估計(jì)誤差協(xié)方差微分的積分
PP[0][1] += Pdot[1] * dt; // =先驗(yàn)估計(jì)誤差協(xié)方差
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
Angle_err = Accel - Angle;//zk-先驗(yàn)估計(jì)
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; //后驗(yàn)估計(jì)誤差協(xié)方差
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; //后驗(yàn)估計(jì)
Q_bias+= K_1 * Angle_err; //后驗(yàn)估計(jì)
Gyro_y = Gyro - Q_bias; //輸出值(后驗(yàn)估計(jì))的微分=角速度
}
//*********************************************************
// 傾角計(jì)算(卡爾曼融合)
//*********************************************************
void Angle_Calcu(void)
{
//------加速度--------------------------
//范圍為2g時(shí),換算關(guān)系:16384 LSB/g
//角度較小時(shí),x=sinx得到角度(弧度), deg = rad*180/3.14
//因?yàn)閤>=sinx,故乘以1.3適當(dāng)放大
Accel_x = GetData(ACCEL_XOUT_H); //讀取X軸加速度 存在ACCEL_XOUT_H 寄存器
Angle_ax = (Accel_x - 1100) /16384; //去除零點(diǎn)偏移,計(jì)算得到角度(弧度)
Angle_ax = Angle_ax*1.2*180/3.14; //弧度轉(zhuǎn)換為度,
//-------角速度-------------------------
//范圍為2000deg/s時(shí),換算關(guān)系:16.4 LSB/(deg/s)
Gyro_y = GetData(GYRO_YOUT_H); //靜止時(shí)角速度Y軸輸出為 【-30】 左右
Gyro_y = -(Gyro_y + 30)/16.4; //去除零點(diǎn)偏移,計(jì)算角速度值, 【負(fù)號(hào)為方向處理】
//Angle_gy = Angle_gy + Gyro_y*0.01; //角速度積分得到傾斜角度.
//-------卡爾曼濾波融合-----------------------
Kalman_Filter(Angle_ax,Gyro_y); //卡爾曼濾波計(jì)算傾角
/*//-------互補(bǔ)濾波-----------------------
//補(bǔ)償原理是取當(dāng)前傾角和加速度獲得傾角差值進(jìn)行放大,然后與
//陀螺儀角速度疊加后再積分,從而使傾角最跟蹤為加速度獲得的角度
//0.5為放大倍數(shù),可調(diào)節(jié)補(bǔ)償度;0.01為系統(tǒng)周期10ms
Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);*/
}
//*********************************************************
//電機(jī)轉(zhuǎn)速和位移值計(jì)算
//*********************************************************
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;//加上藍(lán)牙位移,等于總的移動(dòng)
if(position<-6000) position = -6000;
if(position> 6000) position = 6000;
}
static float code Kp = 9.0; //PID參數(shù)
static float code Kd = 2.6; //PID參數(shù)
static float code Kpn = 0.01; //PID參數(shù)
static float code Ksp = 2.0; //PID參數(shù)
//*********************************************************
//電機(jī)PWM值計(jì)算
//*********************************************************
void PWM_Calcu(void)
{
if(Angle<-40||Angle>40) //角度過(guò)大,關(guān)閉電機(jī)
{
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; //藍(lán)牙的傾斜,
PWM_Motor(PWM_L,PWM_R);
}
//*********************************************************
//手機(jī)藍(lán)牙遙控
//*********************************************************
void Bluetooth_Remote(void)
{
remote_char = receive_char(); //接收藍(lán)牙串口數(shù)據(jù)
if(remote_char ==0x02) speed_need = -80; //前進(jìn)
else if(remote_char ==0x01) speed_need = 80; //后退
else speed_need = 0; //不動(dòng)
if(remote_char ==0x03) turn_need = 15; //左轉(zhuǎn)
else if(remote_char ==0x04) turn_need = -15; //右轉(zhuǎn)
else turn_need = 0; //不轉(zhuǎn)
}
/*=================================================================================*/
//*********************************************************
//main
//*********************************************************
void main()
{
delaynms(500); //上電延時(shí)
Init_PWM(); //PWM初始化
Init_Timer0(); //初始化定時(shí)器0,作為PWM時(shí)鐘源
Init_Timer1(); //初始化定時(shí)器1
Init_Interr(); //中斷初始化
Init_Motor(); //電機(jī)控制初始化
Init_BRT(); //串口初始化(獨(dú)立波特率)
InitMPU6050(); //初始化MPU6050
delaynms(500);
while(1)
{
Bluetooth_Remote();
}
}
/*=================================================================================*/
//********timer1中斷***********************
void Timer1_Update(void) interrupt 3
{
TL1 = 0xE5; //設(shè)置定時(shí)初值10MS
TH1 = 0xBE;
//STC_ISP(); //程序下載
Angle_Calcu(); //傾角計(jì)算
Psn_Calcu(); //電機(jī)位移計(jì)算
PWM_Calcu(); //計(jì)算PWM值
speed_mr = speed_ml = 0;
}
//********右電機(jī)中斷***********************
void INT_L(void) interrupt 0
{
if(SPDL == 1) { speed_ml++; } //左電機(jī)前進(jìn)
else { speed_ml--; } //左電機(jī)后退
LED = ~LED;
}
//********左電機(jī)中斷***********************
void INT_R(void) interrupt 2
{
if(SPDR == 1) { speed_mr++; } //右電機(jī)前進(jìn)
else { speed_mr--; } //右電機(jī)后退
LED = ~LED;
}
作者:
安生
時(shí)間:
2015-4-7 12:21
本帖最后由 安生 于 2015-4-7 12:24 編輯
樓主乃神人也:能給個(gè)電路圖和完整軟件嗎?我退休在家,有時(shí)間,對(duì)單片機(jī)只知點(diǎn)毛皮,正在學(xué)習(xí),想做一個(gè)玩玩。謝謝啦。
dxq731@126.com
作者:
lingaaaaa
時(shí)間:
2015-5-25 20:59
能幫我把藍(lán)牙那部分的程序去掉嗎?多了藍(lán)牙那部分的程序,我就看不明白了,拜托了,謝謝了
如果弄出來(lái)后發(fā)到我郵箱
1002831161@qq.com
好么?謝謝了,你很棒,我很需要你的幫助
作者:
你好謝謝
時(shí)間:
2015-6-27 20:47
你好,現(xiàn)在我用51單片機(jī)做著自平衡車,不過(guò)到達(dá)pid調(diào)試的時(shí)候就不知怎么下手了,新手,希望樓主能給我一個(gè)完整資料參考一下嗎?如果可以,那真是感激不盡
作者:
你好謝謝
時(shí)間:
2015-6-27 20:49
作者:
你好謝謝
時(shí)間:
2015-6-27 20:50
對(duì)了 我的qq郵箱是
995709242@qq.com
作者:
威爾
時(shí)間:
2015-6-29 11:59
能把原理圖共享一下,就更完美了,謝謝樓主的分享。尊敬、
作者:
綠源學(xué)習(xí)者
時(shí)間:
2015-7-23 14:28
這個(gè)程序還沒(méi)有完整把,你有角度傳感器的資料和程序嗎
作者:
thankday
時(shí)間:
2015-7-28 18:13
感謝,這位牛人
作者:
liaolinhui
時(shí)間:
2015-8-1 13:11
頭文件呢
作者:
1678
時(shí)間:
2015-8-7 18:58
能給完整資料嗎
作者:
sunsline
時(shí)間:
2015-8-14 16:04
樓主,能給我頭文件嗎?QQ郵箱979690676。
作者:
zhangxiaoguo9
時(shí)間:
2015-8-29 14:35
能提供下完整程序嗎?我郵箱是857047534@qq. com
作者:
李博士安德
時(shí)間:
2015-9-7 10:59
求完整資料,謝謝樓主了
作者:
李博士安德
時(shí)間:
2015-9-7 11:00
求完整程序,謝樓主了。
2841208412@qq.com
作者:
騰飛的龍
時(shí)間:
2015-11-2 13:00
值得尊敬,謝謝分享。能把頭文件也分享大家都可以做出來(lái)啦。
作者:
知識(shí)閱覽者
時(shí)間:
2016-3-1 10:31
樓主共享的資料可否打包一下。。
作者:
jiajuntao
時(shí)間:
2016-3-1 16:21
分享,可以不發(fā)原文件,但希望樓主積極和大家交流
作者:
Jesse_ice
時(shí)間:
2016-7-16 22:53
樓主可以給個(gè)完整程序嗎?1543921814@qq.com 謝謝哦
作者:
FMPM
時(shí)間:
2016-8-18 20:16
樓主可以給個(gè)完整程序嗎?
2428784068@qq.com
謝謝樓主
作者:
newstar
時(shí)間:
2016-10-17 18:35
求完整文件,謝謝偉大樓主,
10247451532@qq.com
作者:
熱帶雨林
時(shí)間:
2016-11-14 13:33
資料不錯(cuò)
作者:
xiaosizhu1995
時(shí)間:
2017-2-26 18:33
樓主,我想看看子程序是怎么寫的。郵箱:
876623863@163.com
謝謝樓主!
作者:
NIU12345
時(shí)間:
2017-9-3 23:43
樓主可以給個(gè)完整程序嗎
1374679043@qq.com
謝謝!
作者:
insightx
時(shí)間:
2017-10-16 10:11
感謝分享,借鑒
作者:
張oa
時(shí)間:
2017-12-3 08:15
感謝樓主
作者:
tieq1952
時(shí)間:
2017-12-24 08:55
大家都很渴求,謝謝分享
作者:
xsj1877578806
時(shí)間:
2018-10-14 23:04
能幫我把藍(lán)牙那部分的程序去掉嗎?多了藍(lán)牙那部分的程序,我就看不明白了,拜托了,謝謝了
如果弄出來(lái)后發(fā)到我郵箱
2797231135@qq.com
好么?謝謝了,你很棒,我很需要你的幫助
作者:
xsj1877578806
時(shí)間:
2018-12-21 17:04
請(qǐng)樓主分享完整程序
作者:
帥同學(xué)
時(shí)間:
2021-3-17 22:59
樓主有其他頭文件的代碼嗎?求完整代碼
作者:
帥同學(xué)
時(shí)間:
2021-3-17 23:27
感謝樓主,求proteus仿真原理圖
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产成人高清在线观看
|
欧美午夜在线
|
在线视频三区
|
亚洲欧洲成人
|
日韩在线一区视频
|
亚洲精品久久久久久一区二区
|
黄色在线观看网站
|
第一区在线观看免费国语入口
|
欧美成人精品欧美一级
|
av国产精品
|
欧美综合一区二区三区
|
激情六月丁香婷婷
|
日韩成人免费在线视频
|
欧美中文字幕在线观看
|
国内精品视频在线
|
亚洲精品国产精品国自产在线
|
欧美一区二区在线
|
国产精品v
|
欧美成人在线影院
|
日本精品一区二区
|
精品1区2区
|
伊人激情网
|
九九热免费观看
|
亚洲综合久久久
|
久久亚洲一区
|
av一区在线
|
伊人伊人
|
日韩免费福利视频
|
欧美日韩久久精品
|
一本岛道一二三不卡区
|
亚洲精品视
|
午夜手机在线视频
|
特黄色一级毛片
|
久久免费精彩视频
|
激情久久av一区av二区av三区
|
九九热在线视频
|
91免费视频
|
亚洲三区在线播放
|
久久亚洲一区二区
|
天天干免费视频
|
亚洲精品一区中文字幕
|