ADXL345角度傳感器測(cè)二維角度Keil-C程序_第1頁
ADXL345角度傳感器測(cè)二維角度Keil-C程序_第2頁
ADXL345角度傳感器測(cè)二維角度Keil-C程序_第3頁
ADXL345角度傳感器測(cè)二維角度Keil-C程序_第4頁
ADXL345角度傳感器測(cè)二維角度Keil-C程序_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)程序說明:該程序中有兩個(gè)C文件,均為同一Keil或TKstudio工程下的C源文件,分別為ADXL345_main和ADXL345_LCD,此程序在Keil uVision2或TKstudio version4.5編譯環(huán)境下均可正常運(yùn)行,ADXL345 - 0 Error(s), 0 Warning(s).項(xiàng)目說明:采用全集成的三軸加速度傳感器ADXL345進(jìn)行二維傾角的測(cè)量,用1602液晶(LCD省去了測(cè)忙函數(shù))顯示角度值,其值精確到小數(shù)點(diǎn)后兩位。ADXL345_ma

2、in.c文件:/*頭文件*/#include #include #include /*宏定義*/#define uchar unsigned char#define uint unsigned int/*位定義*/sbit CS = P21; / 片選信號(hào)端sbit SCLK = P31; / 時(shí)鐘sbit SDI = P30; / 數(shù)據(jù)讀/寫/*函數(shù)聲明*/void write_comd(uchar);/void write_data_LCD(uchar);void LCD_init(); / LCD 初始化void display_LCD();/ LCD顯示void calculate()

3、; / ASCII碼計(jì)算/*全局變量*/uint Data_X_22; / 讀出的數(shù)據(jù)儲(chǔ)存 X Y Zuint Data_Y_22;uint Data_Z_22;int Data_X,Data_Y,Data_Z; / 數(shù)值轉(zhuǎn)換后的值float XX,YY,ZZ;/ 3軸的重力加速度分量uchar ID;/ 機(jī)器ID值 用于看讀的是否對(duì)(調(diào)試時(shí)用)float roll,pitch;/* 函數(shù)名:Delayms()* 功能描述:產(chǎn)生延遲* 形參:ms 延遲的時(shí)間,單位ms* 返回值:無* 局部變量:i* 全局變量:無* 函數(shù)調(diào)用: 無*/void delay_ms(uchar ms)uchar i

4、;while(ms-)for(i = 0; i 250; i+)_nop_();_nop_(); /空?qǐng)?zhí)行消耗CPU時(shí)間達(dá)到等待的效果_nop_();_nop_();/* 函數(shù)名:Write_Data(uchar Data_write)* 功能描述:寫指令到寄存器 * 形參:Data_write 要寫的數(shù)據(jù) 8位* 返回值:無* 局部變量:i* 全局變量:無* 函數(shù)調(diào)用: _nop_(); */*寫數(shù)據(jù)函數(shù)*/void Write_Data(uchar Adress_Reg,uchar Data_write)uchar i=0;Adress_Reg=(Adress_Reg & 0 x7f);/

5、 置最高位位0 寫狀態(tài)Adress_Reg=(Adress_Reg & 0 xbf); / 置第二高位0 單字節(jié)讀寫CS=0;_nop_();SCLK=1;_nop_();for(i=0;i8;i+) / 8位串行輸出 寄存器地址值SCLK=0;_nop_();SDI=(bit)(Adress_Reg & 0 x80);_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();Adress_Reg=1;for(i=0;i8;i+)/ 8位串行輸出 指令值SCLK=0;_nop_();SDI=(bit)(Data_write & 0 x80);_nop_();

6、_nop_();_nop_();SCLK=1;_nop_();_nop_();Data_write=1;_nop_();_nop_();SCLK=1;_nop_();_nop_();SDI=1;CS=1;/* 函數(shù)名: Read_Data_Reg(uchar Adress_Reg) * 功能描述:往寄存器讀數(shù)據(jù) * 形參:Adress_Reg 寄存器地址* 返回值:Data_Read 讀取的數(shù)據(jù)* 局部變量:i Data_Read 讀取的數(shù)據(jù) * 全局變量:無* 函數(shù)調(diào)用: _nop_(); */uchar Read_Data_Reg(uchar Adress_Reg)uchar i=0;uc

7、har Data_Read;Adress_Reg=(Adress_Reg|0 x80); / 置最高位為1, 讀狀態(tài)Adress_Reg=(Adress_Reg&0 xbf); / 置第二高位位0, 單字節(jié)讀寫CS=0;_nop_();_nop_();SCLK=1;_nop_();_nop_();for(i=0;i8;i+) / 8位串行輸出 寄存器地址值SCLK=0;_nop_();SDI=(bit)(Adress_Reg & 0 x80);_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();Adress_Reg=1;for(i=0;i8;i+) /

8、 8位串行讀入 數(shù)據(jù)(8位) SCLK=0;Data_Read=1;_nop_();Data_Read|=(uchar)SDI;_nop_();_nop_();SCLK=1;_nop_();_nop_();for(i=0;i8;i+) / 產(chǎn)生8個(gè)脈沖 (手冊(cè)要求,目的不知道)SCLK=0;_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();_nop_();SCLK=1;_nop_();CS=1;return Data_Read;/* 函數(shù)名:Read_Data()* 功能描述:讀出6字節(jié)X Y Z 軸各兩字節(jié)的數(shù)據(jù) * 形參:無* 返回值:無* 局部

9、變量:無* 全局變量:Data_X_22 Data_Y_22 Data_Z_22 存放讀出值 * 函數(shù)調(diào)用:Read_Data_Reg(_);delay_ms(_); */void Read_Data()/*DATAX0是X軸加速度的低字節(jié)寄存器,DATAX1是高字節(jié)寄存器*/Data_X_20=Read_Data_Reg(0 x32); / 讀出X軸低位Data_X_21=Read_Data_Reg(0 x33); / 讀出X軸高位delay_ms(10);Data_Y_20=Read_Data_Reg(0 x34); / 讀出Y軸低位Data_Y_21=Read_Data_Reg(0 x3

10、5); / 讀出Y軸高位delay_ms(10);Data_Z_20=Read_Data_Reg(0 x36); / 讀出Z軸低位Data_Z_21=Read_Data_Reg(0 x37); / 讀出Z軸高位/* 函數(shù)名: ADXL345_init()* 功能描述:ADXL345 初始化 對(duì)寄存器寫指令 * 形參:無* 返回值:無* 局部變量:無* 全局變量:無* 函數(shù)調(diào)用:Write_Data_Reg(_,_);*/void ADXL345_init()Write_Data(0 x31,0 x4f); /測(cè)量范圍為正負(fù)16g 13位模式 3線SPI 中斷低有效 禁用自測(cè)力 左對(duì)齊(MSB)

11、模式delay_ms(10);Write_Data(0 x2C,0 x08); /速率設(shè)定為25HZ,帶寬12.5HZ delay_ms(10);Write_Data(0 x2D,0 x08); /選擇電源模式delay_ms(10);Write_Data(0 x2E,0 x80); /使能 DATA_READY 中斷delay_ms(10);Write_Data(0 x2f,0 x00); /中斷功能設(shè)定,不使用中斷delay_ms(10);/*Write_Data(0 x1E,0 x00); /X 偏移量 根據(jù)測(cè)試傳感器的delay_ms(10); Write_Data(0 x1F,0 x

12、00); /Y 偏移量 根據(jù)測(cè)試傳感器的delay_ms(10); Write_Data(0 x20,0 x00); /Z 偏移量 根據(jù)測(cè)試傳感器的delay_ms(10);Write_Data(0 x21,0 x00); /敲擊延時(shí)0:禁用; (1.25ms/LSB)delay_ms(10);Write_Data(0 x22,0 x00); /檢測(cè)第一次敲擊后的延時(shí)0:禁用; (1.25ms/LSB) delay_ms(10);Write_Data(0 x23,0 x00); /敲擊窗口0:禁用; (1.25ms/LSB)delay_ms(10);Write_Data(0 x24,0 x00

13、); /保存檢測(cè)活動(dòng)閥值; (62.5mg/LSB)delay_ms(10);Write_Data(0 x25,0 x00); /保存檢測(cè)靜止閥值; (62.5mg/LSB) delay_ms(10);Write_Data(0 x26,0 x2b); /檢測(cè)活動(dòng)時(shí)間閥值; (1s/LSB)delay_ms(10);Write_Data(0 x27,0 x00); / 活動(dòng) 靜止檢測(cè)禁止delay_ms(10);Write_Data(0 x28,0 x09); /保存檢測(cè)活動(dòng)閥值; (62.5mg/LSB)delay_ms(10);Write_Data(0 x29,0 xff); /保存檢測(cè)靜止

14、閥值; (62.5mg/LSB)delay_ms(10);Write_Data(0 x2a,0 x80); delay_ms(10);*/* 函數(shù)名: transform(void)* 功能描述:數(shù)值整合和轉(zhuǎn)換,并轉(zhuǎn)換為加速度 放大1000倍* 形參:無* 返回值:無* 局部變量:無* 全局變量:Data_X=0,Data_Y=0,Data_Z 整合后的X Y Z 軸值* 函數(shù)調(diào)用:無*/*從數(shù)據(jù)寄存器中獲取加速度數(shù)據(jù)后,用戶必須對(duì)數(shù)據(jù)進(jìn)行重建*/*數(shù)值轉(zhuǎn)換*/void transform(void)(int)Data_X=(Data_X_20)+(Data_X_218);(int)Data_

15、Y=(Data_Y_20)+(Data_Y_218); (int)Data_Z=(Data_Z_20)+(Data_Z_218);if(Data_X&0 x2000) / 若位負(fù)數(shù) 轉(zhuǎn)換為補(bǔ)碼Data_X=(Data_X)+1;Data_X=Data_X*3.90625; / 乘比例因素Data_X=-Data_X;elseData_X=Data_X*3.90625;if(Data_Y&0 x2000)/ 若位負(fù)數(shù) 轉(zhuǎn)換為補(bǔ)碼Data_Y=(Data_Y)+1;Data_Y=Data_Y*3.90625;/ 乘比例因素Data_Y=-Data_Y;elseData_Y=Data_Y*3.906

16、25;if(Data_Z&0 x2000) / 若位負(fù)數(shù) 轉(zhuǎn)換為補(bǔ)碼Data_Z=(Data_Z)+1;Data_Z=Data_Z*3.90625; / 乘比例因素Data_Z=-Data_Z;elseData_Z=Data_Z*3.90625;/*if(Data_X0) Data_X=-Data_X;Data_X=(float)Data_X*3.9;/Data_X單位為1000倍的g,即mgelseData_X=(float)Data_X*3.9;if(Data_Y0)Data_Y=-Data_Y;Data_Y=(float)Data_Y*3.9;elseData_Y=(float)Data

17、_Y*3.9;if(Data_Z0) Data_Z=-Data_Z;Data_Z=(float)Data_Z*3.9;elseData_Z=(float)Data_Z*3.9;*/*擴(kuò)大1000倍后結(jié)果*/*檢測(cè)軸始終檢測(cè)到的是正加速度*/XX=Data_X; / X軸重力加速度分量YY=Data_Y; / Y軸重力加速度分量ZZ=Data_Z; / Z軸重力加速度分量/* 函數(shù)名:calculate_angle(float V_x,float V_y,float V_z)* 功能描述:計(jì)算橫滾角和俯仰角 * 形參:G_x G_x G_zX Y Z軸的加速度值* 返回值:無* 局部變量:無 *

18、 全局變量:roll pitch 橫滾角和俯仰角* 函數(shù)調(diào)用:atan2(_,_); */ /*計(jì)算角度函數(shù)*/void calculate_angle(float G_x,float G_y,float G_z)roll=-(float)(atan2(G_z,G_x)*180)/3.)-90);/弧度轉(zhuǎn)成角度 pitch=-(float)(atan2(G_z,G_y)*180)/3.)-90);roll=roll*100;pitch=pitch*100;/*主函數(shù)*/void main(void)delay_ms(5); /上電延時(shí)ADXL345_init(); / ADXL345的初始化L

19、CD_init(); / LCD的初始化ID=Read_Data_Reg(0 x00);/ 讀出機(jī)器ID值,DEVID寄存器保存0 xE5的固定器件ID代碼while(1) Read_Data();/讀出X Y Z 軸加速度值 transform(); /數(shù)據(jù)重建過程calculate_angle(XX,YY,ZZ);/計(jì)算x和y軸相對(duì)于水平面的傾角calculate(); / ASCII碼計(jì)算display_LCD();/ 顯示ADXL345_LCD.c文件:#include /51寄存器文件#include /*宏定義*/#define uchar unsigned char#define uint unsigned int/*位定義及變量聲明*/sbit LCDEN=P34;sbit RS=P35;sbit DULA=P26;sbit WEILA=P27;extern uchar ID;extern float roll,pitch;uchar dis116 = X+00.00 Y+00.00;uchar dis216 = ID:000;/*計(jì)算函數(shù)*/void calculat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論