stm32读取维特陀螺仪jy61p角度

📅 2026/7/6 21:00:23 👁️ 阅读次数 📝 编程学习
stm32读取维特陀螺仪jy61p角度

文章目录

  • 如何用串口读取维特陀螺仪jy61p的数据?
    • 一、摘要
    • 二、c语言数据类型
      • 1、stdint关键字的含义
      • 2、数据范围是一个首尾相接的环形
      • 3、程序员计算器介绍
      • 4、数据类型强制转换
    • 三、WIT私有协议
      • 1.寻找数据包
      • 2.解读数据包
      • 3.解读数据包的坑
    • 四、代码解析与实操
      • 1、陀螺仪上位机配置
      • 2、stm32串口初始化
      • 3、接收数据包进行数据处理
      • 4、OLED显示
      • 5、效果展示
    • 五、源码链接

如何用串口读取维特陀螺仪jy61p的数据?

一、摘要

经常做小车的朋友一定知道,采用mpu6050的DMP姿态解算Yaw轴的零点漂移非常严重,为此有两种解决方法,一种是写一个强大的滤波算法(如卡尔曼滤波),另一种是直接换一个更diao的陀螺仪。本人采用第二种方法,使用维特智能科技的陀螺仪jy61p,效果很好,就是有点小贵。该陀螺仪采用串口通信,也不会像IIC那样经常发癫。由于官方给的例程功能太过强大,移植比较麻烦,所以我查阅资料写了个易移植的代码。采用串口接收数据包的方法读取陀螺仪数据,主要有两件事:串口接收数据包和数据类型的转换。

二、c语言数据类型

以下是C语言的数据类型,陀螺仪的原始数据为16位并且拆成高字节和低字节,也就是uint8_t,我们需要把他转化成int16_t或uint16_t才能合并,正常使用进行计算。具体操作在后面讲,这里需要先了解一下c语言数据类型的转换应该避的一些坑。

1、stdint关键字的含义

打开stdint.h可以看到如下定义:

/* exact-width signed integer types */typedefsignedcharint8_t;typedefsignedshortintint16_t;typedefsignedintint32_t;typedefsigned__INT64int64_t;/* exact-width unsigned integer types */typedefunsignedcharuint8_t;typedefunsignedshortintuint16_t;typedefunsignedintuint32_t;typedefunsigned__INT64uint64_t;

可以看出stdint关键字基本都是(u)intx_t的形式,x为位数,这个数是怎么来的呢?比如说uint8_t,用二进制表示八位数,每位只能是0或1,进行排列组合共有28种情况,正好就是256,所以最多表示256个数,如果有符号(即int8_t)那就需要首位表示符号,剩余7位表示数的大小,27也就是256除以2就是128,所以可以表示范围-128~127。

2、数据范围是一个首尾相接的环形

比如说short类型(int16_t)表示的范围是-32768~+32767,但是当计数到32767后再加一结果是-32768

如图:

可以在c语言环境下运行如下代码:

#include<stdio.h>#include<stdint.h>intmain(void){int16_ta=32768;printf("a=%d\n",a);return0;}

可以看到运行结果是-32768:

usigned short类型(uint16_t)表示的范围是0~65535,当计数到65535后再加一后会变成0

如图:

#include<stdio.h>#include<stdint.h>intmain(void){uint16_ta=65536;printf("a=%d\n",a);return0;}

结果为0:

3、程序员计算器介绍

打开电脑计算器,切换到程序员模式:

HEX: 十六进制 Hexadecimal
DEC :十进制 Decimal
OCT :八进制 Octal
BIN :二进制 Binary

MC(Memory Clear):清除存储器中的数值。
MR(Memory Read):将存于存储器中的数显示在计算器的显示框上。
MS(Memory Storage):将显示框的数值存于存储器中。如果存储器中有数值将会显示M标志。
M+:将显示框的数与存储器中的数相加并进行存储。

BIT(位): 是计算机内部数据储存的最小单位
BYTE(字节): 八个比特 (bit) 称为一个字节,是计算机中数据处理的最基本的单位
WORD(字): 两个字节称为一个字, 即16位
DWORD:(双字) 两个字称为一个双字,两个Word,为32位 D为double
QWORD(四字): 两个双字称为一个四字,四个Word,为64位 Q为 quadra

4、数据类型强制转换

将int16_t强制转换为uint16_t,运行如下代码:

#include<stdio.h>#include<stdint.h>intmain(void){int16_ta=-50;printf("a=%d\n",a);uint16_tb;b=(uint16_t)a;