C總線協議與MPU6050 在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總線傳輸的例程:
從機整個有一個地址OP,從機內部有多個寄存器,所以地址要寫兩個,即先寫整個的,再寫寄存器的。 MPU6050的R/W位是最低位,如圖SPI Address format SPI Data format 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寄存器的低七位的高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時進入低電壓休眠狀態;當SLEEP置1時,若CYCLE置1,則進入循環模式。在循環模式下,儀器將在睡眠和活動狀態下來回轉換來從活動狀態的傳感器獲取一個數據樣本,其頻率由LP_WAKE_CTRL決定。為了配置喚醒頻率,需要配合使用LP_WAKE_CTRL和兩個電源管理寄存器。 位3:置1時禁用溫度傳感器。 位2,1,0:選擇時鐘源。 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(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:地址0x43GYRO_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黑下載地址:
|