本實驗的原始碼工程在開發板光碟資料的:i.MX6UL終結者光碟資料\04_裸機例程原始碼\19_mpu6050目錄下,我們在Ubuntu系統下使用命令“mkdir 19_mpu6050”建立“19_mpu6050”檔案夾,如圖 1所示:

然后使用“cd 19_mpu6050”命令進入到19_mpu6050檔案夾,如圖 2所示:

然后使用命令“cp -r …/18_touchscreen/* ./”將上一章例程中的所有內容拷貝到剛剛新建的“19_mpu6050”里面,如圖 3所示:

然后在drivers目錄下建立mpu6050檔案夾,用來保存mpu6050的驅動檔案,然后在“drivers/mpu6050”目錄中新建mpu6050.h和mpu6050.c兩個檔案,然后在mpu6050.h檔案輸入下面的代碼:
1 #ifndef _BSP_MPU6050_H
2 #define _BSP_MPU6050_H
3
4 #include "imx6ul.h"
5
6 #define MPU6050_ADDR 0X68 /* MPU6050器件地址 */
7
8 /* MPU6050暫存器 */
9 #define MPU_CFG_REG 0X1A /*配置暫存器*/
10 #define MPU_PWR_MGMT1_REG 0x6B /*電源管理暫存器1*/
11 #define MPU_PWR_MGMT2_REG 0x6C /*電源管理暫存器2*/
12 #define MPU_GYRO_CFG_REG 0x1B /*陀螺儀配置暫存器*/
13 #define MPU_ACCEL_CFG_REG 0x1C /*加速度配置暫存器*/
14 #define MPU_SAMPLE_RATE_REG 0x19 /*采樣頻率分頻器*/
15 #define MPU_INT_EN_REG 0x38 /*中斷使能暫存器*/
16 #define MPU_USER_CTRL_REG 0x6A /*用戶控制暫存器*/
17 #define MPU_FIFO_EN_REG 0x23 /*FIFO使能暫存器*/
18 #define MPU_INTBP_CFG_REG 0x37 /*中斷旁路設定暫存器*/
19
20 #define ACCEL_XOUT_H 0x3B /* 加速度值,X軸高8位暫存器 */
21 #define ACCEL_YOUT_H 0x3D /* 加速度值,Y軸高8位暫存器 */
22 #define ACCEL_ZOUT_H 0x3F /* 加速度值,Z軸高8位暫存器 */
23 #define GYRO_XOUT_H 0x43 /* 陀螺儀值,X軸高8位暫存器 */
24 #define GYRO_YOUT_H 0x45 /* 陀螺儀值,Y軸高8位暫存器 */
25 #define GYRO_ZOUT_H 0x47 /* 陀螺儀值,Z軸高8位暫存器 */
26
27
28 /* 函式宣告 */
29 void mpu6050_init(void);
30 unsigned char mpu6050_readonebyte(unsigned char addr,unsigned char reg);
31 unsigned char mpu6050_writeonebyte(unsigned char addr,
unsigned char reg,
unsigned char data);
32
33 #endif
mpu6050.h檔案里面主要定義了一些與mpu6050暫存器相關的宏,以及宣告了一些函式,
然后我們打開mpu6050.c檔案,在里面輸入下面的代碼:
1 #include "mpu6050.h"
2 #include "i2c.h"
3 #include "delay.h"
4 #include "cc.h"
5 #include "stdio.h"
6
7 /*
8 * @description : 初始化MPU6050
9 * @param : 無
10 * @return : 無回傳
11 */
12 void mpu6050_init(void)
13 {
14
15 /* 1、IO初始化,配置I2C IO屬性
16 * I2C1_SCL -> UART4_TXD
17 * I2C1_SDA -> UART4_RXD
18 */
19 IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
20 IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
21
22 /*
23 *bit 16:0 HYS關閉
24 *bit [15:14]: 1 默認47K上拉
25 *bit [13]: 1 pull功能
26 *bit [12]: 1 pull/keeper使能
27 *bit [11]: 0 關閉開路輸出
28 *bit [7:6]: 10 速度100Mhz
29 *bit [5:3]: 110 驅動能力為R0/6
30 *bit [0]: 1 高轉換率
31 */
32 IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);
33 IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0X70B0);
34
35 i2c_init(I2C1); /* 初始化I2C1 */
36
37 /* 2、初始化MPU6050 */
38 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_PWR_MGMT1_REG,
0X80); /* 復位MPU6050 */
39 delayms(50);
40 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_PWR_MGMT1_REG,
0X00); /* 喚醒MPU6050 */
41 delayms(50);
42 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_GYRO_CFG_REG,
3<<3);/*陀螺儀傳感器,+-2000dps*/
43 delayms(50);
44 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_ACCEL_CFG_REG,
0<<3);/*加速度傳感器,+-2g*/
45 delayms(50);
46 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_SAMPLE_RATE_REG,
19);/*設定采樣率50Hz*/
47 delayms(50);
48 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_INT_EN_REG,
0x00);/*關閉所有中斷*/
49 delayms(50);
50 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_USER_CTRL_REG,
0x00);/*I2C主模式關閉*/
51 delayms(50);
52 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_FIFO_EN_REG,
0x00);/*關閉FIFO*/
53 delayms(50);
54 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_INTBP_CFG_REG,
0x80);/*INT引腳低電平有效*/
55 delayms(50);
56 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_PWR_MGMT1_REG,
0x01);/*設定CLKSEL,PLL X軸為參考*/
57 delayms(50);
58 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_PWR_MGMT2_REG,
0x00);/*加速度與陀螺儀都作業*/
59 delayms(50);
60 mpu6050_writeonebyte(MPU6050_ADDR,
MPU_CFG_REG,
0x04);/*設定數字低通濾波
器:MPU_SAMPLE_RATE_REG/2=25Hz*/
61 delayms(50);
62 }
63
64 /*
65 * @description : 向MPU6050寫入資料
66 * @param - addr: 設備地址
67 * @param - reg : 要寫入的暫存器
68 * @param - data: 要寫入的資料
69 * @return : 操作結果
70 */
71 unsigned char mpu6050_writeonebyte(unsigned char addr,
unsigned char reg, unsigned char data)
72 {
73 unsigned char status=0;
74 unsigned char writedata=data;
75 struct i2c_transfer masterXfer;
76
77 /* 配置I2C xfer結構體 */
78 masterXfer.slaveAddress = addr; /* 設備地址 */
79 masterXfer.direction = kI2C_Write; /* 寫入資料 */
80 masterXfer.subaddress = reg; /* 要寫入的暫存器地址 */
81 masterXfer.subaddressSize = 1; /* 地址長度一個位元組 */
82 masterXfer.data = &writedata; /* 要寫入的資料 */
83 masterXfer.dataSize = 1; /* 寫入資料長度1個位元組 */
84
85 if(i2c_master_transfer(I2C1, &masterXfer))
86 status=1;
87
88 return status;
89 }
90
91 /*
92 * @description : 從MPU6050讀取一個位元組的資料
93 * @param - addr: 設備地址
94 * @param - reg : 要讀取的暫存器
95 * @return : 讀取到的資料,
96 */
97 unsigned char mpu6050_readonebyte(unsigned char addr,unsigned char reg)
98 {
99 unsigned char val=0;
100
101 struct i2c_transfer masterXfer;
102 masterXfer.slaveAddress = addr; /* 設備地址 */
103 masterXfer.direction = kI2C_Read; /* 讀取資料 */
104 masterXfer.subaddress = reg; /* 要讀取的暫存器地址 */
105 masterXfer.subaddressSize = 1; /* 地址長度一個位元組 */
106 masterXfer.data = &val; /* 接收資料緩沖區 */
107 masterXfer.dataSize = 1; /* 讀取資料長度1個位元組 */
108 i2c_master_transfer(I2C1, &masterXfer);
109
110 return val;
111 }
在mpu6050.c檔案里面定義了三個函式,首先第一個是mpu6050_init函式,該函式主要完成i2c的初始化,以及mpu6050的初始化(復位mpu6050,設定陀螺儀,加速度計的引數,采樣率,關閉中斷,FIFO功能,最后使能加速度計和陀螺儀),第二個函式是mpu6050_writeonebyte,該函式用來配置mpu6050暫存器,第三個函式是mpu6050_readonebyte,該函式是讀取mpu6050的暫存器,
然后我們打開main.c檔案,在里面輸入下面的代碼:
1 #include "clk.h"
2 #include "delay.h"
3 #include "led.h"
4 #include "beep.h"
5 #include "key.h"
6 #include "int.h"
7 #include "uart.h"
8 #include "lcd.h"
9 #include "lcdapi.h"
10 #include "rtc.h"
11 #include "mpu6050.h"
12 #include "stdio.h"
13
14 /*
15 * @description : 使能I.MX6U的硬體NEON和FPU
16 * @param : 無
17 * @return : 無
18 */
19 void imx6ul_hardfpu_enable(void)
20 {
21 uint32_t cpacr;
22 uint32_t fpexc;
23
24 /* 使能NEON和FPU */
25 cpacr = __get_CPACR();
26 cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))
27 | (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);
28 __set_CPACR(cpacr);
29 fpexc = __get_FPEXC();
30 fpexc |= 0x40000000UL;
31 __set_FPEXC(fpexc);
32 }
33
34 /*
35 * @description : main函式
36 * @param : 無
37 * @return : 無
38 */
39 int main(void)
40 {
41 unsigned short ACCE_X, ACCE_Y, ACCE_Z, GYRO_X, GYRO_Y, GYRO_Z;
42
43 unsigned char i = 0;
44 unsigned char state = OFF;
45
46 imx6ul_hardfpu_enable(); /* 使能I.MX6U的硬體浮點 */
47 int_init(); /* 初始化中斷(一定要最先呼叫!) */
48 imx6u_clkinit(); /* 初始化系統時鐘 */
49 delay_init(); /* 初始化延時 */
50 clk_enable(); /* 使能所有的時鐘*/
51 led_init(); /* 初始化led */
52 beep_init(); /* 初始化beep*/
53 uart_init(); /* 初始化串口,波特率115200 */
54 lcd_init(); /* 初始化LCD */
55 mpu6050_init(); /* 初始化MPU6050*/
56
57
58 tftlcd_dev.forecolor = LCD_RED; /*設定字體顏色為紅色*/
59 lcd_show_string(30, 50, 200, 16, 16,
60 (char*)"i.MX6ULL MPU6050 TEST");/* 顯示資訊*/
61
62 lcd_show_string(30, 100, 200, 16, 16, (char*)" ACCE_X:");
63 lcd_show_string(30, 120, 200, 16, 16, (char*)" ACCE_Y:");
64 lcd_show_string(30, 140, 200, 16, 16, (char*)" ACCE_Z:");
65 lcd_show_string(30, 160, 200, 16, 16, (char*)" GYRO_X:");
66 lcd_show_string(30, 180, 200, 16, 16, (char*)" GYRO_Y:");
67 lcd_show_string(30, 200, 200, 16, 16, (char*)" GYRO_Z:");
68
69 tftlcd_dev.forecolor = LCD_BLUE;
70
71 while(1)
72 {
73 /* 讀取加速度X軸資料 */
74 ACCE_X = (mpu6050_readonebyte(MPU6050_ADDR, ACCEL_XOUT_H)<<8)
75 + mpu6050_readonebyte(MPU6050_ADDR, ACCEL_XOUT_H+1);
76
77 /* 讀取加速度Y軸資料 */
78 ACCE_Y = (mpu6050_readonebyte(MPU6050_ADDR, ACCEL_YOUT_H)<<8)
79 + mpu6050_readonebyte(MPU6050_ADDR, ACCEL_YOUT_H+1);
80
81 /* 讀取加速度Z軸資料 */
82 ACCE_Z = (mpu6050_readonebyte(MPU6050_ADDR, ACCEL_ZOUT_H)<<8)
83 + mpu6050_readonebyte(MPU6050_ADDR, ACCEL_ZOUT_H+1);
84
85 /* 讀取陀螺儀X軸資料 */
86 GYRO_X = (mpu6050_readonebyte(MPU6050_ADDR, GYRO_XOUT_H)<<8)
87 + mpu6050_readonebyte(MPU6050_ADDR, GYRO_XOUT_H+1);
88
89 /* 讀取陀螺儀Y軸資料 */
90 GYRO_Y = (mpu6050_readonebyte(MPU6050_ADDR, GYRO_YOUT_H)<<8)
91 + mpu6050_readonebyte(MPU6050_ADDR, GYRO_YOUT_H+1);
92
93 /* 讀取陀螺儀Z軸資料 */
94 GYRO_Z = (mpu6050_readonebyte(MPU6050_ADDR, GYRO_ZOUT_H)<<8)
95 + mpu6050_readonebyte(MPU6050_ADDR, GYRO_ZOUT_H+1);
96
97 /* 串口列印獲取到的所有資料 */
98 printf("ACCE_X:%d
ACCE_Y:%d
ACCE_Z:%d
GYRO_X:%d
GYRO_Y:%d
GYRO_Z:%d\r\n",
99 ACCE_X, ACCE_Y, ACCE_Z, GYRO_X, GYRO_Y, GYRO_Z);
100
101 lcd_shownum(30 + 64, 100, ACCE_X, 5, 16);/* 顯示加速度X軸資料 */
102 lcd_shownum(30 + 64, 120, ACCE_Y, 5, 16);/* 顯示加速度Y軸資料 */
103 lcd_shownum(30 + 64, 140, ACCE_Z, 5, 16);/* 顯示加速度Z軸資料 */
104 lcd_shownum(30 + 64, 160, GYRO_X, 5, 16);/* 顯示陀螺儀X軸資料 */
105 lcd_shownum(30 + 64, 180, GYRO_Y, 5, 16);/* 顯示陀螺儀Y軸資料 */
106 lcd_shownum(30 + 64, 200, GYRO_Z, 5, 16);/* 顯示陀螺儀Z軸資料 */
107
108 delayms(200);
109 i++;
110 if(i == 2)
111 {
112 i = 0;
113 state = !state;
114 led_switch(LED0,state);
115 }
116 }
117 return 0;
118 }
在main.c檔案第55行呼叫mpu6050_init函式初始化mpu6050,然后再在while主回圈里面讀取加速度計和陀螺儀的數值,分別在螢屏和串口顯示出來,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/201054.html
標籤:其他
