MPU6050六轴传感器
MPU6050 是 InvenSense 公司推出的整合性 6 轴运动处理组件,其内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个IIC 接口, 可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor) 硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。
InvenSense 公司提供了一套基于DMP的运动处理驱动库,可大大降低单片机对动处理运算的负荷,同时也大大降低了编程难度。该模块广泛运用于飞控、计步等电子产品中。
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-19589090137.10.478736b4NYZQSb&id=609979451344
资料下载链接:https://pan.baidu.com/s/1dNDqcp76L9QdM7iSZYfz_A
提取码:4euma
图41.1-1 产品实物展示
规格参数
工作电压:3-5V(模块带有LDO) 工作电流:5MA 通信接口:IIC
查看资料
常用寄存器说明
初始化步骤:
1、 复位MPU6050,让MPU6050内部的所有寄存器恢复默认值(向0X6B写入0x80)
2、设置电源管理寄存器位0x00,以唤醒MPU6050,进入正常工作状态(向0x6B写入0x00)
3、 陀螺仪配置寄存器(0x1B)设置MPU6050陀螺仪传感器满量程范围,这里选择正负2000dps
4、加速度传感器配置寄存器(0x1C)这里选择正负2g
5、陀螺仪采样率,由采样率分频寄存器(0x19)控制;这里设置为50hz即输出频率=1KHz,SMPLRT_DIV=19
6、设置MPU6050的数字低通滤波器,因为配置为50hz,找一个接近值,所以配置为0x03,42hz
7、设置PLL,一般选择x轴陀螺PLL作为时钟源,以获得更高精度的时钟。(向0X6B写入0x01)
8、设置加速度与陀螺仪都工作(向0X6C写入0x00)
这里还有一个寄存器可以用来检测是否有mpu6050(当AD0接地时,向0x75读取数据则返回0x68;当AD0接VCC时,向0x75读取数据则返回0x69)
以上是初始化的部分,初始化完成之后开始读取数据 读取温度的地址:
读取陀螺仪测量值(原始值)分别有X/Y/Z轴的数据
读取加速度计测量值(原始值)分别有X/Y/Z轴的数据
移植过程
引脚选择
移植至过程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_mpu6050.c 和 bsp_mpu6050.h,文件夹名字改为MPU6050。
代码写入
在文件bsp_mpu6050.c中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-18 LCKFB-lp first version
*/
#include "bsp_mpu6050.h"
#include "stdio.h"
static void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
static void delay_us(unsigned int us)
{
ets_delay_us(us);
}
static void delay_1ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
static void delay_1us(unsigned int us)
{
ets_delay_us(us);
}
/**********************************************
函数名称:MPU_Init
函数功能:初始化MPU6050
函数参数:无
函数返回值:0,初始化成功 其他,初始化失败
**********************************************/
u8 MPU_Init(void)
{
u8 res;
i2c_master_init(); //初始化IIC总线
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X80); // 复位MPU6050
vTaskDelay(pdMS_TO_TICKS(100));
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00); // 唤醒MPU6050
MPU_Set_Gyro_Fsr(3); // 陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0); // 加速度传感器,±2g
MPU_Set_Rate(50); // 设置采样率50Hz
MPU_Write_Byte(MPU_INT_EN_REG, 0X00); // 关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00); // I2C主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG, 0X00); // 关闭FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG, 0X80); // INT引脚低电平有效
res = MPU_Read_Byte(MPU_DEVICE_ID_REG);
if (res == MPU_ADDR) // 器件ID正确,即res = MPU_ADDR = 0x68
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X01); // 设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG, 0X00); // 加速度与陀螺仪都工作
MPU_Set_Rate(50); // 设置采样率为50Hz
}
else
return 1; // 地址设置错误,返回1
return 0; // 地址设置正确,返回0
}
/**********************************************
函数名称:MPU_Set_Gyro_Fsr
函数功能:设置MPU6050陀螺仪传感器满量程范围
函数参数:fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
函数返回值:0,设置成功 其他,设置失败
**********************************************/
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_GYRO_CFG_REG, fsr << 3); // 设置陀螺仪满量程范围
}
/**********************************************
函数名称:MPU_Set_Accel_Fsr
函数功能:设置MPU6050加速度传感器满量程范围
函数参数:fsr:0,±2g;1,±4g;2,±8g;3,±16g
函数返回值:0,设置成功 其他,设置失败
**********************************************/
u8 MPU_Set_Accel_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_ACCEL_CFG_REG, fsr << 3); // 设置加速度传感器满量程范围
}
/**********************************************
函数名称:MPU_Set_LPF
函数功能:设置MPU6050的数字低通滤波器
函数参数:lpf:数字低通滤波频率(Hz)
函数返回值:0,设置成功 其他,设置失败
**********************************************/
u8 MPU_Set_LPF(u16 lpf)
{
u8 data = 0;
if (lpf >= 188)
data = 1;
else if (lpf >= 98)
data = 2;
else if (lpf >= 42)
data = 3;
else if (lpf >= 20)
data = 4;
else if (lpf >= 10)
data = 5;
else
data = 6;
return MPU_Write_Byte(MPU_CFG_REG, data); // 设置数字低通滤波器
}
/**********************************************
函数名称:MPU_Set_Rate
函数功能:设置MPU6050的采样率(假定Fs=1KHz)
函数参数:rate:4~1000(Hz) 初始化中rate取50
函数返回值:0,设置成功 其他,设置失败
**********************************************/
u8 MPU_Set_Rate(u16 rate)
{
u8 data;
if (rate > 1000)
rate = 1000;
if (rate < 4)
rate = 4;
data = 1000 / rate - 1;
data = MPU_Write_Byte(MPU_SAMPLE_RATE_REG, data); // 设置数字低通滤波器
return MPU_Set_LPF(rate / 2); // 自动设置LPF为采样率的一半
}
/**********************************************
函数名称:MPU_Get_Temperature
函数功能:得到温度传感器值
函数参数:无
函数返回值:温度值(扩大了100倍)
**********************************************/
short MPU_Get_Temperature(void)
{
u8 buf[2];
short raw;
float temp;
MPU_Read_Len(MPU_ADDR, MPU_TEMP_OUTH_REG, 2, buf);
raw = ((u16)buf[0] << 8) | buf[1];
temp = 36.53 + ((double)raw) / 340;
return temp * 100;
}
/**********************************************
函数名称:MPU_Get_Gyroscope
函数功能:得到陀螺仪值(原始值)
函数参数:gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
函数返回值:0,读取成功 其他,读取失败
**********************************************/
u8 MPU_Get_Gyroscope(short *gx, short *gy, short *gz)
{
u8 buf[6], res;
res = MPU_Read_Len(MPU_ADDR, MPU_GYRO_XOUTH_REG, 6, buf);
if (res == 0)
{
*gx = ((u16)buf[0] << 8) | buf[1];
*gy = ((u16)buf[2] << 8) | buf[3];
*gz = ((u16)buf[4] << 8) | buf[5];
}
return res;
}
/**********************************************
函数名称:MPU_Get_Accelerometer
函数功能:得到加速度值(原始值)
函数参数:ax,ay,az:加速度传感器x,y,z轴的原始读数(带符号)
函数返回值:0,读取成功 其他,读取失败
**********************************************/
u8 MPU_Get_Accelerometer(short *ax, short *ay, short *az)
{
u8 buf[6], res;
res = MPU_Read_Len(MPU_ADDR, MPU_ACCEL_XOUTH_REG, 6, buf);
if (res == 0)
{
*ax = ((u16)buf[0] << 8) | buf[1];
*ay = ((u16)buf[2] << 8) | buf[3];
*az = ((u16)buf[4] << 8) | buf[5];
}
return res;
}
/**********************************************
函数名称:MPU_Write_Len
函数功能:IIC连续写(写器件地址、寄存器地址、数据)
函数参数:addr:器件地址 reg:寄存器地址
len:写入数据的长度 buf:数据区
函数返回值:0,写入成功 其他,写入失败
**********************************************/
u8 MPU_Write_Len(u8 addr, u8 reg, u8 len, u8 *buf)
{
u8 i;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
esp_err_t ack = i2c_master_write_byte(cmd, (addr << 1) | 0, 1); // 发送器件地址+写命令(0为写,1为读)
if (ack == ESP_ERR_NO_MEM) // 等待应答
{
i2c_master_stop(cmd);
return 1;
}
i2c_master_write_byte(cmd, reg, 1); // 写寄存器地址
for (i = 0; i < len; i++)
{
esp_err_t ack1 = i2c_master_write_byte(cmd, buf[i], 1); // 发送数据
if (ack1 == ESP_ERR_NO_MEM) // 等待应答
{
i2c_master_stop(cmd);
return 1;
}
}
i2c_master_stop(cmd);
i2c_master_cmd_begin(MPU_I2C_POER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return 0;
}
/**********************************************
函数名称:MPU_Read_Len
函数功能:IIC连续读(写入器件地址后,读寄存器地址、数据)
函数参数:addr:器件地址 reg:要读的寄存器地址
len:要读取的数据长度 buf:读取到的数据存储区
函数返回值:0,读取成功 其他,读取失败
**********************************************/
u8 MPU_Read_Len(u8 addr, u8 reg, u8 len, u8 *buf)
{
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
esp_err_t ack = i2c_master_write_byte(cmd, (addr << 1) | 0, 1); // 发送器件地址+写命令
if (ack == ESP_ERR_NO_MEM) // 等待应答
{
i2c_master_stop(cmd);
return 1;
}
i2c_master_write_byte(cmd, reg, 1); // 写寄存器地址
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (addr << 1) | 1, 1); // 发送器件地址+读命令
while (len)
{
if (len == 1)
i2c_master_read_byte(cmd, buf, I2C_MASTER_NACK); // 读数据,发送nACK
else
i2c_master_read_byte(cmd, buf, I2C_MASTER_ACK); // 读数据,发送ACK
len--;
buf++;
}
i2c_master_stop(cmd); // 产生一个停止条件
i2c_master_cmd_begin(MPU_I2C_POER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return 0;
}
/**********************************************
函数名称:MPU_Write_Byte
函数功能:IIC写一个字节
函数参数:data:写入的数据 reg:要写的寄存器地址
函数返回值:0,写入成功 其他,写入失败
**********************************************/
u8 MPU_Write_Byte(u8 reg, u8 data)
{
// 开启i2c总线
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
esp_err_t ack = i2c_master_write_byte(cmd, (MPU_ADDR << 1) | 0, true); // 发送器件地址+写命令
if (ack == ESP_ERR_NO_MEM) // 等待应答
{
i2c_master_stop(cmd);
return 1;
}
i2c_master_write_byte(cmd, reg, 1); // 写寄存器地址
esp_err_t ack1 = i2c_master_write_byte(cmd, data, 1); // 发送数据
if (ack1 == ESP_ERR_NO_MEM) // 等待ACK
{
i2c_master_stop(cmd);
return 1;
}
i2c_master_stop(cmd);
i2c_master_cmd_begin(MPU_I2C_POER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return 0;
}
/**********************************************
函数名称:MPU_Read_Byte
函数功能:IIC读一个字节
函数参数:reg:要读的寄存器地址
函数返回值:res:读取到的数据
**********************************************/
u8 MPU_Read_Byte(u8 reg)
{
u8 res;
// 开启i2c总线
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (MPU_ADDR << 1) | 0, 1); // 发送器件地址+写命令
i2c_master_write_byte(cmd, reg, 1); // 写寄存器地址
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (MPU_ADDR << 1) | 1, 1); // 发送器件地址+读命令
i2c_master_read_byte(cmd, &res, I2C_MASTER_NACK);
i2c_master_stop(cmd); // 产生一个停止条件
i2c_master_cmd_begin(MPU_I2C_POER_NUM, cmd, pdMS_TO_TICKS(1000)); // 执行 I2C 命令
i2c_cmd_link_delete(cmd);
return res;
}
// i2c驱动安装
esp_err_t i2c_master_init(void)
{
int i2c_master_port = MPU_I2C_POER_NUM;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = MPU_I2C_SDA,
.scl_io_num = MPU_I2C_SCL,
.sda_pullup_en = GPIO_PULLDOWN_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = MPU_I2C_FREQ,
};
i2c_param_config(i2c_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
在文件bsp_mpu6050.h中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-18 LCKFB-lp first version
*/
#ifndef _BSP_MPU6050_H_
#define _BSP_MPU6050_H_
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gptimer.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/spi_master.h"
#include "nvs_flash.h"
#include "esp_adc/adc_cali_scheme.h"
#include "esp_adc/adc_cali.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "driver/i2c.h"
#include "sdkconfig.h"
typedef uint8_t u8;
typedef uint16_t u16;
#define MPU_I2C_SDA 2 // I2C SDA GPIO NUM
#define MPU_I2C_SCL 1 // I2C SCL GPIO NUM
#define MPU_I2C_POER_NUM 0 // MPU6050使用的 I2C 驱动号
#define MPU_I2C_FREQ 400000 // OLED对应 I2C 时钟
#define OLED_ADDR 0x3c // OLED I2C 器件地址
#define I2C_MASTER_TX_BUF_DISABLE 0
#define I2C_MASTER_RX_BUF_DISABLE 0
#define I2C_MASTER_TIMEOUT_MS 1000
#define MPU_SELF_TESTX_REG 0X0D //自检寄存器X
#define MPU_SELF_TESTY_REG 0X0E //自检寄存器Y
#define MPU_SELF_TESTZ_REG 0X0F //自检寄存器Z
#define MPU_SELF_TESTA_REG 0X10 //自检寄存器A
#define MPU_SAMPLE_RATE_REG 0X19 //采样频率分频器
#define MPU_CFG_REG 0X1A //配置寄存器
#define MPU_GYRO_CFG_REG 0X1B //陀螺仪配置寄存器
#define MPU_ACCEL_CFG_REG 0X1C //加速度计配置寄存器
#define MPU_MOTION_DET_REG 0X1F //运动检测阀值设置寄存器
#define MPU_FIFO_EN_REG 0X23 //FIFO使能寄存器
#define MPU_I2CMST_CTRL_REG 0X24 //IIC主机控制寄存器
#define MPU_I2CSLV0_ADDR_REG 0X25 //IIC从机0器件地址寄存器
#define MPU_I2CSLV0_REG 0X26 //IIC从机0数据地址寄存器
#define MPU_I2CSLV0_CTRL_REG 0X27 //IIC从机0控制寄存器
#define MPU_I2CSLV1_ADDR_REG 0X28 //IIC从机1器件地址寄存器
#define MPU_I2CSLV1_REG 0X29 //IIC从机1数据地址寄存器
#define MPU_I2CSLV1_CTRL_REG 0X2A //IIC从机1控制寄存器
#define MPU_I2CSLV2_ADDR_REG 0X2B //IIC从机2器件地址寄存器
#define MPU_I2CSLV2_REG 0X2C //IIC从机2数据地址寄存器
#define MPU_I2CSLV2_CTRL_REG 0X2D //IIC从机2控制寄存器
#define MPU_I2CSLV3_ADDR_REG 0X2E //IIC从机3器件地址寄存器
#define MPU_I2CSLV3_REG 0X2F //IIC从机3数据地址寄存器
#define MPU_I2CSLV3_CTRL_REG 0X30 //IIC从机3控制寄存器
#define MPU_I2CSLV4_ADDR_REG 0X31 //IIC从机4器件地址寄存器
#define MPU_I2CSLV4_REG 0X32 //IIC从机4数据地址寄存器
#define MPU_I2CSLV4_DO_REG 0X33 //IIC从机4写数据寄存器
#define MPU_I2CSLV4_CTRL_REG 0X34 //IIC从机4控制寄存器
#define MPU_I2CSLV4_DI_REG 0X35 //IIC从机4读数据寄存器
#define MPU_I2CMST_STA_REG 0X36 //IIC主机状态寄存器
#define MPU_INTBP_CFG_REG 0X37 //中断/旁路设置寄存器
#define MPU_INT_EN_REG 0X38 //中断使能寄存器
#define MPU_INT_STA_REG 0X3A //中断状态寄存器
#define MPU_ACCEL_XOUTH_REG 0X3B //加速度值,X轴高8位寄存器
#define MPU_ACCEL_XOUTL_REG 0X3C //加速度值,X轴低8位寄存器
#define MPU_ACCEL_YOUTH_REG 0X3D //加速度值,Y轴高8位寄存器
#define MPU_ACCEL_YOUTL_REG 0X3E //加速度值,Y轴低8位寄存器
#define MPU_ACCEL_ZOUTH_REG 0X3F //加速度值,Z轴高8位寄存器
#define MPU_ACCEL_ZOUTL_REG 0X40 //加速度值,Z轴低8位寄存器
#define MPU_TEMP_OUTH_REG 0X41 //温度值高八位寄存器
#define MPU_TEMP_OUTL_REG 0X42 //温度值低8位寄存器
#define MPU_GYRO_XOUTH_REG 0X43 //陀螺仪值,X轴高8位寄存器
#define MPU_GYRO_XOUTL_REG 0X44 //陀螺仪值,X轴低8位寄存器
#define MPU_GYRO_YOUTH_REG 0X45 //陀螺仪值,Y轴高8位寄存器
#define MPU_GYRO_YOUTL_REG 0X46 //陀螺仪值,Y轴低8位寄存器
#define MPU_GYRO_ZOUTH_REG 0X47 //陀螺仪值,Z轴高8位寄存器
#define MPU_GYRO_ZOUTL_REG 0X48 //陀螺仪值,Z轴低8位寄存器
#define MPU_I2CSLV0_DO_REG 0X63 //IIC从机0数据寄存器
#define MPU_I2CSLV1_DO_REG 0X64 //IIC从机1数据寄存器
#define MPU_I2CSLV2_DO_REG 0X65 //IIC从机2数据寄存器
#define MPU_I2CSLV3_DO_REG 0X66 //IIC从机3数据寄存器
#define MPU_I2CMST_DELAY_REG 0X67 //IIC主机延时管理寄存器
#define MPU_SIGPATH_RST_REG 0X68 //信号通道复位寄存器
#define MPU_MDETECT_CTRL_REG 0X69 //运动检测控制寄存器
#define MPU_USER_CTRL_REG 0X6A //用户控制寄存器
#define MPU_PWR_MGMT1_REG 0X6B //电源管理寄存器1
#define MPU_PWR_MGMT2_REG 0X6C //电源管理寄存器2
#define MPU_FIFO_CNTH_REG 0X72 //FIFO计数寄存器高八位
#define MPU_FIFO_CNTL_REG 0X73 //FIFO计数寄存器低八位
#define MPU_FIFO_RW_REG 0X74 //FIFO读写寄存器
#define MPU_DEVICE_ID_REG 0X75 //器件ID寄存器
#define MPU_ADDR 0X68
u8 MPU_Init(void); //初始化MPU6050
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf); //IIC连续写
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf); //IIC连续读
u8 MPU_Write_Byte(u8 reg,u8 data); //IIC写一个字节
u8 MPU_Read_Byte(u8 reg); //IIC读一个字节
u8 MPU_Set_Gyro_Fsr(u8 fsr);
u8 MPU_Set_Accel_Fsr(u8 fsr);
u8 MPU_Set_LPF(u16 lpf);
u8 MPU_Set_Rate(u16 rate);
u8 MPU_Set_Fifo(u8 sens);
short MPU_Get_Temperature(void);
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz);
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az);
esp_err_t i2c_master_init(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
移植验证
在自己工程中的main主函数中,编写如下。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-18 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_mpu6050.h"
#include "string.h"
#include "esp_private/esp_task_wdt.h"
#include "esp_private/esp_task_wdt_impl.h"
int app_main(void)
{
esp_task_wdt_deinit();
// 陀螺仪值
short gx = 0,gy = 0,gz = 0;
// 加速度值
short ax = 0,ay = 0,az = 0;
if( MPU_Init() == 1 )
{
printf("MPU_Init Error!!!\r\n");
return 1;
}
printf("Start........\r\n");
while(1)
{
MPU_Get_Gyroscope( &gx , &gy , &gz );
MPU_Get_Accelerometer( &ax , &ay , &az );
printf("\r\n 陀螺仪[]值 = %d \r\n", gx);
printf("\r\n 陀螺仪[]值 = %d \r\n", gy);
printf("\r\n 陀螺仪[]值 = %d \r\n", gz);
puts("");
printf("\r\n 加速度[]值 = %d \r\n", ax);
printf("\r\n 加速度[]值 = %d \r\n", ay);
printf("\r\n 加速度[]值 = %d \r\n", az);
puts("");
gx = 0;
gy = 0;
gz = 0;
ax = 0;
ay = 0;
az = 0;
vTaskDelay(100 / portTICK_PERIOD_MS);//根据设置的采样率,不可设置延时过大
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
上电现象:
驱动代码: