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黑下载地址:
|