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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11161|回復: 2
收起左側

Mpu6050的I2C控制技術詳解以及單片機例程

[復制鏈接]
ID:296396 發表于 2018-3-24 16:24 | 顯示全部樓層 |閱讀模式
C總線協議與MPU6050
  • others->bit型變量的強制類型轉換規則:
在keil c里bit是一位的,屬于對標準c擴展的數據類型。我舉個例子說明bit的強制轉換規則,例如有變量unsigned char num,變量bit tmp,那么tmp =(bit) num就是把unsigned char型變量強制轉換為bit型,不過規則有點和一般的強制轉換不一樣,bit進行強制轉換時,只要num不等于0(或者0x00),那么tmp =(bit) num的結果就是1,自然地如果num=0,那么tmp=0。
  • intrins.h里面包含這樣一個函數:_nop_();,代表延時一個機器周期。
         機器周期=晶振周期*12;
  • C總線傳輸的例程:
  1. #include <reg52.h>
  2. #include <intrins.h>      //包含機器周期延時函數_nop_()
  3. #define OP_READ 0xa1    //器件地址以及讀取操作 1010 0001B
  4. #define OP_WRITE 0xa0   //器件地址以及寫入操作 1010 0000B
  5. /*說明:器件地址為前7位,最低一位為選擇讀或寫*/
  6. sbit SDA=P3^5;
  7. sbit SCL=P3^4;
  8. /* 延時1ms*/
  9. void delay1ms()
  10. {
  11. unsigned char I,j;
  12. for(i=0;i<10;i++)
  13. for(j=0;j<33;j++)
  14. ;
  15. }
  16. /*延時若干毫秒*/
  17. void delayms(unsigned char n)
  18. {
  19. Unsigned char j;
  20. For(i=0;i<n;i++)
  21. Delay1ms();
  22. }
  23. /*開始數據傳送的前期準備*/
  24. Void start()
  25. {
  26. SDA=1;      //SDA初始化為高電平
  27. SCL=1;      //SCL初始化為高電平
  28. _nop_();
  29. _nop_();
  30. _nop_();
  31. _nop_();
  32. SDA=0;    //在SCL為高電平時,SDA由1置0被認為是開始信號
  33. _nop_();
  34. _nop_();
  35. _nop_();
  36. _nop_();
  37. SCL=0;   //SCL變為低電平,開始傳送數據
  38. }
  39. /*結束數據傳送*/
  40. Void stop()
  41. {
  42. SDA=0;   //SDA初始化為低電平,準備發出終止信號
  43. SCL=1;   //SCL變成高電平,此時SDA的一切變化都將被認為是開始或終止信號
  44. _nop_();
  45. _nop_();
  46. _nop_();
  47. _nop_();
  48. SDA=1;    //在SCL為高電平時,SDA由0置1被認為是終止信號
  49. _nop_();
  50. _nop_();
  51. _nop_();
  52. _nop_();
  53. SCL=0;   
  54. SDA=0;    //解除總線的占用
  55. }

  56. /*從子器件讀取數據*/
  57. Unsigned char ReadData()
  58. {
  59. Unsigned char i,x;  //規定兩個中間變量用于暫時存儲數據
  60. For(i=0;i<8;i++)    //循環8次,剛好記錄一個字節
  61. {
  62.               SCL=1;    //先不允許SDA變化,便于記錄數據
  63.               X <<=1;     //將x各二進制位向左移一位
  64. X |=(unsigned char)SDA;   //將SDA的數據存到X里
  65. /***說明: X有定義之后默認為0x00,SDA為從最高位向最低位變化,所以左移可以將數據按從高到低存儲在x里;
  66. SDA為一個二進制位,轉換成unsigned char 之后變成字節的最低位,所以按位與運算之后可將SDA當前數據存儲在X的當前最低位*******/
  67. SCL=0;   //允許SDA變換到下一位
  68. }
  69. Return (x);  //將最終記錄好的X值返回給外函數變量
  70. }


  71. /* 向從機寫入數據*/
  72. //調用該函數之前要先調用start(),所以SCL=0;
  73. Bit WriteCurrent(unsigned char y)
  74. {
  75. Unsigned char i;
  76. Bit ack_bit;          //儲存應答位
  77. For(i=0;i<8;i++)
  78. {
  79.               SDA=(bit)(y&0x80);
  80. /**先與0x80按位與運算以得到最高位信息(發送時仍先發送最高位),再按照bit 的強制類型轉換規則,如果得到1000 0000,則最高位為1,此時SDA為1;如果得到0000 0000,則最高位為0,SDA=0**/
  81.               _nop_();
  82. SCL=1;    //不允許SDA變化,方便從機記錄數據
  83.               _nop_();
  84. _nop_();
  85.               SCL=0;  //從機記錄完成該位,可變換為下一位
  86.               Y<<=1;   //讓次高位位變成最高位以進行下一次數據傳輸
  87. }
  88. /*開始檢測應答位*/
  89. SDA=1;    //初始化SDA,并讓其自由變換
  90. _nop_();
  91. _nop_();
  92. SCL=1;   //SCL置1,開始檢測是否應答(SDA的值在這之前已經變化完成)
  93. _nop_();
  94. _nop_();
  95. _nop_();
  96. _nop_();
  97. Ack_bit=SDA;  //記錄應答位的值
  98. SCL=0;     
  99. return ack_bit;   //返回應答位的值,讓外部得知是否應答
  100. }

  101. /* 向指定從機寫入地址和數據,add存儲指定地址,dat存儲待寫入的數據*/
  102. Void WriteSet(unsigned char add,unsigned char dat)
  103. {
  104. Start();  //初始化總線
  105. WriteCurrent(OP_WRITE);  //選擇從機并告知要對它寫入數據
  106. WriteCurrent(add);    //寫入指定地址
  107. WriteCurrent(dat);    //寫入數據
  108. Stop();    //停止數據傳輸
  109. Delayms(4);    //一個字節的寫入周期為1ms,所以最好延時1ms以上
  110. }
  111. /**從從機的當前地址讀取數據**/
  112. Unsigned char ReadCurrent()
  113. {
  114. Unsigned char x;
  115. Start();    //初始化總線
  116. WriteCurrent(OP_READ);   //選擇從機并告知要讀取數據
  117. X=ReadData();    //將讀取的數據存入x
  118. Stop();         //終止數據傳輸
  119. Return x;    //返回讀取數據
  120. }
  121. /**從從機中的某個地址讀取數據,set_addr為地址**/
  122. Unsigned char ReadSet(unsigned char set_addr)
  123. {
  124. Start();    //初始化總線
  125. WriteCurrent(OP_WRITE);    //選擇從機并告知要寫入數據
  126. WriteCurrent(set_addr);    //寫入指定地址
  127. return(ReadCurrent());    //從指定地址讀取數據并返回
  128. }
  129. /*主函數*/
  130. Main(void)
  131. {
  132. SDA=1;    //使主從設備處于空閑狀態
  133. SCL=1;
  134. WriteSet(add,dat);    //例如:在指定地址“0x36”中寫入數據“0x0f”
  135. 完成其他功能
  136. }
復制代碼

從機整個有一個地址OP,從機內部有多個寄存器,所以地址要寫兩個,即先寫整個的,再寫寄存器的。
MPU6050的R/W位是最低位,如圖
SPI Address format
MSB
LSB
A6
A5
A4
A3
A2
A1
A0
R/W
SPI Data format
MSB
LSB
D7
D6
D5
D4
D3
D2
D1
D0
MPU-60X0的Slave地址為b110100X,7位字長,最低有效位X由AD0管腳上的邏輯電平決定。這樣就可以允許兩個MPU-60X0連接到同一條I2C總線,此時,一個設備的地址為b1101000(AD0為邏輯低電平),另一個為b1101001(
AD0為邏輯高)。
MPU6050的默認SLAVE地址的高七位是1101000(),最低位默認為0,有需要時置1;
WHO_AM_I寄存器的低七位的高6位存放的是110100,最低位存放的是AD0引腳電平,它的最高位(第八位)沒有任何作用,不用管。
WHO_AM_I 的寄存器地址為0x75,默認值就是0x68
陀螺儀角速度量程:單位為 度每秒(°/s),指的是如果陀螺儀每秒轉動不超過多少度則陀螺儀可以測量。比如±125,就是在每秒轉動125°之內的能測出來。陀螺儀量程越大,精度越低。
陀螺儀加速度量程:單位為計數單位為g(重力加速度).
陀螺儀角速度靈敏度:單位為 LSB/(°/s),LSB是數字輸出方式下的最小有效位,在這里就是一個二進制位。
    所以靈敏度=65536/量程的區間長度(比如量程為100°/s,則除以200);
陀螺儀的加速度靈敏度:可以用LSB/g來表示,則靈敏度可以表示為:
65536/加速度量程區間長度(比如量程是g,則除以4)
加速度:1g代表一個重力加速度,即以9.8m/s為單位大小。
在數字輸出方式下,陀螺儀靈敏度可用mg/LSB來表示。
陀螺儀輸出的ADC角速度值與°/s(角速度)之間的換算:輸出的ADC值的單位是LSB,則
某一個軸的角速度=ADC值/角速度靈敏度;
陀螺儀輸出的ADCRx加速度值與g之間的換算:
某一個軸的加速度=ADCRx值/加速度靈敏度;
MPU6050的重要寄存器:
  • WHO_AM_I:  地址0x75,默認值0x68
WHO_AM_I寄存器的低七位的高6位存放的是110100,最低位存放的是AD0引腳電平,它的最高位(第八位)沒有任何作用,不用管。
  • PWR_MGMT_1:  地址0x6b,默認值0x40,使用時置0x00
用于配置電源模式和時鐘源。提供了一位用來重置整個儀器,以及一位用來禁用溫度傳感器。

Register(Hex)

Register(Decimal)

Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
6B
107
DEVICE
_RESET
SLEEP
CYCLE
-
TEMP_DIS
CLKSEL[2:0]
7:置1時所有寄存器復位,然后自動置0.
6:置1時進入低電壓休眠狀態;當SLEEP1時,若CYCLE1,則進入循環模式。在循環模式下,儀器將在睡眠和活動狀態下來回轉換來從活動狀態的傳感器獲取一個數據樣本,其頻率由LP_WAKE_CTRL決定。為了配置喚醒頻率,需要配合使用LP_WAKE_CTRL和兩個電源管理寄存器。
31禁用溫度傳感器。
210:選擇時鐘源。                                   
CLKSEL
Clock Source
000
內部8MHZ振蕩器,平時用這個即可
001
具有X軸陀螺基準的鎖相環
010
具有Y軸陀螺基準的鎖相環
011
具有Z軸陀螺基準的鎖相環
100
PLL with external 32.768kHz reference
101
PLL with external 19.2MHz reference
110
儲存保留
111
停止時鐘并讓計時發生器保持重置狀態
  • SMPLRT_DIV:地址0x19,默認值0x00
Register(Hex)
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
19
SMPLRT_DIV[7:0]
用于指定陀螺儀的采樣率。
采樣速率=陀螺儀輸出速率/(1+SMPLRT_DIV)
其中,當DLPF_CFG=000或111時(詳情見CONFIG寄存器),陀螺儀輸出速率=8KHZ;當數字低通濾波器(DLPF)被禁用時,陀螺儀輸出頻率是1KHZ(平時禁用就行了);
注意:加速度計的輸出頻率是1KHZ。這意味著當采樣速率高于1KHZ時,同樣的加速度計采樣江北輸出到FIFO,DMP,和不止一個寄存器中。
3:CONFIG:地址0x1a,默認值0x00

Register(Hex)

Register(Decimal)

Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
1A
26
-
-
EXT_SYNC_SET[2:0]
DLPF_CFG[2:0]
此寄存器用于配置外部幀同步引腳采樣,以及 陀螺儀和加速度計的 數字低通濾波器的相關設置。
與FSYNC引腳鏈接的外部信號可以被EXT_SYNC_SET采樣。
FSYNC引腳的信號變化會被鎖存,這樣就可以獲得很短的頻閃信號。被鎖存的FSYNC引腳數據會被認為是采樣率,就像SMPLRT_DIV里定義的那樣。采樣過后,鎖存器會重置成當前的FSYNC信號狀態。
采樣值將被反饋到由EXT_SYNC_SET的值決定的傳感器的數據寄存器的最低有效位。   
位5,4,3:EXT_SYNC_SET
EXT_SYNC_SET
FSYNC Bit Location
0
禁止輸入,平時用這個
1
TEMP_OUT_L[0]   溫度傳感器的低八位寄存器的最低有效位
2
GYRO_XOUT_L[0]    陀螺儀X軸
3
GYRO_YOUT_L[0]     陀螺儀Y軸
4
GYRO_ZOUT_L[0]     陀螺儀Z軸
5
ACCEL_XOUT_L[0]    加速度計X軸
6
ACCEL_YOUT_L[0]    加速度計Y軸
7
ACCEL_ZOUT_L[0]    加速度計Z軸
位2,1,0:DLPF_CFG,用于設置陀螺儀和加速度計的數字低通濾波頻率(DLPF)
,如下表:
DLPF_CFG

加速度計 (Fs  = 1kHz)

                       陀螺儀
Bandwidth(帶寬)(Hz)
Delay (ms)
Bandwidth (Hz)
Delay (ms)
Fs (kHz)
000
260
0
256
0.98
8
001
184
2.0
188
1.9
1
010
94
3.0
98
2.8
1
011
44
4.9
42
4.8
1
100
21
8.5
20
8.3
1
101
10
13.8
10
13.4
1
110,平時用這個
5
19.0
5
18.6
1
111
RESERVED(保留)
RESERVED(保留)
8
  • GYRO_CONFIG: 地址0x1b,默認值0x00
  • Register(Hex)

Register(Decimal)

Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
1B
27
XG_ST
YG_ST
ZG_ST
FS_SEL[1:0]
-
-
-
這個寄存器用于觸發陀螺儀自檢,以及配置陀螺儀量程。
陀螺儀自檢的作用:允許用戶檢測陀螺儀的機械和電氣部分。陀螺儀的每個軸的自檢可以通過控制XG_ST,YG_ST和ZG_ST來激活。每個軸的自檢可以同時獨立運行。
當自檢被激活時,在線的電氣部分將會驅動合適的傳感器。這種驅動將移動傳感器的依據質量在相當于一個預先定義的科里奧利力的距離。這個依據質量的取代將會導致傳感器輸出的變化,而這又將導致輸出信號被反射。輸出信號被用來觀察自檢響應情況。平時不用自檢。
自檢響應的定義如下:
   自檢響應=自檢允許情況下的傳感器輸出值-自檢不允許情況下的傳感器輸出值
當自檢響應值被限制在最小或者最大產品規格時,該部分已通過自檢。當自檢響應超過產品規格文檔中指定的最小/最大值時,該部分被視為自檢失敗。
位4,3(FS_SEL):是用來選擇陀螺儀的量程的,具體見下表:
FS_SEL
Full Scale Range
00
± 250 °/s
01
± 500 °/s
10
± 1000 °/s
11
± 2000 °/s,平時用這個
            
  • ACCEL_CONFIG:地址0x1c,默認值0x00

Register(Hex)

Register(Decimal)

Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
1C
28
XA_ST
YA_ST
ZA_ST
AFS_SEL[1:0]
ACCEL_HPF[2:0]
此寄存器用于啟動加速度計自檢以及配置加速度計的量程。也用于配置數字高通濾波器(DHPF)。
(說明同GYRO_CONFIG,平時不自檢)
   位4,3(AFS_SEL):用于設置加速度計量程,具體如下表:
AFS_SEL
Full Scale Range
00
± 2g平時用這個
01
± 4g
10
± 8g
11
± 16g
位2,1,0(ACCEL_HPF):用于配置數字高通濾波器(DHPF)的路徑可用并導致運動探測器(自由落體,運動閾值和零運動)。高通濾波器的輸出對于數據寄存器來說并不可用(詳情見產品規格說明書第八部分)。
高通濾波器有三種模式:
1.Reset: 濾波器輸出在一個采樣中歸零。這可以有效的禁用高通濾波器。此模式可以切換快速解決濾波器。
2.On:     數字高通濾波器會讓頻率高過截止頻率的信號通過。
3.Hold:  切換到此模式時,濾波器將保持現有采樣。濾波器輸出將會是輸入采樣和保持采樣之間的區別。
      具體如下表:
ACCEL_HPF
Filter Mode
Cut-off Frequency(高通濾波頻率)
000
Reset
None
001
On
5Hz,平時用這個
010
On
2.5Hz
011
On
1.25Hz
100
On
0.63Hz
111
Hold
None
                     
   ACCEL_XOUT_H:地址0x3b:加速度計X軸高八位
   ACCEL_XOUT_L:     0x3c: 加速度計X軸低八位
   ACCEL_YOUT_H:     0x3d: 加速度計Y軸高八位
   ACCEL_YOUT_L:     0x3e: 加速度計Y軸低八位                   初始值0x00
   ACCEL_ZOUT_H:     0x3f: 加速度計Z軸高八位
   ACCEL_ZOUT_L:     0x40: 加速度計Z軸低八位
用于存儲加速度計的最近測量值,所記錄的數據是以LSB為單位的加速度值。
加速度傳感器內部寄存器組中的數據總是以采樣速率更新,同時,當串行接口空閑時,面向用戶的讀寄存器組重復內部寄存器組的數據值,這保證了傳感器寄存器的突發讀取將讀取來自同一采樣時刻的測量。
每一個加速度計測量器偶有一個在ACCEL_FS寄存器里定義的滿刻度。對于每一個滿刻度設置,每LSB的加速度計靈敏度如下表:
AFS_SEL
量程
LSB 靈敏度
00
±2g
16384 LSB/mg
01
±4g
8192 LSB/mg
10
±8g
4096 LSB/mg
11
±16g
2048 LSB/mg
TEMP_OUT_H:地址0x41:溫度傳感器測量值寄存器高八位              初始值0x00
TEMP_OUT_L:地址0x42:溫度傳感器測量值寄存器低八位
GYRO_XOUT_H:地址0x43
GYRO_XOUT_L:     0x44
GYRO_YOUT_H:     0x45                    用于記錄陀螺儀各軸測量值,默認值0x00
GYRO_YOUT_L:     0x46
GYRO_ZOUT_H:     0x47
GYRO_ZOUT_L:     0x48
同加速度計測量值寄存器,量程與LSB表示的靈敏度關系如下表:
FS_SEL
Full Scale Range
LSB Sensitivity
0
± 250 °/s
131 LSB/°/s
1
± 500 °/s
65.5 LSB/°/s
2
± 1000 °/s
32.8 LSB/°/s
3
± 2000 °/s
16.4 LSB/°/s
這幾個寄存器的數據的含義是以LSB為單位的角速度值。

完整的Word格式文檔51黑下載地址:
I2C總線協議與MPU6050.docx (121.53 KB, 下載次數: 65)



回復

使用道具 舉報

ID:277818 發表于 2018-3-24 22:41 來自觸屏版 | 顯示全部樓層
沒看懂
回復

使用道具 舉報

ID:606481 發表于 2019-9-6 09:46 | 顯示全部樓層
下載下來看一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线a | 欧美精品一区二区三区蜜桃视频 | 激情五月婷婷 | 精品久久久久久久久久久久 | 日韩av电影院 | 久久精品久久久 | 一区二区高清不卡 | av在线影院| 国产成人精品免费视频大全最热 | 国产精品美女久久久久久久久久久 | 欧美人成在线视频 | 亚洲国产成人av好男人在线观看 | 成人在线免费网站 | 精品av天堂毛片久久久借种 | 国产成人免费网站 | 一级毛片免费完整视频 | 国产福利视频 | 久久久精品一区二区三区 | 日韩国产中文字幕 | 狠狠操狠狠 | 久久国产激情视频 | 精品国产不卡一区二区三区 | 国产精品视频久久 | 欧美精品久久久 | 精品在线看 | 国产乱码精品1区2区3区 | 日韩在线欧美 | 日韩最新网址 | 久久一久久| 色婷婷av一区二区三区软件 | 精品亚洲第一 | 欧美xxxx日本 | 2018中文字幕第一页 | 在线亚洲欧美 | 久久久精品网 | 天天干天天爱天天 | 91香蕉视频在线观看 | 欧美在线一级 | 色吧色综合| 日韩视频中文字幕 | 日批免费在线观看 |