THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步
- 一级目录
- 二级目录
- 三级目录
- 一、cubemx配置
- 1、使用cubemx配置串口
- 2、配置IIC1
- 3、配置时钟和SWDIO下载口
- 二、修改KEIL工程
- 1、IIC驱动
- 2、main函数
- 三、计步器
一级目录
二级目录
三级目录
使用了正点原子的mpu6050的历程。使用里面的DMP算法库,我这里使用的是STM32 F4的单片机。
环境:
CubeMX
KEIL5
HAL库
一、cubemx配置
1、使用cubemx配置串口
配置了串口1 作为调试信息的输出;
串口1的波特率设置成了115200;
2、配置IIC1
和单片机连接的IIC总线我使用的是IIC1
配置为:
3、配置时钟和SWDIO下载口
生成工程:
二、修改KEIL工程
1、IIC驱动
为了方便配置不再使用模拟IIC接口,直接使用HAL库提供的接口:
//IIC连续写
//addr:器件地址
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
// 其他,错误代码
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{HAL_I2C_Mem_Write(&hi2c1, ((addr<<1)|0), reg, 1, (unsigned char *)buf, len, HAL_MAX_DELAY);return 0;
} //IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
// 其他,错误代码
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ HAL_I2C_Mem_Read(&hi2c1, ((addr<<1)|1), reg, 1, (unsigned char *)buf, len, HAL_MAX_DELAY);return 0;
}//IIC写一个字节
//reg:寄存器地址
//data:数据
//返回值:0,正常
// 其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data)
{ HAL_I2C_Mem_Write(&hi2c1, (MPU_ADDR<<1)|0, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY); return 0;
}//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据
u8 MPU_Read_Byte(u8 reg)
{u8 res;HAL_I2C_Mem_Read(&hi2c1, (MPU_ADDR<<1)|1, reg, I2C_MEMADD_SIZE_8BIT, &res, 1, HAL_MAX_DELAY);return res;
}
上面的四个函数基本实现了IIC的读取一个字节,写入一个字节,读取多个字节,写入多个字节的操作。直接调用即可。
2、main函数
首先在main函数总增减头文件的调用:
#include "stdio.h"#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
配置printf函数:
在引用头文件下方增加
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);return ch;
}
修改好如下图:
在main函数中增加变量的定义:
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
在面函数中调用初始化函数
MPU_Init(); //初始化MPU6050
while(mpu_dmp_init())
{printf("error\r\n");HAL_Delay(10);
}
在while循环中增加读取欧拉角的函数
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{temp=MPU_Get_Temperature(); //得到温度值MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据printf("%.1f %.1f %.1f \r\n",pitch,roll,yaw);
}HAL_Delay(20);
最后得到如图:
三、计步器
MPU6050的DMP库提供了计步器接口,自己测试准确率还是比较高的
dmp_get_pedometer_step_count(&STEPS); //计步器获取到步数
printf("%d\r\n",STEPS); //显示计步器的步数
资源:(不用花钱哦)https://download.csdn.net/download/qq_44179528/15619484
看到最后了别忘了先赞 !!!!!❤
||
||
V