OpenEdv-开源电子网

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

用STM32F103的模拟IIC去读取陀螺仪、加速度、角度的数据

[复制链接]

44

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2013-8-31
在线时间
14 小时
发表于 2020-9-1 21:20:08 | 显示全部楼层 |阅读模式
1 基本介绍
9轴姿态角度传感器广泛用于物联网开发,其中JY901陀螺仪由于自带卡尔曼动态滤波算法便作为了我硬件开发的选择。JY901陀螺仪基本可以在各个平台上进行数据的读取(如arduino、stm32、树莓派、上位机等)。刚好最近项目需要用到这个模块。我给大家整理下我是怎么操作的。先给大家看下模块。上图:





说实话这个模块挺小的。但是功能还是比较强大的。好了不多说了,不然以为我在打广告了。进入主题。

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

2.1硬件、软件准备

硬件:JY901模块、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、JY901与STM32F103C8T6使用杜邦线连接。具体接线如下图所示:

具体接线方式如下:





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

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





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

1 、串口初始化又分为时钟初始化、串口1初始化、IIC初始化。时钟初始化的作用意味着所有工作部件都出于同一的工作准备状态,这样,在以后的工作中才能步调一致。

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

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

3.2 main函数

程序的执行都是在这个函数里面进行的。它包括串口初始化和while主循环。其中这个SysTick_init函数就是时钟初始化。Initial_UART1函数是串口1初始化。IIC_Init函数是IIC初始化。IICreadBytes9()函数就是去读取JY901内部寄存器的函数。UART1_Put_String()是串口1发送到电脑端的函数。

[backcolor=inherit !important]int [backcolor=inherit !important]main[backcolor=inherit !important]([backcolor=inherit !important]void[backcolor=inherit !important])[backcolor=inherit !important]{    [backcolor=inherit !important]unsigned [backcolor=inherit !important]char chrTemp[backcolor=inherit !important][[backcolor=inherit !important]30[backcolor=inherit !important]][backcolor=inherit !important];        [backcolor=inherit !important]unsigned [backcolor=inherit !important]char str[backcolor=inherit !important][[backcolor=inherit !important]100[backcolor=inherit !important]][backcolor=inherit !important];        [backcolor=inherit !important]float a[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]][backcolor=inherit !important],Angle[backcolor=inherit !important][[backcolor=inherit !important]3[backcolor=inherit !important]][backcolor=inherit !important];                        [backcolor=inherit !important]USB_Config[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];                        [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]Initial_UART1[backcolor=inherit !important]([backcolor=inherit !important]115200[backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]IIC_Init[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];                [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]100[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]IICreadBytes[backcolor=inherit !important]([backcolor=inherit !important]0x50[backcolor=inherit !important], AX[backcolor=inherit !important], [backcolor=inherit !important]24[backcolor=inherit !important],&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                a[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                a[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                a[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]4[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]6[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]8[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]10[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]12[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]14[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]16[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]18[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]20[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]22[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];                                [backcolor=inherit !important]sprintf[backcolor=inherit !important]([backcolor=inherit !important]([backcolor=inherit !important]char*[backcolor=inherit !important])str[backcolor=inherit !important],[backcolor=inherit !important]"0x50:  a:%.3f %.3f %.3f w:%.3f %.3f %.3f  h:%.0f %.0f %.0f  Angle:%.3f %.3f %.3f \r\n"[backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],Angle[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]USB_TxWrite[backcolor=inherit !important](str[backcolor=inherit !important], [backcolor=inherit !important]strlen[backcolor=inherit !important]([backcolor=inherit !important]([backcolor=inherit !important]char*[backcolor=inherit !important])str[backcolor=inherit !important])[backcolor=inherit !important])[backcolor=inherit !important];                    [backcolor=inherit !important]}[backcolor=inherit !important]}
3.2 时钟初始化

时钟初始化的作用意味着所有工作部件都出于同一的工作准备状态,这样,在以后的工作中才能步调一致。

[backcolor=inherit !important]void [backcolor=inherit !important]SysTick_init[backcolor=inherit !important](u8 SYSCLK[backcolor=inherit !important],u16 nms[backcolor=inherit !important])[backcolor=inherit !important]{        NVIC_InitTypeDef NVIC_InitStructure[backcolor=inherit !important];        SysTick->VAL =[backcolor=inherit !important]0x00[backcolor=inherit !important];           [backcolor=inherit !important]//清空计数器        SysTick->LOAD = nms*SYSCLK*[backcolor=inherit !important]125[backcolor=inherit !important];[backcolor=inherit !important]//72MHz,最大1864ms        SysTick->CTRL=[backcolor=inherit !important]3[backcolor=inherit !important];[backcolor=inherit !important]//bit2清空,选择外部时钟  HCLK/8        fac_us=SYSCLK/[backcolor=inherit !important]8[backcolor=inherit !important];                            fac_ms=[backcolor=inherit !important](u16[backcolor=inherit !important])fac_us*[backcolor=inherit !important]1000[backcolor=inherit !important];        [backcolor=inherit !important]NVIC_PriorityGroupConfig[backcolor=inherit !important](NVIC_PriorityGroup_1[backcolor=inherit !important])[backcolor=inherit !important];    NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannel = SysTick_IRQn[backcolor=inherit !important];  NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelPreemptionPriority = [backcolor=inherit !important]3[backcolor=inherit !important];  NVIC_InitStructure[backcolor=inherit !important].NVIC_IRQChannelSubPriority = [backcolor=inherit !important]0[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 串口1初始化

初始化串口1。将相应的引脚配置成UART模式;配置和使能UART,包括配置波特率,是否使用FIF0,数据帧格式(数据长度,停止位,奇偶校验,收发数据缓冲区大小等);配置中断(一般分3大类,共7种);读写数据。

[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.4 IIC初始化

这个程序我使用的是模拟IIC,没有使用硬件IIC。因此我只需要对IO口进行初始化就行了。

最后的SDA_OUT()函数把SDA引脚设置输出。IIC_SDA=1;IIC_SCL=1;这两个的意思就是把IIC总线设置成高电平。

[backcolor=inherit !important]void [backcolor=inherit !important]IIC_Init[backcolor=inherit !important]([backcolor=inherit !important]void[backcolor=inherit !important])[backcolor=inherit !important]{                                GPIO_InitTypeDef GPIO_InitStructure[backcolor=inherit !important];         [backcolor=inherit !important]RCC_APB2PeriphClockCmd[backcolor=inherit !important](RCC_APB2Periph_GPIOB[backcolor=inherit !important], ENABLE[backcolor=inherit !important])[backcolor=inherit !important];                                      [backcolor=inherit !important]//配置PB6 PB7 为开漏输出  刷新频率为10Mhz         GPIO_InitStructure[backcolor=inherit !important].GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11[backcolor=inherit !important];                GPIO_InitStructure[backcolor=inherit !important].GPIO_Mode = GPIO_Mode_Out_PP[backcolor=inherit !important];               GPIO_InitStructure[backcolor=inherit !important].GPIO_Speed = GPIO_Speed_50MHz[backcolor=inherit !important];        [backcolor=inherit !important]//应用配置到GPIOB         [backcolor=inherit !important]GPIO_Init[backcolor=inherit !important](GPIOB[backcolor=inherit !important], &GPIO_InitStructure[backcolor=inherit !important])[backcolor=inherit !important];                [backcolor=inherit !important]SDA_OUT[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];     [backcolor=inherit !important]//sda线输出        IIC_SDA=[backcolor=inherit !important]1[backcolor=inherit !important];                            IIC_SCL=[backcolor=inherit !important]1[backcolor=inherit !important];[backcolor=inherit !important]}
3.5 IICreadBytes读取函数

IICreadBytes函数的程序运行流程是这样的。IIC_Start(),这个是IIC开始信号。IIC_Send_Byte()往JY901发送设备的ID。IIC_Wait_Ack(),等待JY901应答。IIC_Send_Byte(),这个函数就是往JY901发送你要读的寄存器地址,继续等待应答。然后又重新开始,根据JY901的IIC协议发送设备地址IIC_Send_Byte9(dev<<1)+1),现在进入了接受JY901的返回的数据的模式。最后等待应答就可以了。接着就是一个For循环。把读取到的数据放在data里。循环结束了后。IIC就停止了。最后返回 count。

u8 [backcolor=inherit !important]IICreadBytes[backcolor=inherit !important](u8 dev[backcolor=inherit !important], u8 reg[backcolor=inherit !important], u8 length[backcolor=inherit !important], u8 *data[backcolor=inherit !important])[backcolor=inherit !important]{    u8 count = [backcolor=inherit !important]0[backcolor=inherit !important];                [backcolor=inherit !important]IIC_Start[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]IIC_Send_Byte[backcolor=inherit !important](dev<<[backcolor=inherit !important]1[backcolor=inherit !important])[backcolor=inherit !important];           [backcolor=inherit !important]//发送写命令        [backcolor=inherit !important]IIC_Wait_Ack[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]IIC_Send_Byte[backcolor=inherit !important](reg[backcolor=inherit !important])[backcolor=inherit !important];   [backcolor=inherit !important]//发送地址  [backcolor=inherit !important]IIC_Wait_Ack[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];                  [backcolor=inherit !important]IIC_Start[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];        [backcolor=inherit !important]IIC_Send_Byte[backcolor=inherit !important]([backcolor=inherit !important](dev<<[backcolor=inherit !important]1[backcolor=inherit !important])+[backcolor=inherit !important]1[backcolor=inherit !important])[backcolor=inherit !important];  [backcolor=inherit !important]//进入接收模式                [backcolor=inherit !important]IIC_Wait_Ack[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];            [backcolor=inherit !important]for[backcolor=inherit !important](count=[backcolor=inherit !important]0[backcolor=inherit !important];count<length[backcolor=inherit !important];count++[backcolor=inherit !important])[backcolor=inherit !important]{                                  [backcolor=inherit !important]if[backcolor=inherit !important](count!=length-[backcolor=inherit !important]1[backcolor=inherit !important])data[backcolor=inherit !important][count[backcolor=inherit !important]]=[backcolor=inherit !important]IIC_Read_Byte[backcolor=inherit !important]([backcolor=inherit !important]1[backcolor=inherit !important])[backcolor=inherit !important];  [backcolor=inherit !important]//带ACK的读数据                         [backcolor=inherit !important]else  data[backcolor=inherit !important][count[backcolor=inherit !important]]=[backcolor=inherit !important]IIC_Read_Byte[backcolor=inherit !important]([backcolor=inherit !important]0[backcolor=inherit !important])[backcolor=inherit !important];         [backcolor=inherit !important]//最后一个字节NACK        [backcolor=inherit !important]}    [backcolor=inherit !important]IIC_Stop[backcolor=inherit !important]([backcolor=inherit !important])[backcolor=inherit !important];[backcolor=inherit !important]//产生一个停止条件    [backcolor=inherit !important]return count[backcolor=inherit !important];[backcolor=inherit !important]}
3.6 数据缓存区

数据缓存区就是在main函数里面定义的一个数组chrTemp[30]。它是把上面的IICreadBytes

读取得到的data的数据放在了这个数组当中的。

3.7 数据解析

数据解析部分。这个主要是根据商家给的协议,把从寄存器获取到的值。去进行处理的。以读出模块的角度数据为例,RedAddr 为 0x3d、0x3e、0x3f,连续读取 6 个字节,逻 辑分析仪捕获的波形如下图所示:





从 0x3d 开始读取出来的数据依次为 0x9C,0x82,0x28,0xFF,0xE6,0x24。也就是说 X 轴的角度 为 0x829C,Y 轴的角度为 0xFF28,Z 轴的角度为 0x24E6。按照 商家公式(如下图)可以求出转化出来的角度为:X 轴角度-176.33°,Y 轴角度为-1.19°,Z 轴角度为 51.89°。





                a[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                a[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                a[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]4[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]16[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]6[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]8[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                w[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]10[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]2000[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]12[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]14[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                h[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]16[backcolor=inherit !important]][backcolor=inherit !important])[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]18[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]20[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];                Angle[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]] = [backcolor=inherit !important]([backcolor=inherit !important]float[backcolor=inherit !important])[backcolor=inherit !important]CharToShort[backcolor=inherit !important](&chrTemp[backcolor=inherit !important][[backcolor=inherit !important]22[backcolor=inherit !important]][backcolor=inherit !important])/[backcolor=inherit !important]32768*[backcolor=inherit !important]180[backcolor=inherit !important];
3.8 数据输出

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

[backcolor=inherit !important]sprintf[backcolor=inherit !important]([backcolor=inherit !important]([backcolor=inherit !important]char*[backcolor=inherit !important])str[backcolor=inherit !important],[backcolor=inherit !important]"0x50:  a:%.3f %.3f %.3f w:%.3f %.3f %.3f  h:%.0f %.0f %.0f  Angle:%.3f %.3f %.3f \r\n"[backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],a[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],w[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],h[backcolor=inherit !important][[backcolor=inherit !important]2[backcolor=inherit !important]][backcolor=inherit !important],Angle[backcolor=inherit !important][[backcolor=inherit !important]0[backcolor=inherit !important]][backcolor=inherit !important],Angle[backcolor=inherit !important][[backcolor=inherit !important]1[backcolor=inherit !important]][backcolor=inherit !important],Angle[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];               
发送的函数就很简单了。就是一个UART1_Put_String打印函数。把解析的结果直接从串口1打印出来到PC端。

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







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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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