前言
本文章使用开发板正点原子STM32F407核心板,配置模拟iic来使用mpu6050陀螺仪。
配套代码可在我的资源中免费下载,仅供参考!
一、MPU6050配置步骤:
1.初始化IIC接口
初始化与MPU6050连接的SDA和SCL数据线。
2.复位MPU6050
MPU的地址由D0引脚决定,D0接地了,则地址为0x68;若接VDD,则地址为0x69.
通过对电源管理寄存器1(0x6b)的bit7位写1实现对MPU6050复位。复位后默认值位0X40,设置该寄存器为0x00唤醒MPU6050.
3.设置角速度传感器和加速度传感器的满量程范围
陀螺仪配置寄存器(0x1B)和加速度传感器配置寄存器(0x1C)。分别为+_2000dps、±2g.
4.设置其它参数
关中断,关AUX IIC接口,禁止FIFO,设置陀螺仪采样率和设置数字低通滤波器(DLPF).
分别通过中断使能寄存器
(0X38)和用户控制寄存器(0X6A)控制,通过 FIFO 使能寄存器(0X23)控制,默
认都是 0(即禁止 FIFO),采样率分频寄存器(0X19)
控制:50.数字低通滤波器(DLPF)寄存器(0X1A)
带宽的 1/2 。
5.配置系统时钟源并使能角速度传感器和加速度传感器
系统时钟源:电源管理寄存器 1(0X6B)
使能角速度传感器和加速度传感器:电源管理寄存器 2(0X6C)
陀螺仪配置寄存器,该寄存器地址为: 0X1B只关心 FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围
加速度传感器配置寄存器,寄存器地址为: 0X1C
只关心 AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围
FIFO 使能寄存器,寄存器地址为: 0X23
可以不用 FIFO,设置对应
位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。
陀螺仪采样率分频寄存器,寄存器地址为: 0X19
采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)
假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。
配置寄存器,寄存器地址为: 0X1A
主要关心数字低通滤波器(DLPF)的设置位,即: DLPF_CFG[2:0],
电源管理寄存器 2,寄存器地址为: 0X6C
二、使用步骤
1.修改模拟iic的硬件接口
代码如下(示例):
AD0-->GND
SCL-->PC4
SDA-->PC5
INT-->PC0
//初始化IIC SCL/SDA
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟
//GPIOC4,C5初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
IIC_SCL=1;
IIC_SDA=1;
}
//IO方向设置
#define SDA_IN() {GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=0<<5*2;} //PC5输入模式
#define SDA_OUT() {GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=1<<5*2;} //PC5输出模式
//IO操作函数
#define IIC_SCL PCout(4) //SCL
#define IIC_SDA PCout(5) //SDA
#define READ_SDA PCin(5) //输入SDA
//INT
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//先使能外设IO PORTA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
2.读入数据
代码如下(示例):
temp=MPU_Get_Temperature(); //得到温度值
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));