使用ADXL345測量角度
單片機源程序如下:
- #include <Wire.h> //調用arduino自帶的I2C庫
- #include <LiquidCrystal.h> //調用arduino自帶的LiquidCrystal庫
- #define Register_ID 0
- #define Register_2D 0x2D
- #define Register_X0 0x32
- #define Register_X1 0x33
- #define Register_Y0 0x34
- #define Register_Y1 0x35
- #define Register_Z0 0x36
- #define Register_Z1 0x37
- #define pai 3.1415926
- unsigned char wave_x,wave_y,wave_z;
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//設置接口
- int ADXAddress = 0xA7>>1; //轉換為7位地址
- int reading = 0;
- int val = 0;
- int X0,X1,X_out;
- int Y0,Y1,Y_out;
- int Z1,Z0,Z_out;
- int Xg,Yg,Zg;
- void setup()
- {
- lcd.begin(16, 2); //初始化LCD
- delay(100);
- Wire.begin(); //初始化I2C
- delay(100);
- Wire.beginTransmission(ADXAddress);
- Wire.write(Register_2D);
- Wire.write(8);
- Wire.endTransmission();
- }
- void loop()
- {
- Wire.beginTransmission(ADXAddress);
- Wire.write(Register_X0);
- Wire.write(Register_X1);
- Wire.endTransmission();
- Wire.requestFrom(ADXAddress,2);
- if(Wire.available()<=2);
- {
- X0 = Wire.read();
- X1 = Wire.read();
- X1 = X1<<8;
- X_out = X0+X1;
- }
-
- Wire.beginTransmission(ADXAddress);
- Wire.write(Register_Y0);
- Wire.write(Register_Y1);
- Wire.endTransmission();
- Wire.requestFrom(ADXAddress,2);
- if(Wire.available()<=2);
- {
- Y0 = Wire.read();
- Y1 = Wire.read();
- Y1 = Y1<<8;
- Y_out = Y0+Y1;
- }
-
- Wire.beginTransmission(ADXAddress);
- Wire.write(Register_Z0);
- Wire.write(Register_Z1);
- Wire.endTransmission();
- Wire.requestFrom(ADXAddress,2);
- if(Wire.available()<=2);
- {
- Z0 = Wire.read();
- Z1 = Wire.read();
- Z1 = Z1<<8;
- Z_out = Z0+Z1;
- }
-
- Xg = X_out;
- Yg = Y_out;
- Zg = Z_out;
- Xg=Xg*3.9+3;
- Yg*=3.9;
- Zg=Zg*3.9-6;
- if(Xg<0){Xg=-Xg;wave_x=1;}
- else wave_x=0;
- if(Yg<0){Yg=-Yg;wave_y=1;}
- else wave_y=0;
- if(Zg<0){Zg=-Zg;wave_z=1;}
- else wave_z=0;
- Xg=(int)((atan((double)(Xg/sqrt(pow((double)Yg,2)+pow((double)Zg,2))))*180/pai*10));
- Yg=(int)((atan((double)(Yg/sqrt(pow((double)Xg,2)+pow((double)Zg,2))))*180/pai*10));
- Zg=(int)((atan((double)(Zg/sqrt(pow((double)Xg,2)+pow((double)Yg,2))))*180/pai*10));
- if(wave_z&!wave_x)Xg=1800-Xg;
- else if(wave_z&wave_x)Xg=1800+Xg;
- else if(!wave_z&wave_x)Xg=3600-Xg;
- lcd.clear(); //清屏
- lcd.print("X = "); //使屏幕顯示文字X=
- lcd.print(Xg/10.0);
- lcd.setCursor(0, 1);
- lcd.print("Y = ");
- lcd.print(Yg/10.0);
- delay(300); //延時0.3秒,刷新頻率這里進行調整
-
- }
復制代碼
所有資料51hei提供下載:
ADXLMOTO.zip
(1.04 KB, 下載次數: 21)
2018-7-19 10:03 上傳
點擊文件名下載附件
|