OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3118|回复: 2

用STM32F103读取MPU6050陀螺仪、加速度、角度的数据

[复制链接]

44

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2013-8-31
在线时间
14 小时
发表于 2020-8-29 08:40:33 | 显示全部楼层 |阅读模式
1 介绍
     大家从标题中来看呢,大家可能会有些困惑,MPU6050只输出加速度、陀螺仪。没有角度。这个也是我今天想和大家说的。最近我做了一个倾角项目。老板基于成本考虑希望我能用MPU6050去算出来角度。说实话自己没接触这个东西,去搞的时候才知道挺难的,很地方看不懂。然后我去看过了正电原子的MPU6050的解算。但是那个角度的结果和我想要精度有点差别。无意中呢在淘宝上搜到了一个维特智能的JY61模块。这个模块的内置的就是MPU6050模块。这个商家说它的静态角度的精度为0.05度、动态0.1度。这个精度是很符合我的需求。给大家看下这个模块





这个模块体积很小巧就15×15×2mm大小。串口通讯用单片机去获取数据很简单,相比起直接去获取MPU6050简单不知道多少倍了。下面和大家说说我是怎么去用STM32F103读取JY61陀螺仪、加速度、角度的数据。

2 开发准备
讲程序之前呢,和大家简单的说说一些硬件、软件准备和JY61怎么和STM32F103接线的。

2.1硬件、软件准备

硬件:JY61模块、USB-TTL、STM32F103开发板、杜邦线。STM32F103的开发板呢,我用的也是维特智能32开发板做测试用。给大家上个图:





软件 :https://pan.baidu.com/s/1SEWmixu4jtUL2HH_3Hcn2g    提取码:zryo

这个是我的写的一个 示例代码大家有兴趣的可以看下:https://pan.baidu.com/s/1sXnlT89FTTs5tONLiaPihw

2.2 接线方式

1、使用USB-TTL将STM32F103C8T6与电脑连接通信

2、JY61与STM32F103C8T6使用杜邦线连接。具体接线如下图所示:

具体接线方式如下:





3 程序讲解
3.1程序思路讲解

好了到大家最关心的地方了。在这里呢。我先和大家说下。我的整体思路是什么。以一个整体框架给大家做一个说明





从上面来看呢,一共就分为主要的两个部分。串口初始化和while主循环。

1 、串口初始化又分为串口1初始化、串口2初始化。其中串口2初始化又多了一个串口2中断服务函数,这个函数用来接收JY61的传过来的数据,然后放在数据缓存区。

2、while主循环包括数据解析和数据输出。数据解析负责把从串口2中断服务函数得到的数据进行数据的一个处理。然后从串口1把数据输出到PC端。

下面分别和大家说下中间的一些重要的函数。

3.1 main函数

程序的执行都是在这个函数里面进行的。它包括串口初始化和while主循环。其中这个Initial_UART1函数就是串口1初始化。Initial_UART2是串口2初始化.

[backcolor=inherit !important]int [backcolor=inherit !important]main[backcolor=inherit !important]([backcolor=inherit !important]void[backcolor=inherit !important])[backcolor=inherit !important]{          [backcolor=inherit !important]char str[backcolor=inherit !important][[backcolor=inherit !important]100[backcolor=inherit !important]][backcolor=inherit !important];        [backcolor=inherit !important]unsigned [backcolor=inherit !important]char len[backcolor=inherit !important],i[backcolor=inherit !important];                        [backcolor=inherit !important]USB_Config[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//配置USB-HID        [backcolor=inherit !important]SysTick_init[backcolor=inherit !important]([backcolor=inherit !important]72[backcolor=inherit !important],[backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//设置时钟频率        [backcolor=inherit !important]Initial_UART1[backcolor=inherit !important]([backcolor=inherit !important]9600[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//接PC的串口        [backcolor=inherit !important]Initial_UART2[backcolor=inherit !important]([backcolor=inherit !important]9600[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//接JY-901模块的串口                        [backcolor=inherit !important]LED_ON[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]1000[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//等等JY-91初始化完成        [backcolor=inherit !important]while[backcolor=inherit !important]([backcolor=inherit !important]1[backcolor=inherit !important])        [backcolor=inherit !important]{                                                [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]500[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出时间                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Time:20%d-%d-%d %d:%d:%.3f\r\n"[backcolor=inherit !important],stcTime[backcolor=inherit !important].ucYear[backcolor=inherit !important],stcTime[backcolor=inherit !important].ucMonth[backcolor=inherit !important],stcTime[backcolor=inherit !important].ucDay[backcolor=inherit !important],stcTime[backcolor=inherit !important].ucHour[backcolor=inherit !important],stcTime[backcolor=inherit !important].ucMinute[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcTime[backcolor=inherit !important].ucSecond+[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcTime[backcolor=inherit !important].usMiliSecond/[backcolor=inherit !important]1000[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出加速度                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Acc:%.3f %.3f %.3f\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAcc[backcolor=inherit !important].a[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAcc[backcolor=inherit !important].a[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAcc[backcolor=inherit !important].a[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出角速度                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Gyro:%.3f %.3f %.3f\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGyro[backcolor=inherit !important].w[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGyro[backcolor=inherit !important].w[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGyro[backcolor=inherit !important].w[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出角度                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Angle:%.3f %.3f %.3f\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出磁场                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Mag:%d %d %d\r\n"[backcolor=inherit !important],stcMag[backcolor=inherit !important].h[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],stcMag[backcolor=inherit !important].h[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],stcMag[backcolor=inherit !important].h[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出气压、高度                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Pressure:%ld Height%.2f\r\n"[backcolor=inherit !important],stcPress[backcolor=inherit !important].lPressure[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcPress[backcolor=inherit !important].lAltitude/[backcolor=inherit !important]100[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                         [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出端口状态                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"DStatus:%d %d %d %d\r\n"[backcolor=inherit !important],stcDStatus[backcolor=inherit !important].sDStatus[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],stcDStatus[backcolor=inherit !important].sDStatus[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],stcDStatus[backcolor=inherit !important].sDStatus[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],stcDStatus[backcolor=inherit !important].sDStatus[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出经纬度                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n"[backcolor=inherit !important],stcLonLat[backcolor=inherit !important].lLon/[backcolor=inherit !important]10000000[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]double[backcolor=inherit !important])[backcolor=inherit !important](stcLonLat[backcolor=inherit !important].lLon % [backcolor=inherit !important]10000000[backcolor=inherit !important])/[backcolor=inherit !important]1e5[backcolor=inherit !important],stcLonLat[backcolor=inherit !important].lLat/[backcolor=inherit !important]10000000[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]double[backcolor=inherit !important])[backcolor=inherit !important](stcLonLat[backcolor=inherit !important].lLat % [backcolor=inherit !important]10000000[backcolor=inherit !important])/[backcolor=inherit !important]1e5[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出地速                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGPSV[backcolor=inherit !important].sGPSHeight/[backcolor=inherit !important]10[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGPSV[backcolor=inherit !important].sGPSYaw/[backcolor=inherit !important]10[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcGPSV[backcolor=inherit !important].lGPSVelocity/[backcolor=inherit !important]1000[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]//输出四元素                [backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Four elements:%.5f %.5f %.5f %.5f\r\n\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcQ[backcolor=inherit !important].q[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcQ[backcolor=inherit !important].q[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcQ[backcolor=inherit !important].q[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcQ[backcolor=inherit !important].q[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]]/[backcolor=inherit !important]32768[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                    [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//等待传输完成        [backcolor=inherit !important]}[backcolor=inherit !important]//主循环[backcolor=inherit !important]}
3.1 串口1初始化

串口1初始化就是对串口1进行使能。打开UART1_Put_String函数。通过这个函数把结果输出到PC端的。

[backcolor=inherit !important]void [backcolor=inherit !important]Initial_UART1[backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]long baudrate[backcolor=inherit !important])[backcolor=inherit !important]{         GPIO_InitTypeDef GPIO_InitStructure[backcolor=inherit !important];        USART_InitTypeDef USART_InitStructure[backcolor=inherit !important];        NVIC_InitTypeDef NVIC_InitStructure[backcolor=inherit !important];         [backcolor=inherit !important]RCC_APB2PeriphClockCmd[backcolor=inherit !important](RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Pin = GPIO_Pin_9[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Mode = GPIO_Mode_AF_PP[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Speed = GPIO_Speed_50MHz[backcolor=inherit !important];        [backcolor=inherit !important]GPIO_Init[backcolor=inherit !important](GPIOA[backcolor=inherit !important], &GPIO_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];            GPIO_InitStructure[backcolor=inherit !important].GPIO_Pin = GPIO_Pin_10[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Mode = GPIO_Mode_IN_FLOATING[backcolor=inherit !important];        [backcolor=inherit !important]GPIO_Init[backcolor=inherit !important](GPIOA[backcolor=inherit !important], &GPIO_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];                  USART_InitStructure[backcolor=inherit !important].USART_BaudRate = baudrate[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_WordLength = USART_WordLength_8b[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_StopBits = USART_StopBits_1[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_Parity = USART_Parity_No [backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_HardwareFlowControl = USART_HardwareFlowControl_None[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_Mode = USART_Mode_Rx | USART_Mode_Tx[backcolor=inherit !important];        [backcolor=inherit !important]USART_Init[backcolor=inherit !important](USART1[backcolor=inherit !important], &USART_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];         [backcolor=inherit !important]USART_ITConfig[backcolor=inherit !important](USART1[backcolor=inherit !important], USART_IT_TXE[backcolor=inherit !important], DISABLE[backcolor=inherit !important])[backcolor=inherit !important];          [backcolor=inherit !important]USART_ITConfig[backcolor=inherit !important](USART1[backcolor=inherit !important], USART_IT_RXNE[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]USART_ClearFlag[backcolor=inherit !important](USART1[backcolor=inherit !important],USART_FLAG_TC[backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]USART_Cmd[backcolor=inherit !important](USART1[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannel = USART1_IRQn[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelPreemptionPriority = [backcolor=inherit !important]1[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelSubPriority = [backcolor=inherit !important]7[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelCmd = ENABLE[backcolor=inherit !important];        [backcolor=inherit !important]NVIC_Init[backcolor=inherit !important](&NVIC_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]}
3.2 串口2初始化

串口2初始化两个作用,第一打开串口2这个通道。第二就是打开串口2的中断服务函数。

[backcolor=inherit !important]void [backcolor=inherit !important]Initial_UART2[backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]long baudrate[backcolor=inherit !important])[backcolor=inherit !important]{         GPIO_InitTypeDef GPIO_InitStructure[backcolor=inherit !important];        USART_InitTypeDef USART_InitStructure[backcolor=inherit !important];        NVIC_InitTypeDef NVIC_InitStructure[backcolor=inherit !important];         [backcolor=inherit !important]RCC_APB1PeriphClockCmd[backcolor=inherit !important](RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Pin = GPIO_Pin_2[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Mode = GPIO_Mode_AF_PP[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Speed = GPIO_Speed_50MHz[backcolor=inherit !important];        [backcolor=inherit !important]GPIO_Init[backcolor=inherit !important](GPIOA[backcolor=inherit !important], &GPIO_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];            GPIO_InitStructure[backcolor=inherit !important].GPIO_Pin = GPIO_Pin_3[backcolor=inherit !important];        GPIO_InitStructure[backcolor=inherit !important].GPIO_Mode = GPIO_Mode_IN_FLOATING[backcolor=inherit !important];        [backcolor=inherit !important]GPIO_Init[backcolor=inherit !important](GPIOA[backcolor=inherit !important], &GPIO_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];                 USART_InitStructure[backcolor=inherit !important].USART_BaudRate = baudrate[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_WordLength = USART_WordLength_8b[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_StopBits = USART_StopBits_1[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_Parity = USART_Parity_No [backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_HardwareFlowControl = USART_HardwareFlowControl_None[backcolor=inherit !important];        USART_InitStructure[backcolor=inherit !important].USART_Mode = USART_Mode_Rx | USART_Mode_Tx[backcolor=inherit !important];        [backcolor=inherit !important]USART_Init[backcolor=inherit !important](USART2[backcolor=inherit !important], &USART_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];         [backcolor=inherit !important]USART_ITConfig[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_TXE[backcolor=inherit !important], DISABLE[backcolor=inherit !important])[backcolor=inherit !important];            [backcolor=inherit !important]USART_ITConfig[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_RXNE[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]USART_ClearFlag[backcolor=inherit !important](USART2[backcolor=inherit !important],USART_FLAG_TC[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]USART_Cmd[backcolor=inherit !important](USART2[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannel = USART2_IRQn[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelPreemptionPriority = [backcolor=inherit !important]1[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelSubPriority = [backcolor=inherit !important]8[backcolor=inherit !important];        NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelCmd = ENABLE[backcolor=inherit !important];        [backcolor=inherit !important]NVIC_Init[backcolor=inherit !important](&NVIC_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]}
3.3 串口2中断服务函数

这个函数的功能就是不停的把JY61的数据放到数据缓存区,就是往这个CopeSerial2Data函数发数据。

[backcolor=inherit !important]void [backcolor=inherit !important]USART2_IRQHandler[backcolor=inherit !important]([backcolor=inherit !important]void[backcolor=inherit !important])[backcolor=inherit !important]{  [backcolor=inherit !important]if[backcolor=inherit !important]([backcolor=inherit !important]USART_GetITStatus[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_TXE[backcolor=inherit !important]) != RESET[backcolor=inherit !important])  [backcolor=inherit !important]{       [backcolor=inherit !important]USART_SendData[backcolor=inherit !important](USART2[backcolor=inherit !important], TxBuffer[backcolor=inherit !important][TxCounter++[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];     [backcolor=inherit !important]USART_ClearITPendingBit[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_TXE[backcolor=inherit !important])[backcolor=inherit !important];    [backcolor=inherit !important]if[backcolor=inherit !important](TxCounter == count[backcolor=inherit !important]) [backcolor=inherit !important]USART_ITConfig[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_TXE[backcolor=inherit !important], DISABLE[backcolor=inherit !important])[backcolor=inherit !important];  [backcolor=inherit !important]}        [backcolor=inherit !important]else [backcolor=inherit !important]if[backcolor=inherit !important]([backcolor=inherit !important]USART_GetITStatus[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_RXNE[backcolor=inherit !important]) != RESET[backcolor=inherit !important])  [backcolor=inherit !important]{                [backcolor=inherit !important]CopeSerial2Data[backcolor=inherit !important]([backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]char[backcolor=inherit !important])USART2->DR[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//处理数据                [backcolor=inherit !important]USART_ClearITPendingBit[backcolor=inherit !important](USART2[backcolor=inherit !important], USART_IT_RXNE[backcolor=inherit !important])[backcolor=inherit !important];  [backcolor=inherit !important]}                [backcolor=inherit !important]USART_ClearITPendingBit[backcolor=inherit !important](USART2[backcolor=inherit !important],USART_IT_ORE[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]}
3.4 数据缓存区

数据缓存区是从串口2中断服务函数过来的。把数据最终放在stcAcc、stcGyro、stcAngle这些结构体里等待数据解析来处理。

[backcolor=inherit !important]void [backcolor=inherit !important]CopeSerial2Data[backcolor=inherit !important]([backcolor=inherit !important]unsigned [backcolor=inherit !important]char ucData[backcolor=inherit !important])[backcolor=inherit !important]{        [backcolor=inherit !important]static [backcolor=inherit !important]unsigned [backcolor=inherit !important]char ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]250[backcolor=inherit !important]][backcolor=inherit !important];        [backcolor=inherit !important]static [backcolor=inherit !important]unsigned [backcolor=inherit !important]char ucRxCnt = [backcolor=inherit !important]0[backcolor=inherit !important];                        [backcolor=inherit !important]LED_REVERSE[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];                                        [backcolor=inherit !important]//接收到数据,LED灯闪烁一下        ucRxBuffer[backcolor=inherit !important][ucRxCnt++[backcolor=inherit !important]]=ucData[backcolor=inherit !important];        [backcolor=inherit !important]//将收到的数据存入缓冲区中        [backcolor=inherit !important]if [backcolor=inherit !important](ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]!=[backcolor=inherit !important]0x55[backcolor=inherit !important]) [backcolor=inherit !important]//数据头不对,则重新开始寻找0x55数据头        [backcolor=inherit !important]{                ucRxCnt=[backcolor=inherit !important]0[backcolor=inherit !important];                [backcolor=inherit !important]return[backcolor=inherit !important];        [backcolor=inherit !important]}        [backcolor=inherit !important]if [backcolor=inherit !important](ucRxCnt<[backcolor=inherit !important]11[backcolor=inherit !important]) [backcolor=inherit !important]{[backcolor=inherit !important]return[backcolor=inherit !important];[backcolor=inherit !important]}[backcolor=inherit !important]//数据不满11个,则返回        [backcolor=inherit !important]else        [backcolor=inherit !important]{                [backcolor=inherit !important]switch[backcolor=inherit !important](ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important]//判断数据是哪种数据,然后将其拷贝到对应的结构体中,有些数据包需要通过上位机打开对应的输出后,才能接收到这个数据包的数据                [backcolor=inherit !important]{                        [backcolor=inherit !important]//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。                        [backcolor=inherit !important]case [backcolor=inherit !important]0x51:        [backcolor=inherit !important]memcpy[backcolor=inherit !important](&stcAcc[backcolor=inherit !important],&ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],[backcolor=inherit !important]8[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]break[backcolor=inherit !important];                        [backcolor=inherit !important]case [backcolor=inherit !important]0x52:        [backcolor=inherit !important]memcpy[backcolor=inherit !important](&stcGyro[backcolor=inherit !important],&ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],[backcolor=inherit !important]8[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]break[backcolor=inherit !important];                        [backcolor=inherit !important]case [backcolor=inherit !important]0x53:        [backcolor=inherit !important]memcpy[backcolor=inherit !important](&stcAngle[backcolor=inherit !important],&ucRxBuffer[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],[backcolor=inherit !important]8[backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]break[backcolor=inherit !important];                [backcolor=inherit !important]}                ucRxCnt=[backcolor=inherit !important]0[backcolor=inherit !important];[backcolor=inherit !important]//清空缓存区        [backcolor=inherit !important]}[backcolor=inherit !important]}
3.5 数据解析

从数据缓存区过来的数据,根据商家的协议都是16进制的数据。因此,我还需要进一步的把数据进行处理把16进制的数据处理成10进制的数据方便阅读。怎么处理呢?还是根据商家的协议去处理的。我们就以角度为例。商家协议在下图:





从上图看呢。角度输出的格式呢应该是55 53 RollL RollH PitchL PitchH YawL YawH TL TH SUM。这个格式就是放在数据缓存区的格式。怎么把数据缓存区的16进制转换成10进制呢?这个还要根据商家给的公式(如下图所示)。





写成程序就是下面这样的。

[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important])
3.6 数据输出

数据输出相比较前面的就比较简单了。它的原理就是把上面解析好的数据直接通过一个函数就发出来了。

[backcolor=inherit !important]sprintf[backcolor=inherit !important](str[backcolor=inherit !important],[backcolor=inherit !important]"Angle:%.3f %.3f %.3f\r\n"[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important],[backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])stcAngle[backcolor=inherit !important].Angle[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]]/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]UART1_Put_String[backcolor=inherit !important](str[backcolor=inherit !important])[backcolor=inherit !important];                        [backcolor=inherit !important]delay_ms[backcolor=inherit !important]([backcolor=inherit !important]10[backcolor=inherit !important])[backcolor=inherit !important];
发送的函数就很简单了。就是一个UART1_Put_String打印函数。把解析的结果直接从串口1打印出来到PC端。

4输出结果显示
在电脑上正确连接好板子,首先打开串口调试助手,找到相应的端口,然后打开串口,注意这里波特率设置为9600,然后就可以观察到左边的窗口有数据输出了。如图所示:









正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-8-29 11:18:06 | 显示全部楼层
内容不错,就是代码排版出来很乱,可以改下排版。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-7-22
在线时间
4 小时
发表于 2020-8-29 14:28:18 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表