引言

设计采用的芯片是STM32F103C8T6,采用的传感器是MPU6050姿态传感器,自主进行电路设计,通过串口传输,完成MPU6050姿态传感器原始数据的读取与显示,以及依靠其内部的DMP模块对原始传感器数据进行滤波、融合处理,得到解算后的姿态角,再通过串口通信的方式,将数据输出到电脑上位机上。

程序设计描述

程序设计的思想及方法如下:

编写串口通信的驱动程序

依据电路板设计,串口通信采用USART1的PA9,PA10作为数据收发引脚,数据发送波特率配置为115200,与上位机的数据接收波特率保持一致。未使用串口中断,串口数据向电脑的发送方式采用重定义fputc函数的形式,然后直接使用printf函数即可。

编写系统延时程序

为了数据在电脑上位机上的显示效果,通过ms级别的延时,控制单片机向上位机发送数据的速度,这里利用到了系统滴答定时器。

对于MPU6050姿态传感器进行初始化

因为MPU6050姿态传感器与芯片的通信方式选择软件模拟IIC协议,需要编写好IIC通信协议的程序。同时,为了对姿态传感器的原始数据进行处理,采用的方法是使用MPU6050姿态传感器内部自带的DMP模块进行姿态解算,解算出偏航角,横滚角,以及俯仰角。

编写定时中断程序

为了等间隔地获取MPU6050姿态传感器的数据,把获取姿态传感器数据的函数放在定时器2的50ms中断服务程序里。

电路设计描述

电路设计以STM32F103C8T6为主控芯片,电路板设计整体分为两部分,一部分是电源部分,可使12V左右的电源供电转化成3.3V或5V,达到给电路板芯片以及其他外设供电的作用;另一部分是模块部分,有MPU6050姿态传感器的接口,此外根据程序下载以及串口通信的需要,同时将程序下载以及串口下载相关引脚引出,具体位置已用丝印的形式在电路板背面标出。

具体设计分析

电源部分与模块部分可通过跳线帽连接,以实现供电的需求,此外也可利用串口部分,通过电脑给电路板提供3.3V的电压,芯片以及各模块可以正常工作。
对于电路板的走线部分,通过过孔的形式,将各部分VCC与GND连接。各模块走线都在上层,具体模块以及引脚号都以丝印的形式标明,如图2-1。

在MPUO6050模块部分电路中,MPU6050姿态传感器一共八个引脚,其中,VCC与GND引脚已与电路板的VCC与GND部分连接;PB8,PB9是STM32F103C8T6的两个普通的IO引脚,同时也是软件模拟IIC通信的SCL与SDA引脚;此外,AD0与INT引脚通过走线与芯片的PA0与PB5相连接。

程序下载模块采用ST-Link下载器,通过走线,与芯片的SWIO与SWCLK引脚连接。对于串口通信部分,将C8T6芯片的PA9,PA10引脚引出,因为电路板未添加CH340芯片,所以需要另外使用USB转TTL模块实现单片机与PC端的通信。
电路板的时钟晶振部分,也就是外部高速时钟(HSE),为了更高的时钟精度,就要用HSE做主时钟源,而不采用依靠内部RC振荡器的内部高速时钟(HSI),晶振部分电路设计详见原理图。

在这里插入图片描述
此外,电路板设计了一键程序复位电路,将C8T6芯片的NRST引脚引出,通过电路设计,完成程序复位按键的功能。

代码部分详细说明

在本次设计中,我们需要先明确设计的目的以及具体实现的效果。
首先是单片机主控芯片的选型。在市场上,STM有很多系列的芯片,我们应当根据不同的设计目的与实现难度选择合适的芯片型号,在这次设计中,我们选择了STM32F103C8T6型号芯片,这款芯片 是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。芯片内部具有64KB的Flash,20KB的SRAM,四个通用定时器,1个系统定时器,2个硬件IIC,3个串口等外设资源,可进行较为复杂的项目设计。

其次,按照需要实现的功能,进行芯片引脚分配,这是电路板设计前的重要一环。在本次设计中,MPU6050姿态传感器采用模拟IIC协议进行通信,选择芯片的PB8、PB9引脚,串口通信选择串口1的PA9、PA10引脚,同时从芯片上引出NRST程序复位引脚与SWIO、SWCLK下载引脚,分别用于设计复位按键与程序下载接口。


在完成电路板设计之后,需要进行程序设计,为了实现读取MPU6050姿态传感器的原始数据以及解算后的姿态角,并通过串口通信的方式输出到PC端,我们需要先编写传感器以外的服务函数。

串口通信相关程序,主要是打开GPIOA的时钟,配置PA9为复用推挽输出模式,配置PA10为浮空输入模式,因为没用到串口1的中断,所以可以不配置NVIC_InitStructure结构体。接下来就是对USART_InitStructure结构体的相关配置,主要是设置串口通信波特率115200,以及收发模式的选择,最后使能串口1。对于单片机向PC端传送数据,使用Printf();函数即可,也就是//重定义fputc函数。
接下来是编写模拟IIC通信协议,首先是对IIC接口进行初始化,即通过IIC_Init();函数实现,接下来就是通过PA8,PA9两个IO端口,控制高低电平的输出与输入,模拟IIC通信协议格式,编写相关函数,如IIC_Send_Byte()发送一个字节的函数,IIC_Read_Byte()读取一个字节的函数等等。这些IIC的函数将在MPU6050姿态传感器与单片机进行通信时使用到。

定时器相关程序的编写,在本次设计中使用C8T6的定时器2,通过设置arr与psc的值,计算得出定时中断周期为50ms,同时选择定时器2的中断源TIM2_IRQn,然后我们在定时器的中断服务程序中读取MPU6050姿态传感器的数据。

仅对MPU6050姿态传感器进行初始化,只能读取MPU6050姿态传感器的原始数据,可以使用MPU6050内部自带DMP模块进行姿态解算,解算出姿态角并输出。
最后在主函数中,进行串口初始化,系统延时初始化,软件模拟IIC引脚初始化,MPU6050姿态传感器初始化,DMP初始化,定时器二初始化。然后在PC端选择正确的COM口,设置波特率,打开串口,即可获得MPU6050的数据。

设计实现效果

在这里插入图片描述

MPU6050内部自带DMP解算姿态角

在这里插入图片描述

总结

使用MPU6050内部自带DMP解算姿态角。

如果需要源程序(移植方便),欢迎点赞+关注,评论区留下邮箱,我会第一时间回复。