当前位置: 首页 > news >正文

青海省建设厅网站首页上海网站建设的价格

青海省建设厅网站首页,上海网站建设的价格,sem竞价推广托管代运营公司,优秀电子商务网站目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验证 5.1、实验具体流程 5.2、实验现象 6、注释详解 1、准备材料 开发板正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件Version 6.10.0 野火DAP仿真器 keil µVision5 IDEMDK-Arm CH340G Windows系统驱动程序CH341SER.EXE XCOM V2.6串口助手 逻辑分析仪nanoDLA 2、实验目标 使用STM32CubeMX软件配置STM32F407开发板的I2C1与MPU6050芯片通信读取MPU6050的三轴加速度和陀螺仪数据并通过串口打印出来 3、实验流程 3.0、前提知识 本实验重点是理解I2C通信协议而STM32CubeMX的配置则相对简单这里不会过于详细全面的介绍I2C通信协议但是会对所有需要知道的知识做介绍 在我们的开发板上有一颗三轴加速度计和陀螺仪传感器MPU6050单片机通过I2C1的PB8和PB9两个引脚与MPU6050进行通信MPU6050还有一个中断引脚这里为3D_INT引脚但是本实验仅仅轮询读取加速度计和陀螺仪的数据并没有用到该引脚中断功能我们使用的开发板上的MPU6050芯片硬件原理图如下图所示 I2C通信仅需要时钟线SCLK和数据线SDA两根线就可以让主机与挂载在I2C上的从机进行通信和数据交换一个I2C理论上最多可挂载127个设备从机地址用7位二进制表示为了让主机准确的与众多从机中的一个进行通信每个从机都会有一个地址I2C通信时会在通信数据中先发送从机地址然后对应地址的从机才会响应而且I2C通信使用的时钟线SCLK和数据线SDA两根线必须要做上拉设置因为I2C的两个引脚被配置为开漏输出因此无法输出高电平I2C总线连线图如下图所示注释1 MPU6050的从机地址由芯片上的AD0引脚确定当AD0引脚接地时从机地址为0X68当AD0引脚接VCC时从机地址为0X69根据上面MPU6050芯片硬件原理图可知此时MPU6050的从机地址为0X68 根据MPU6050 datasheet 9.3 I2C Communications Protocol 小节可知注释2主机要通过I2C写入/读取MPU6050某一个寄存器一字节的数据其通信步骤序列应该如下图所示 我们以读取内部寄存器单个字节数据为例做详细介绍首先确定通信的目的为主机Master从从机Slave内部某个寄存器internal register中读取一个字节数据以下为详细通信步骤 主机时钟线SCLK和数据线SDA两根线产生起始信号当 SCL 线是高电平时 SDA 线从高电平向低电平切换接下来时钟线SCLK的8个时钟节拍中由数据线SDA发送一字节8位的数据其中高7位为从机的地址最后一位为01表示读操作0表示写操作接下来1个时钟节拍从机应该产生应答信号ACK接下来8个时钟节拍主机发送一字节8位的数据该数据为要读取的从机内部寄存器地址接下来1个时钟节拍从机应该产生应答信号ACK主机重新产生一个起始信号接下来8个时钟节拍重新发送一字节8位的数据其中高7位为从机的地址最后一位为1表示这次要读接下来1个时钟节拍从机应该产生应答信号ACK接下来8个时钟节拍主机读取一字节8位数据接下来1个时钟节拍主机应该产生应答信号NACK主机时钟线SCLK和数据线SDA两根线产生停止信号当 SCL 线是高电平时 SDA 线由低电平向高电平切换 接下来我们用逻辑分析仪捕获下主机使用I2C1读取MPU6050寄存器WHO_AM_I0X75时时钟线SCLK和数据线SDA的逻辑电平变化如下图所示从图上可知I2C读取读取MPU6050内部寄存器的时序与上面我们所描述的一致 用逻辑分析仪捕获主机使用I2C1向MPU6050寄存器PWR_MGMT_10X6B写入一字节0X00数据时时钟线SCLK和数据线SDA的逻辑电平变化如下图所示 为什么从机地址从0X68变为0XD0了 HAL库中的I2C写入函数HAL_I2C_Mem_Write()和读取函数HAL_I2C_Mem_Read()对传入从机地址DevAddress参数做了要求该地址必须将数据手册中提到的地址左移才可以调用该接口0X680110 1000向左移动直到遇到1即为0XD01101 0000在I2C通信中使用上述两个API从机地址传入0XD0表示对从机地址为0X68的从机进行写操作传入0XD1表示对从机地址为0X68的从机进行读操作如下图为HAL库HAL_I2C_Mem_Read()函数说明 上面提到当启用I2C之后其I2C_SCL和I2C_SDA两个引脚被配置为了复用功能开漏输出而开漏输出无法输出高电平因此I2C_SCL和I2C_SDA两个引脚需要外部上拉一般的开发板都会考虑到这一点在设计原理图的时候将使用的I2C两根线给外部上拉到3.3V如果你使用的是自己设计的板子请务必记住I2C需要上拉 细心的同学可能又发现了你上面给出的MPU6050硬件原理图I2C两根线并没有外部上拉呀 虽然MPU6050硬件原理图I2C两根线没有上拉但是在开发板的其他I2C通信的芯片上进行了外部上拉如下图所示 3.1、CubeMX相关配置 请先阅读“STM32CubeMX教程1 工程建立”实验3.4.1小节配置RCC和SYS 3.1.1、时钟树配置 系统时钟树均设置为STM32F407总线能达到的最高时钟频率无需启动LSE具体配置如下图所示 3.1.2、外设参数配置 实验需要通过串口来输出与MPU6050进行I2C通信读取的陀螺仪和加速度计数据因此外设需要初始化USART1和I2C1 单击Pinout Configuration页面左边Connectivity/USART1选项然后按照“STM32CubeMX教程9 USART/UART 异步通信”实验中将USART1配置为异步通信模式无需开启中断如下图所示 在Pinout Configuration页面右边芯片引脚预览Pinout view中找到与开发板上MPU6050芯片连接的I2C的两个通信引脚PB8和PB9左边单击将其分别配置为I2C1_SCL和I2C1_SDA 然后单击Connectivity/I2C1选项在其模式中选择I2C在下方Master Features中将I2C Speed Mode根据用户需求选择快速模式400kkHz或者标准模式100kHz这两种模式仅仅影响通信速率对于本实验两个模式均可随意选择 其他参数保持默认即可具体配置如下图所示 3.1.3、外设中断配置 本实验无需启用中断如果需要启用I2C1的中断请单击System Core/NVIC然后根据需求勾选I2C1的事件或错误中断并选择合适的中断优先级即可具体配置如下图所示 3.2、生成代码 请先阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节配置Project Manager 单击页面右上角GENERATE CODE生成工程 3.2.1、外设初始化调用流程 还是一模一样的流程与该系列教程所有的外设初始化一致 在生成的工程代码主函数中新增了MX_I2C1_Init()函数在该函数中实现了对I2C1的模式及参数配置 在MX_I2C1_Init()函数中调用了HAL_I2C_Init()函数使用配置的参数对I2C1进行了初始化 在HAL_I2C_Init()函数中又调用了HAL_I2C_MspInit()函数对I2C1引脚复用设置I2C1时钟使能如果开启了中断该函数中还会有中断相关设置及使能 如下图所示为I2C1初始化调用流程 3.2.2、外设中断调用流程 本实验无需中断因此未启动任何I2C1的中断 3.2.3、添加其他必要代码 需要添加MPU6050的驱动文件文件中至少应该包括①MPU6050初始化函数、②MPU6050获取三轴加速度计原始数据函数和③MPU6050获取三轴陀螺仪原始数据函数注意本实验只使用而不会介绍MPU6050具体驱动文件的原理具体源代码如下所示注释3 mpu6050.c文件 #include mpu6050.h/** * brief MPU6050初始化函数 * alter 无 * param 无 * retval 成功返回0失败返回1 */ uint8_t MPU6050_Init(I2C_HandleTypeDef *I2Cx) {uint8_t check;uint8_t Data;// check device ID WHO_AM_IHAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, MPU_DEVICE_ID_REG, 1, check, 1, I2C_TimeOut);// 0x68 will be returned by the sensor if everything goes wellif (check 104) {// power management register 0X6B we should write all 0s to wake the sensor upData 0;HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, MPU_PWR_MGMT1_REG, 1, Data, 1, I2C_TimeOut);// Set DATA RATE of 1KHz by writing SMPLRT_DIV registerData 0x07;HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, MPU_SAMPLE_RATE_REG, 1, Data, 1, I2C_TimeOut);// Set accelerometer configuration in ACCEL_CONFIG Register// XA_ST0,YA_ST0,ZA_ST0, FS_SEL0 - 2gData 0x00;HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, MPU_ACCEL_CFG_REG, 1, Data, 1, I2C_TimeOut);// Set Gyroscopic configuration in GYRO_CONFIG Register// XG_ST0,YG_ST0,ZG_ST0, FS_SEL0 - 250 /sData 0x00;HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, MPU_GYRO_CFG_REG, 1, Data, 1, I2C_TimeOut);return 0;}return 1; }/** * brief MPU6050温度值获取函数 * alter 无 * param 无 * retval 温度值 */ float MPU_Get_Temperature(void) {uint8_t buf[2]; short raw;float temp;HAL_I2C_Mem_Read(MPU6050_I2C, MPU6050_ADDR, MPU_TEMP_OUTH_REG, 1, buf, 2, I2C_TimeOut);raw((int16_t)buf[0]8)|buf[1]; temp36.53((double)raw)/340; return temp;; }/** * brief MPU6050陀螺仪值获取函数(三轴原始值) * alter 无 * param gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号) * retval 正常0错误其他 */ uint8_t MPU_Get_RAW_Gyroscope(int16_t *gx,int16_t *gy,int16_t *gz) {uint8_t buf[6],res; res HAL_I2C_Mem_Read(MPU6050_I2C, MPU6050_ADDR, MPU_GYRO_XOUTH_REG, 1, buf, 6, I2C_TimeOut);if(res0){*gx((int16_t)buf[0]8)|buf[1]; *gy((int16_t)buf[2]8)|buf[3]; *gz((int16_t)buf[4]8)|buf[5];} return res; }/** * brief MPU6050加速度值获取函数(三轴原始值) * alter 无 * param ax,ay,az:加速度计x,y,z轴的原始读数(带符号) * retval 正常0错误其他 */ uint8_t MPU_Get_RAW_Accelerometer(int16_t *ax,int16_t *ay,int16_t *az) {uint8_t buf[6],res; res HAL_I2C_Mem_Read(MPU6050_I2C, MPU6050_ADDR, MPU_ACCEL_XOUTH_REG, 1, buf, 6, I2C_TimeOut);if(res0){*ax((int16_t)buf[0]8)|buf[1]; *ay((int16_t)buf[2]8)|buf[3]; *az((int16_t)buf[4]8)|buf[5];} return res; }mpu6050.h文件 #ifndef __MPU6050_H #define __MPU6050_H #include main.h #include i2c.h #endif#define MPU6050_I2C hi2c1 #define MPU6050_ADDR 0xD0 #define I2C_TimeOut 100/*MPU6050内部寄存器地址*/ #define MPU_SAMPLE_RATE_REG 0X19 //采样频率分频器 #define MPU_GYRO_CFG_REG 0X1B //陀螺仪配置寄存器 #define MPU_ACCEL_CFG_REG 0X1C //加速度计配置寄存器 #define MPU_ACCEL_XOUTH_REG 0X3B //加速度值,X轴高8位寄存器 #define MPU_TEMP_OUTH_REG 0X41 //温度值高八位寄存器 #define MPU_GYRO_XOUTH_REG 0X43 //陀螺仪值,X轴高8位寄存器 #define MPU_PWR_MGMT1_REG 0X6B //电源管理寄存器1 #define MPU_DEVICE_ID_REG 0X75 //器件ID寄存器uint8_t MPU6050_Init(I2C_HandleTypeDef *I2Cx); float MPU_Get_Temperature(void); uint8_t MPU_Get_RAW_Gyroscope(int16_t *gx,int16_t *gy,int16_t *gz); uint8_t MPU_Get_RAW_Accelerometer(int16_t *ax,int16_t *ay,int16_t *az);/* MPU6050内部所有寄存器地址#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寄存器 */在keil中添加.c/.h文件步骤如下图所示 然后将源代码复制到新建的.c/.h文件中最后将.c文件添加到工程即可如下图所示 在主函数中初始化MPU6050主循环中获取原始的三轴加速度数据和三轴陀螺仪数据并通过串口打印信息 源代码如下 /*main.c中定义的变量*/ int16_t ax,ay,az,gx,gy,gz;/*初始化代码*/ while(MPU6050_Init(hi2c1) ! HAL_OK){HAL_Delay(1);}/*主循环中代码*/ MPU_Get_RAW_Gyroscope(ax,ay,az); MPU_Get_RAW_Accelerometer(gx,gy,gz); printf(ax:%d,ay:%d,az:%d,,ax,ay,az); printf(gx:%d,gy:%d,gz:%d\r\n,gx,gy,gz); HAL_Delay(100);4、常用函数 /*I2C读函数*/ HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)/*I2C写函数*/ HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) 5、烧录验证 5.1、实验具体流程 “配置USART1 - 配置I2C1 - 在工程中添加mpu6050.c/mpu6050.h文件 - 主函数中调用MPU6050初始化函数 - 主循环中获取三轴加速度计/陀螺仪原始数据 - 串口打印” 5.2、实验现象 烧录程序上电后开启串口可以看到源源不断的输出当前MPU6050三轴加速度数据和三轴陀螺仪数据移动开发板会发现数据有规律改变如下图所示为串口输出的数据 6、注释详解 注释1图片来源I2C通信协议介绍 - 知乎 注释2MPU6050 Datasheet https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf 注释3MPU6050驱动库参考https://github.com/leech001/MPU6050
http://www.zqtcl.cn/news/657839/

相关文章:

  • 网站icp备案管理系统个人网站源代码
  • 西安网站建设公司云网wordpress 文章分类
  • 长沙优化网站服务r18cn wordpress
  • 建材网站设计延安网站建设电话
  • 做视频网站犯法么华为公司网站建设案例分析
  • 陕煤化建设集团网站矿建二公司网站制作系统
  • 网站建设类别wordpress下载付费
  • 廊坊做网站的成都网站建设网站建设
  • 如何自己开网站网络服务检测与维护
  • 古镇网站建设熊掌号专业网站开发哪里有
  • 专业做网站服务上海网站开发哪家好
  • 科普重庆网站浙江网站开发
  • 怎么搭建自己的网站后台邹城网站建设哪家好
  • 二手房在哪个网站做合同wordpress 局域网 慢
  • 全包胶衣网站wordpress 3.1
  • 怎么仿照别人网站建电商网站
  • 网站每年维护费用天津智能网站建设
  • php开发网站建设仿摄影网站
  • 动漫网站源码下载百度指数是啥
  • 建站之星演示谷歌网站建站
  • wordpress是建站工具 还是语言表格制作
  • 北京中国建设银行招聘信息网站店标logo图片免费制作
  • 网站建设分金手指专业二七文章网站是怎么做的
  • 东莞网站设计企业怎么制作手机app及网站
  • 林州做网站下载做蛋糕网站
  • 做网站改版的做实验用哪些国外网站
  • 什么是静态页面网站甜品网站建设方案
  • 做一个网站大概多少钱养生网站源码
  • 淘宝客网站建设分类校园网站开发设计报告
  • 个人网站模板 免费儿童编程培训机构