初始化:
void MPU6000_Init()
{
uint8_t ctrl = 0x00;
// 管脚初始化
MPU6000_IO_Init();
//MPU6000复位 往0x6B里面写0x80
MPU6000_AccRebootCmd();
HAL_Delay(20);
//设置时钟源为陀螺仪的z轴
ctrl = 0x03;
MPU6000_IO_Write(&ctrl, MPU6000_RA_PWR_MGMT_1, 1);
HAL_Delay(20);
//启用SPI总线
ctrl = 0x10;
MPU6000_IO_Write(&ctrl, MPU6000_RA_USER_CTRL, 1);
HAL_Delay(20);
//采样率分频,典型值:0x07(125Hz)
ctrl = 0x07;
MPU6000_IO_Write(&ctrl, MPU6000_RA_SMPRT_DIV, 1);
HAL_Delay(20);
//低通滤波频率,典型值0x06(5Hz)
ctrl = 0x06;
MPU6000_IO_Write(&ctrl, MPU6000_RA_CONFIG, 1);
HAL_Delay(20);
//陀螺仪量程+/-500
ctrl = 0x08;
MPU6000_IO_Write(&ctrl, MPU6000_RA_GYRO_CONFIG, 1);
HAL_Delay(20);
//加速度量程+/-4g
ctrl = 0x08;
MPU6000_IO_Write(&ctrl, MPU6000_RA_ACCEL_CONFIG, 1);
HAL_Delay(20);
//配置中断模式,高电平有效。
ctrl = 0x30;
MPU6000_IO_Write(&ctrl, MPU6000_RA_INT_PIN_CFG, 1);
HAL_Delay(20);
//允许中断
ctrl = 0x01;
MPU6000_IO_Write(&ctrl, MPU6000_RA_INT_ENABLE, 1);
HAL_Delay(20);
}
读芯片的ID:
MPU6000_IO_Read(&tmp, MPU6000_WHO_AM_I_ADDR, 1); 返回tmp的值是0x68
进入中断后读取加速度测量值
MPU6000_IO_Read(tmpbuffer,MPU6000_OUT_X_H_A,6);//读取加速度的原始值值0x3B到0x40,数据X,Y方向一直为零,z方向一直是0x0083
for(i=0; i<3; i++)
pnRawData=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]);
printf("pnRawData[0]= 0x%04x pnRawData[1]= 0x%04x pnRawData[2]= 0x%04x
",pnRawData[3],pnRawData[4],pnRawData[5]);
MPU6000_IO_Read(tmpbuffer,MPU6000_OUT_X_H_M,6);//读取陀螺仪的原始值0x43到0x48,数据能随着板子变动而变动
for(i=3; i<6; i++)
pnRawData=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]);
printf("pnRawData[3]= 0x%04x pnRawData[4]= 0x%04x pnRawData[5]= 0x%04x
",pnRawData[3],pnRawData[4],pnRawData[5]);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
你用示波器抓抓时序吧,对比看时序。
一周热门 更多>