1.实验目标

本实验主要通过LCD显示MPU6050温度及坐标。

2.实验准备

硬件搭建:ZW-HC32F460-BZ标准版开发板1套

软件搭建:MDK5.22

3.硬件原理

MPU6050的IIC引脚连接HC32的I2C3单元,引脚PB9接SCL,PB8接SDA。

4.驱动代码

为了简化编程,让用户快速上手,我公司针对I2C驱动文件进行了深度优化编写,提供开源的l2C.c和l2C.h以供用户使用,现将源文件关键定义及函数做说明。

在Keil中打开l2C.h,选择Configuration Wizard,便出现上图中的界面,通过图形化配置I2C参数,使用I2CInt()函数,编译过后即可完成I2C初始化。

【MPU6050初始化函数】

函数原型: u8 MPU_Init( void )

功能说明: 初始化MPU6050

输入参数: 无

输出参数: 0:成功

其它错误

特殊备注: 无

u8 MPU_Init( void ){u8 res;I2CInt();//初始化IIC总线MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);    //复位MPU6050Ddl_Delay1ms(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);    //唤醒MPU6050MPU_Set_Gyro_Fsr(3);                              //陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0);                              //加速度传感器,±2gMPU_Set_Rate(50);                                           //设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG,0X00);       //关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);     //关闭FIFOMPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效res=MPU_Read_Byte(MPU_DEVICE_ID_REG);if(res==MPU_ADDR)//器件ID正确{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;return 0;}

【MPU6050DMP初始化函数】

//mpu6050,dmp初始化//返回值:0,正常//    其他,失败u8 mpu_dmp_init(void){u8 res=0;I2CInt();         //初始化IIC总线if(mpu_init()==0)   //初始化MPU6050{     res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器if(res)return 1;res=mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL);//设置FIFOif(res)return 2;res=mpu_set_sample_rate(DEFAULT_MPU_HZ);       //设置采样率if(res)return 3;res=dmp_load_motion_driver_firmware();        //加载dmp固件if(res)return 4;res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向if(res)return 5;res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|      //设置dmp功能DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL);if(res)return 6;res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);      //设置DMP输出速率(最大不超过200Hz)if(res)return 7;  res=run_self_test();       //自检if(res)return 8;   res=mpu_set_dmp_state(1); //使能DMPif(res)return 9;    }return 0;}

【MPU6050获取温度函数】

函数原型: short MPU_Get_Temperature( void )

功能说明: 取温度值

输入参数: 无

输出参数: 温度值(扩大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;;}

【MPU6050获取陀螺仪值函数】

函数原型: u8 MPU_Get_Gyroscope( short *gx, short *gy, short *gz )

功能说明: 取陀螺仪值(原始值)

输入参数: 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;;}

【MPU6050获取加速度函数】

函数原型: u8 MPU_Get_Accelerometer( short *ax, short *ay, short *az )

功能说明: 取加速度值(原始值)

输入参数: gx,gy,gz:陀螺仪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;;}

【MPU6050获取DMP处理后的陀螺仪值函数】

//得到dmp处理后的数据(注意,本函数需要比较多堆栈,局部变量有点多)//pitch:俯仰角 精度:0.1°   范围:-90.0° <---> +90.0°//roll:横滚角  精度:0.1°   范围:-180.0°<---> +180.0°//yaw:航向角   精度:0.1°   范围:-180.0°<---> +180.0°//返回值:0,正常//    其他,失败u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw){float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;unsigned long sensor_timestamp;short gyro[3], accel[3], sensors;unsigned char more;long quat[4];if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))return 1;  /* Gyro and accel data are written to the FIFO by the DMP in chip frame and hardware units.* This behavior is convenient because it keeps the gyro and accel outputs of dmp_read_fifo and mpu_read_fifo consistent.**//*if (sensors & INV_XYZ_GYRO )send_packet(PACKET_TYPE_GYRO, gyro);if (sensors & INV_XYZ_ACCEL)send_packet(PACKET_TYPE_ACCEL, accel); *//* Unlike gyro and accel, quaternions are written to the FIFO in the body frame, q30.* The orientation is set by the scalar passed to dmp_set_orientation during initialization.**/if(sensors&INV_WXYZ_QUAT){q0 = quat[0] / q30;       //q30格式转换为浮点数q1 = quat[1] / q30;q2 = quat[2] / q30;q3 = quat[3] / q30;//计算得到俯仰角/横滚角/航向角*pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;  // pitch*roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;     // roll*yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;     //yaw}else return 2;return 0;}

5.主流程图

6.实验过程

【第一步:新建/配置工程】

将工程模板复制到实验目录下,将工程名改为MPU6050。

勾选FWLibCfg.h配置中的CLK_EN、EFM_EN、GPIO_EN、PWC_EN、SRAM_EN、UTILITY_EN、I2C_EN选项

【第二步:添加I2C模块驱动】

将I2C.c和I2C.h复制到实验27 MPU6050实验\Hardware\Peripheral路径下,同时将I2C.c添加到工程中Hardware/Peripheral下。

【第三步:添加MPU6050模块驱动】

将mpu6050、inv_mpu、inv_mpu_dmp_motion_driver的头文件和源文件复制到\实验24MPU6050实验\Hardware\OnBoard路径下,同时将led.c添加到工程中Hardware/OnBoard下。

【第四步:初始化编程】

1)添加MPU6050头文件

在main.c文件中先添加mpu6050.h、inv_mpu.h、inv_mpu_dmp_motion_driver.h头文件。

#include "mpu6050.h"#include "inv_mpu.h"#include "inv_mpu_dmp_motion_driver.h"

2)配置MPU6050引脚

打开I2C.h(一般将h文件添加到c文件并编译,即可在c文件下方显示出该h文件)文件,在下方选择 “Configuration Wizard”标签,即可出现配置界面。将MPU6050进行如下配置(与原理图引脚对应)。

3)MPU6050初始化

在主函数中调用MPU6050和DMP初始化函数。

MPU_Init();mpu_dmp_init()

【第五步:MPU读取数据实现】

通过获取按键key1的值,串口开关自动上报数据,串口收到的数据可以通过一个软件实时显示陀螺仪坐标。通过mpu_dmp_get_data()函数获取MPU6050的DMP处理后的陀螺仪数据,然后获取温度、加速度传感器数据、陀螺仪原始数据。

如果key1按下就通过串口发送加速度数据和陀螺仪原始数据,LCD默认陀螺仪的温度,显示陀螺仪DMP处理过的数据。

    while(1){key=KeyScan( );if(key==KEY1_VAL){report=!report;if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");}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);    //得到陀螺仪数据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));if((t%10)==0){if(temp<0){LCD_ShowChar(30+48,200,'-',16,0);       //显示负号temp=-temp;     //转为正数}else LCD_ShowChar(30+48,200,' ',16,0);     //去掉负号LCD_ShowNum(30+48+8,200,temp/100,3,16);     //显示整数部分       LCD_ShowNum(30+48+40,200,temp%10,1,16);     //显示小数部分temp=pitch*10;if(temp<0){LCD_ShowChar(30+48,220,'-',16,0);       //显示负号temp=-temp;     //转为正数}else LCD_ShowChar(30+48,220,' ',16,0);     //去掉负号LCD_ShowNum(30+48+8,220,temp/10,3,16);      //显示整数部分       LCD_ShowNum(30+48+40,220,temp%10,1,16);     //显示小数部分temp=roll*10;if(temp<0){LCD_ShowChar(30+48,240,'-',16,0);       //显示负号temp=-temp;     //转为正数}else LCD_ShowChar(30+48,240,' ',16,0);     //去掉负号LCD_ShowNum(30+48+8,240,temp/10,3,16);      //显示整数部分       LCD_ShowNum(30+48+40,240,temp%10,1,16);     //显示小数部分temp=yaw*10;if(temp<0){LCD_ShowChar(30+48,260,'-',16,0);       //显示负号temp=-temp;     //转为正数}else LCD_ShowChar(30+48,260,' ',16,0);     //去掉负号LCD_ShowNum(30+48+8,260,temp/10,3,16);      //显示整数部分       LCD_ShowNum(30+48+40,260,temp%10,1,16);     //显示小数部分 t=0;//LED0=!LED0;//LED闪烁}}t++;}  }

【第六步:下载验证】

连接好硬件,编译下载运行该程序,LCD显示陀螺仪的数据。

华大HC32F460 MPU6050实验相关推荐

  1. 华大HC32F460 DCU实验

    目录 1.实验目标 2.实验准备 3.库函数说明 4.主流程图 5.实验过程 数据计算单元(Data Computing Unit)是一个不借助于CPU的简单处理数据的模块.每个DCU单元具有3个数据 ...

  2. 华大HC32F460 SPI 驱动 ST7735S LCD显示器

    华大HC32F460 SPI 驱动 ST7735S LCD显示器 前言: STM32改HC32F460 换芯片后发现SPI硬件驱动不了屏了,这个小问题搞了很久,最后用逻辑分析仪,分析时序,然后解决了, ...

  3. 华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑

    华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑 华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑 注:个人笔记,如有错误,还望谅解. STM32 在STM ...

  4. 华大HC32F460 SDIO TF卡实验

    目录 1.实验目标 2.实验准备 3.硬件原理 4.驱动代码 5.主流程图 6.实验过程 7.实验扩展 1.实验目标 本实验使用SDIOC一线式读取SD卡相关信息并打印到USB-UART,同时将SD卡 ...

  5. 华大HC32F460的BOOT和IAP说明

    今年MCU价格暴涨,打算入坑国产MCU,最近趁着有空加工了一块华大的HC32F460评估板.成品板见图1.拿到新控制器,首先要做的就是编写底层BOOT程序,有了BOOT程序即可随时更新APP不被调试器 ...

  6. 华大HC32F460芯片

    华大半导体有限公司(简称华大半导体)是中国电子信息产业集团有限公司(CEC)整合旗下集成电路企业而组建的专业子集团,成立于2014年5月8日.华大半导体涵盖设计.制造.封装.测试.EDA等领域,是拥有 ...

  7. 华大HC32F460时钟简介

    最近在学习华大的HC32F460单片机,学习单片机就不得不说说单片机的运行时钟,华大这款单片机的时钟有很多的时钟总线,外设都是挂载在时钟线上运行的, HC32F460的时钟其实就是片内时钟和片外时钟两 ...

  8. 华大HC32F460系列填坑之USART

    问题:使用F460官方串口例程,将波特率设置为9600失败. 原因:通过仿真,发现设置波特率返回的错误信息是ErrorInvalidParameter(误差无效参数).分析华大提供的设置波特率函数,发 ...

  9. 华大HC32F460NMI中断实验

    目录 1 实验目标 2 实验准备 3 硬件原理 4 驱动代码 5 主流程图 6 实验过程 1 实验目标 本实验主要通过对外部中断的配置及编程,使用中断的方式实现KEY1控制LED1灯的功能. 2 实验 ...

最新文章

  1. Android深入浅出系列之实例应用—手机页面之间的跳转
  2. LeetCode MySQL 1633. 各赛事的用户注册率
  3. ruby hash方法_Ruby中带有示例的Hash.rassoc(obj)方法
  4. 10054 java,为什么Socket.Receive在远程主机断开连接时抛出SocketException(10054)?
  5. SQL死锁知识及解决办法
  6. AD域控exchange邮箱(四)——获取AD域控中计算机有哪些账号登录过
  7. 苹果新漏洞 “Shrootless” 可使攻击者在macOS 系统上安装后门
  8. LCA算法 在线树上倍增模板
  9. java oracle sqlldr,oracle sqlldr
  10. 利用布尔运算可以做出怎样的PPT特效
  11. php公众号客服系统,公众号客服系统完全攻略
  12. 如何用计算机算分数乘法,分数乘法怎么算
  13. TI公司电话面试 ---- 问题回忆录 2012年8月20
  14. linux强制android横屏,Android 强制横屏的方法
  15. H5 video 自动播放(autoplay)不生效解决方案
  16. windows环境下编译ACE+TAO问题及解决办法
  17. AFX_MODULE_STATE作用
  18. Matlab 图像几何变换
  19. 维护采购订单审批的特性Characteristic和类Class
  20. java编写定义圆类和圆柱体类,Java程序基础编程基础

热门文章

  1. 串口中继器是什么应用在那些领域
  2. 钢4基础设施超过上限导致基建需求变负
  3. 创建一个10行5列HTML,网页设计与制作上机试卷.doc
  4. 中传计算机学院考研笔记,纯干货|中传学霸笔记show。◕‿◕。
  5. @Transactional使用方法
  6. 已经发车的票还能取出来吗_过了开车时间以后还能再取出火车票吗?
  7. 15、Java基础——二维数组
  8. Nik color efex pro 笔记
  9. 进口奶粉批发进货渠道
  10. winform程序加皮肤skin ssk文件