MPU6050调试记录
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;//采样率分频器 SMPLRT_DIV
Send_Data[1] = 0x07;//采样率 = 陀螺仪输出率 / (1 + SMPLRT_DIV) 陀螺仪输出率 DLPF_CFG(1A) 控制
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1A;//EXT_SYNC_SET[2:0] DLPF_CFG[2:0]低通滤波器的设置,截止频率是1K,带宽是5K
Send_Data[1] = 0x06;//
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1C;//加速度计配置
Send_Data[1] = 0x00;//± 2g
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
Send_Data[0] = 0x1B;//陀螺仪配置
Send_Data[1] = 0x08;//± 500 °/s
HAL_I2C_Master_Transmit(&i2c_test, 0xD1, Send_Data, 2);
}
3. 主函数的操作代码
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
// HAL_StatusTypeDef ret = HAL_ERROR;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock to HIRC 24MHz*/
SystemClock_Config();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/* Initialize BSP Led for LED1 */
BSP_LED_Init(LED1);
/* Configure uart1 for printf */
LogInit();//PD5 PD6
printf("Printf success using UART1, PD5-TXD, PD6-RXD\r\n");
I2CClock_Config();
I2C_Init(); //PB4 PB5
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 中,后续的拟合完善后增加上信息。