代码分析
I2C的硬件定义
本实验中的I2C驱动与MPU6050驱动分开主要是考虑到扩展其它传感器时的通用性,如使用磁场传感器、气压传感器都可以使用同样一个I2C驱动, 这个驱动只要给出针对不同传感器时的不同读写接口即可。关于STM32的I2C驱动原理请参考读写EEPROM的章节, 本章讲解的I2C驱动主要针对接口封装讲解,细节不再赘述。 本实验中的I2C硬件定义见 。
这些宏根据传感器使用的I2C硬件封装起来了。
初始化I2C
接下来利用这些宏对I2C进行初始化,初始化过程与I2C读写EEPROM中的无异,见 。
对读写函数的封装
初始化完成后就是编写I2C读写函数了,这部分跟EERPOM的一样,主要是调用STM32标准库函数读写数据寄存器及标志位, 本实验的这部分被编写进ST_Sensors_I2C_WriteRegister及ST_Sensors_I2C_ReadRegister中了,在它们之上, 再封装成了Sensors_I2C_WriteRegister及Sensors_I2C_ReadRegister,见 。
封装后的函数主要是增加了错误重试机制,若读写出现错误,则会进行多次尝试,多次尝试均失败后会返回错误代码。 这个函数作为I2C驱动对外的接口,其它使用I2C的传感器调用这个函数进行读写寄存器。
MPU6050的寄存器定义
MPU6050有各种各样的寄存器用于控制工作模式,我们把这些寄存器的地址、 寄存器位使用宏定义到了mpu6050.h文件中了,见 。
初始化MPU6050
根据MPU6050的寄存器功能定义,我们使用I2C往寄存器写入特定的控制参数, 见 。
这段代码首先使用MPU6050_ReadData及MPU6050_WriteRed函数封装了I2C的底层读写驱动, 接下来用它们在MPU6050_Init函数中向MPU6050寄存器写入控制参数,设置了MPU6050的采样率、量程(分辨率)。
读传感器ID
初始化后,可通过读取它的“WHO AM I”寄存器内容来检测硬件是否正常, 该寄存器存储了ID号0x68,见 。
读取原始数据
若传感器检测正常,就可以读取它数据寄存器获取采样数据了,见 。
其中前以上三个函数分别用于读取三轴加速度、角速度及温度值,这些都是原始的ADC数值(16位长),对于加速度和角速度, 把读取得的ADC值除以分辨率,即可求得实际物理量数值。最后一个函数MPU6050_ReturnTemp展示了温度ADC值与实际温度值间的转换, 它是根据MPU6050的说明给出的转换公式进行换算的,注意陀螺仪检测的温度会受自身芯片发热的影响,严格来说它测量的是自身芯片的温度, 所以用它来测量气温是不太准确的。对于加速度和角速度值我们没有进行转换,在下一小节中我们直接利用这些数据交给DMP单元,求解出姿态角。
main函数
最后我们来看看本实验的main函数,见 。
本实验中控制MPU6050并没有使用中断检测,我们是利用Systick定时器进行计时,隔一段时间读取MPU6050的数据寄存器获取采样数据的, 代码中使用Task_Delay变量来控制定时时间,在Systick中断里会每隔1ms对该变量值减1,所以当它的值为0时表示定时时间到。
在main函数里,调用I2C_Bus_Init、MPU6050_Init及MPU6050ReadID函数后,就在whlie循环里判断定时时间,定时时间到后就读取加速度、 角速度及温度值,并使用串口打印信息到电脑端。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/73097.html