#include <REG52.H> #include <math.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H> typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; //******功能模塊頭文件******* //#include "DELAY.H" //延時頭文件 #include "lcd1602.H" //LCD1602文件 #include "MPU6050.H" //MPU6050頭文件 //******角度參數************ float Accel_ax; float Accel_az; //X軸加速度值暫存 float Angle; //小車最終傾斜角度 uchar value; //角度正負極性標記 //float Accel_x; //float Angle_ax; //float Gyro_y; //Y軸陀螺儀數據暫存 //********************************************************* // 傾角計算(卡爾曼融合) //********************************************************* float Angle_Calcu(void) { //------加速度-------------------------- //范圍為2g時,換算關系:16384 LSB/g //角度較小時,x=sinx得到角度(弧度), deg = rad*180/3.14 //因為x>=sinx,故乘以1.3適當放大 Accel_ax = GetData(ACCEL_XOUT_H); //讀取X軸加速度 Accel_az = GetData(ACCEL_ZOUT_H); //讀取X軸加速度 Angle = (int)(atan(Accel_ax/Accel_az)*180/3.14); /* Accel_x = GetData(ACCEL_XOUT_H); //讀取X軸加速度 Angle_ax = (Accel_x - 1100) /16384; //去除零點偏移,計算得到角度(弧度) Angle_ax = Angle_ax*1.2*180/3.14; //弧度轉換為度, return Angle_ax; Gyro_y = GetData(GYRO_YOUT_H); //靜止時角速度Y軸輸出為-30左右 Gyro_y = -(Gyro_y + 30)/16.4; //去除零點偏移,計算角速度值,負號為方向處理 Angle = Angle + Gyro_y*0.01; //角速度積分得到傾斜角度.*/ return Angle; } void main() { //float ax,ay,az,xx,yy,zz; float xx; delay(500); //上電延時 InitLcd(); //液晶初始化 InitMPU6050(); //初始化MPU6050 delay(150); while(1) { xx=Angle_Calcu(); lcd_printf(dis,xx); //轉換數據顯示 DisplayListChar(2,0,dis,4); } } |