1. 硬件部分
使用的是淘宝上销售最多的6050模块 参考如图 下图是模块的原理图 使用了模块上的4根线,VCC,GND ,SCL,SDA 。具体接线方式请自行想象。
设备因为在原理图上将AD0,连接到了GND, 所以它 7位地址是 1101000 (0x68) 八位写地址 0xD1(11010001)
PS:不知道是不是板子上的LDO不好,在正负电源接反后,会烧掉LDO,以及芯片。所以请注意不要将电压接反了。
2 芯片寄存器
0x6B寄存器。设定值为0x00,
可以开始读取陀螺仪、加速度以及温度的参数。否则读出来的全为0
0x19寄存器。设定值为0x07
采样率分频器 SMPLRT_DIV 采样率 = 陀螺仪输出率 / (1 + SMPLRT_DIV) 陀螺仪输出率 DLPF_CFG(1A) 控制
0x1A寄存器。设定值为0x06
低通滤波器,以及采样频率的设置???还需要继续阅读
0x1C寄存器。设定值为0x00
加速度计配置
0x1B寄存器。设定值为0x08
加速度测量
温度
Temperature in degrees C = (TEMP_OUT Register Value as a signed quantity)/340 + 36.53 以摄氏度为单位的温度 = (TEMP_OUT 寄存器值作为有符号数)/340 + 36.53
陀螺仪测量
PS:以上寄存器信息仅作为速查参考,详情请配合MPU6050的寄存器数据手册食用。
3 软件代码
基础逻辑如下图所示
发送写指令:0xD0 发送读的起始地址:0x41 发送读指令:0xD1 接收数据:0xF2 ,0xC0 控制芯片使用的是恒烁的 CX32L003 官方资料连接:http://zbitsemi.com/display.php?id=44
2. 6050初始化代码
强调一下,0x6B这个地址必须要写数值进去,否则无法读出数据。
void MPU6050_INIT()
{
int i=0,j=0;
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
;
}
}
uint8_t Send_Data[2] = {0x6b,0x00};
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x19;
Send_Data[1] = 0x07;
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1A;
Send_Data[1] = 0x06;
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1C;
Send_Data[1] = 0x00;
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1B;
Send_Data[1] = 0x08;
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
}
3. 主函数的操作代码
int main(void)
{
HAL_Init();
SystemClock_Config();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
BSP_LED_Init(LED1);
LogInit();
printf("Printf success using UART1, PD5-TXD, PD6-RXD\r\n");
I2CClock_Config();
I2C_Init();
uint8_t pR2_Data[] = {0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00,0X00, 0X00};
preg1_Data[0] = 0x41;
MPU6050_INIT();
while (1)
{
HAL_I2C_Master_Receive(&i2c_test, 0xD1, preg1_Data,1, pR2_Data, 14);
printf("jiaodu = %u \r\n",jiaodu);
BSP_LED_Toggle(LED1);
HAL_Delay(100);
}
}
主函数中只是将数据读取出来,并且存在数组 pR2_Data 中,后续的拟合完善后增加上信息。
|