外设驱动库开发笔记45:MS4515DO压力传感器驱动

2023-05-16

  很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器。这一篇我们就来讨论MS4515DO压力传感器的数据获取。

1、功能概述

  MS4515DO是TE公司推出的一款基于PCB安装的小型陶瓷基压力传感器。该传感器采用最新的CMOS传感器调节电路,制造出一种低成本、高性能的数字输出压力(14bit)和温度(11bit)传感器,以满足OEM客户最严格的要求。
  MS4515DO完全校准和温度补偿,总误差带在补偿范围内小于1.0%。该传感器采用直流3.3V或5.0V单电源供电模式,对外接口采用I2C总线或三线SPI的模式。其结构图如下:

  MS4515DO和MS4525DO拥有相同的功能和模式,区别只在于输出的物理量单位不同而已。它们都拥有可以检测差压和绝压的型号,但操作是完全一样的,所以本篇的讨论事实上适用于相关系列的全部型号的应用。

1.1、MS4515DO的I2C地址

  作为I2C接口的设备都会有一个设备地址,MS4515DO压力传感器也不例外。而MS4515DO和MS4525DO系列传感器的I2C地址在出厂时已特定写入,并根据型号中的字母来指示其地址设定。具体如下:

  预设的设备地址是7位的,不包含读写位的指示。我们使用时需要将其左移一位并根据读写操作来定义读写位,0为写,1为读。

1.2、数据输出格式

  在I2C通讯模式下,MS4515DO和MS4525DO传感器有四个I2C读取命令,分别为:Read_MR、Read_DF2、Read_DF3和Read_DF4。这四个命令可以获取不同的数据,这些命令的具体报文格式定义如下图:

  所以我们想要获取MS4515DO和MS4525DO传感器的数据就需要通过上述命令来实现。从上述的命令报文格式可以看出,这些命令在本质上是没有差别的,都多少数据完全由主机来控制,也就是我们开发的驱动程序来控制。事实上,我们只需要考虑Read_DF4这个命令就可以涵盖所有想要的数据。
  我们需要注意的是,上述的报文中有两位存储的是状态信息,该状态信息表示获取的数据是最新的数据还是旧数据或者错误报警。通过判断这个数据可以决定我们在数据解析时如何处理相应的报文。

2、驱动设计与实现

  我们已经了解了MS4515DO和MS4525DO传感器的结构、接口方式、设备地址以及数据输出格式。接下来我们就可以考虑如何实现MS4515DO和MS4525DO传感器的驱动程序了。

2.1、对象定义

  我们依然还是先来考虑MS4515DO和MS4525DO传感器的对象定义。我们定义一个对象无非考虑属性和操作两个部分。
  首先我们来考虑MS4515DO和MS4525DO传感器对象的属性。首先MS4515DO和MS4525DO传感器采用I2C接口通讯,所以每台都有一个设备地址。这个地址标识了I2C总线上该设备的唯一性,所以我们将设备地址作为MS4515DO和MS4525DO传感器对象的一个属性。对于MS4515DO和MS4525DO传感器来说存在多种类型,而不同的类型对应不同的数据计算方式,所以针对某一具体实例,我们需要记录它的类型,所以我们为其定义一个类型属性。我们在计算压力值时,不同的量程最后得到的压力值与测量量程有关,所以我们还需要记录实例的量程上下限,所以将这两个数据也定义为对象的属性。为了操作方便我们将最终得到的温度和压力数据也都作为对象的属性。
  从前面的描述中,我们知道MS4515DO和MS4525DO传感器的数据输出格式是固定的,这为我们解析这一数据提供了思路。我们将读出的4个字节与我们想要得到的数据组成联合体,利用结构体和联合体在内存中的关系可以方便的解析数据对象,如下图所示:

  这些个数据即是我们想要的先要得到的,同时他们也记录了MS4515DO和MS4525DO传感器对象当前的状态,所以我们将其也作为对象的属性。
  其次我们来考虑MS4515DO和MS4525DO传感器对象的操作。我们需要将对象的哪些行为定义为操作呢?一般的我们考虑那些不能直接实现,而是要依赖特定的软硬件平台才能实现的对象行为。我们需要向MS4515DO和MS4525DO传感器发送命令,也需要从传感器获取对象,而无论读还是写都是依赖于具体的软硬件平台才能去定的,所以我们将向传感器写信息和从传感器读信息作为对象的2个操作。为了控制时序,我们一般需要演示处理函数,而演示处理函数的实现也是依赖于具体的软硬件平台的,所以我们将延时函数定义为对象的一个操作。
  我们分析了MS4515DO和MS4525DO传感器对象可能的属性和操作。根据前述的分析,我们可以定义MS4515DO和MS4525DO传感器对象的类型如下:

/* 定义MS45x5DO对象类型 */
typedef struct MS45x5DOObject {
    uint8_t devAddress;   //设备地址
    union {
        struct {
            uint16_t pressure:14;
            uint16_t status:2;
            uint16_t insignificance:5;
            uint16_t temperature:11;            
        }pData;
        uint8_t rData[4];
    }msData;            //读出的数值
    MS45x5DOType type;  //MS4515DO的类型
    float pUpperRange;  //压力量程上限
    float pLowerRange;  //压力量程下限
    float fTemperature; //计算的温度值
    float fPressure;    //计算的压力值
    void (*Write)(struct MS45x5DOObject *ms,uint8_t *wData,uint16_t wSize); //向MS45x5DO写数据
    void (*Read)(struct MS45x5DOObject *ms,uint8_t *rData,uint16_t rSize);  //从MS45x5DO读数据
    void (*Delayms)(volatile uint32_t nTime);     //毫秒秒延时函数
}MS45x5DOObjectType;

  我们定义了MS4515DO和MS4525DO传感器对象的类型,使用该类型我们可以定义我们想要的对象变量,但对象变量需要进行必要的配置才能真正的实例化,这个过程我们将其称之为对象的初始化。

/* 初始化MS45x5DO对象 */
void MS45x5DOInitialization(MS45x5DOObjectType *ms, //MS5837对象
                            uint8_t devAddress,     //设备地址
                            MS45x5DOType type,      //MS4515DO的类型
                            float pMax,             //压力量程上限
                            float pMin,             //压力量程下限
                            MS45x5DOWrite write,    //向MS45x5DO写数据函数指针
                            MS45x5DORead read,      //从MS45x5DO读数据函数指针
                            MS45x5DODelayms delayms //毫秒延时函数指针
                                )
{
    if((ms==NULL)||(write==NULL)||(read==NULL)||(delayms==NULL))
    {
        return;	
    }
    
    ms->Write=write;
    ms->Read=read;
    ms->Delayms=delayms;
    
    if((devAddress==0x28)||(devAddress==0x36)||(devAddress==0x46)||((0x48<=devAddress)&&(devAddress<=0x51)))
    {
        ms->devAddress=(devAddress<<1);
    }
    else if((devAddress==0x50)||(devAddress==0x6C)||(devAddress==0x8C)||((0x48<=(devAddress/2))&&((devAddress/2)<=0x51)))
    {
        ms->devAddress=devAddress;
    }
    else
    {
        ms->devAddress=0x00;
    }
    
    ms->type=type;
    
    ms->fPressure=0.0;
    ms->fTemperature=0.0;
    ms->msData.rData[0]=0;
    ms->msData.rData[1]=0;
    ms->msData.rData[2]=0;
    ms->msData.rData[3]=0;
    
    if((fabs(pMax)<=0.0000001)&&(fabs(pMin)<=0.0000001))
    {
        ms->pUpperRange=100.0;
        ms->pLowerRange=0.0;
    }
    else
    {
        ms->pUpperRange=pMax;
        ms->pLowerRange=pMin;
    }
}

2.2、对象操作

  我们已经可以得到一个对象变量并将它实例化,我们还需要考虑它的操作问题。对于MS4515DO和MS4525DO传感器来说其操作比较简单,最主要的操作包括数据获取和地址设定。

2.2.1、获取数据

  对于我们来说获取MS4515DO和MS4525DO传感器的测量数据是我们的主要目的。我们可以从MS4515DO和MS4525DO传感器获取压力和温度数据,其测量范围与输出数据的对应关系如下图所示:

  根据上表中的数据对应关系,我们可以编写获取MS4515DO和MS4525DO传感器的数据并解析的函数。

/*获取转换值,包括温度和压力*/
void GetMS45x5DOConversionValue(MS45x5DOObjectType *ms)
{
    uint8_t rData[4]={0,0,0,0};
    float maxCount=16383;
    float minCount=0;
    
    if(ms->type==MS45x5DO_TypeA)
    {
        maxCount=13106;
        minCount=1638;
    }
    else
    {
        maxCount=14746;
        minCount=819;
    }
    
    ms->Read(ms,rData,4);
    
    ms->msData.rData[0]=rData[1];
    ms->msData.rData[1]=rData[0];
    ms->msData.rData[2]=rData[3];
    ms->msData.rData[3]=rData[2];
    
    if(ms->msData.pData.status!=MS45x5DO_Fault)
    {
        ms->fPressure=(((float)ms->msData.pData.pressure-minCount)/maxCount)*(ms->pUpperRange-ms->pLowerRange)+ms->pLowerRange;
        ms->fTemperature=((float)ms->msData.pData.temperature/2047.0)*200.0-50.0;
    }
}

2.2.2、地址设置

  关于MS4515DO和MS4525DO传感器,在出厂时已经设定了设备地址并在型号编码中给予指示。但在一些特殊情形下我们可能需要修改它的设备地址,这就需要用到MS4515DO和MS4525DO传感器的地址修改操作。

/*修改MS45x5DO的设备地址*/
void ModifyMS45x5DODecAddress(MS45x5DOObjectType *ms,uint8_t newAddress)
{
    uint8_t eepromByte[3];
    uint16_t eepromTemp=0x00;
    
    //第1步、进入命令模式
    eepromByte[0]=0xA0;
    eepromByte[1]=0x00;
    eepromByte[2]=0x00;
    
    ms->Write(ms,eepromByte,3);
    
    //第2步、发送读EEPROM命令
    eepromByte[0]=0x02;
    eepromByte[1]=0x00;
    eepromByte[2]=0x00;
    
    ms->Write(ms,eepromByte,3);
     
    //第3步、获取EEPROM的值
    ms->Read(ms,eepromByte,3);
    
    //第4步、修改为新地址
    if(eepromByte[0]==0x5A)
    {
        eepromTemp=(eepromByte[1]<<8)+eepromByte[2];
        eepromTemp=(eepromTemp&0xE007)+0xC00+(newAddress<<3);
        
        eepromByte[1]=(uint8_t)((eepromTemp&0xFF00)>>8);
        eepromByte[1]=(uint8_t)(eepromTemp&0x00FF);
    }
    else
    {
        return;
    }
    
    //第5步、将新地址写入EEPROM
    eepromByte[0]=0x02;
    
    ms->Write(ms,eepromByte,3);
    
    //第6步、退出命令模式
    eepromByte[0]=0x80;
    eepromByte[1]=0x00;
    eepromByte[2]=0x00;
    
    ms->Write(ms,eepromByte,3);
}

3、驱动的使用

  我们已经设计并实现了MS4515DO和MS4525DO压力传感器的驱动程序。接下来我们将简单的说明如何使用这一驱动,并设计一个简单的示例验证这一驱动程序的正确性。

3.1、声明并初始化对象

  我们是基于对象设计的MS4515DO和MS4525DO压力传感器的驱动程序,所以在使用驱动时,我们需要先声明一个对象变量,然后基于该对象变量来实现具体的对象操作。我们先声明对象如下:

MS45x5DOObjectType msDP;

  声明了这个对象变量之后,我们还需要使用初始化函数对其进行初始化方可使用。这一初始化函数拥有8个参数:

MS45x5DOObjectType *ms, //MS5837对象
uint8_t devAddress,     //设备地址
MS45x5DOType type,      //MS4515DO的类型
float pMax,             //压力量程上限
float pMin,             //压力量程下限
MS45x5DOWrite write,    //向MS45x5DO写数据函数指针
MS45x5DORead read,      //从MS45x5DO读数据函数指针
MS45x5DODelayms delayms //毫秒延时函数指针

  第一个参数正是我们要初始化的对象变量。第二个参数为我们所要操作的MS4515DO对象的设备地址。第三个参数是MS4515DO对象的具体类型,根据实际设备选择枚举即可。第四和第五个参数是该对象的物理量量程,根据具体对象而定。后面三个参数是实现对象操作的函数指针。这三个函数指针需要我们根据具体的软硬件平台来实现。它们的原型如下:

/*向MS45x5DO下发指令,指令格式均为1个字节*/
typedef void (*MS45x5DOWrite)(struct MS45x5DOObject *ms,uint8_t *wData,uint16_t wSize);
/*从MS45x5DO读取多个字节数据的值*/
typedef void (*MS45x5DORead)(struct MS45x5DOObject *ms,uint8_t *rData,uint16_t rSize);
/*毫秒秒延时函数*/
typedef void (*MS45x5DODelayms)(volatile uint32_t nTime);

  我们根据函数原型定义,在具体的实现平台上实现它们,如我们在STM32平台上可以实现如下:

/*向MS45x5DO下发指令,指令格式均为1个字节*/
static void WriteToDP(MS45x5DOObjectType *ms,uint8_t *wData,uint16_t wSize)
{
    HAL_I2C_Master_Transmit(&hi2c2,ms->devAddress,wData,wSize,1000);
}
/*从MS45x5DO读取多个字节数据的值*/
static void ReadFromDP(MS45x5DOObjectType *ms,uint8_t *rData,uint16_t rSize)
{
    HAL_I2C_Master_Receive(&hi2c2,ms->devAddress,rData, rSize, 1000);
}

  延时函数我们可以直接使用HAL库中的HAL_Delay也可以自己编写,在HAL库中HAL_Delay是一个弱化定义的函数,我们可以重写这一函数来实现不同的应用需求。到这里我们就可以使用对象初始化函数来初始化前面声明的对象变量了。具体如下:

MS45x5DOInitialization(&msDP, //MS5837对象
                     0x28,     //设备地址
                     MS45x5DO_TypeA,      //MS4515DO的类型
                     DPUpperRange,          //压力量程上限
                     DPLowerRange,          //压力量程下限
                     WriteToDP,    //向MS45x5DO写数据函数指针
                     ReadFromDP,   //从MS45x5DO读数据函数指针
                     HAL_Delay //毫秒延时函数指针
                     );

3.2、基于对象进行操作

  完成了对象的初始化后,我们就可以基于对象来实现相应的操作了。如我们使用驱动获取msDP对象的差压数据如下:

/*差压数据获取*/
void GetFlowDPDatas(void)
{
    GetMS45x5DOConversionValue(&msDP);
    
    aPara.phyPara.dPressure =msDP.fPressure;
    aPara.phyPara.dTemperature=msDP.fTemperature;
}

4、应用总结

  我们设计并实现了MS4515DO和MS4525DO压力传感器对象的驱动程序,并基于驱动程序实现了一个简单的测试实例,获得的结果如下:

  从上述两图中我们可以知道我们的驱动程序是正确的。事实上这一驱动已应用于我们的流量测量设备中,实现的效果良好。

欢迎关注:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外设驱动库开发笔记45:MS4515DO压力传感器驱动 的相关文章

  • IOS Xcode用git管理我们的代码git的使用

    项目部署 xff0c 代码仓库 进入网站 创建项目 xff0c 2选择开源许可证的时候很关键 创建成功 然后找到 ssh https链接 用来认证 可以先用https不需要生成公钥和私钥 在终端cd到当前项目的文件夹 然后 使用 git c
  • Linux系统与设置命令

    2 系统与设置命令 在前面的两个章节中 xff0c 我们主要介绍了Linux基本知识和虚拟机的安装 xff0c 从当前章节开始 xff0c 我们一起学习下Linux的基本命令 xff0c 在当前章节 xff0c 我们先简单的学习下一些系统的
  • 4. iOS面试题原理篇2

    lldb gdb 常用的调试命令 xff1f po xff1a 打印对象 xff0c 会调用对象description方法 是print object的简写expr xff1a 可以在调试时动态执行指定表达式 xff0c 并将结果打印出来
  • SQL语言

    1 什么是SQL SQL structured query language xff1a 结构化查询语言 SQL是一种对关系型数据库中的数据进行定义和操作的语言 SQL语言简洁 xff0c 语法简单 xff0c 好学好用 什么是SQL语句
  • 实测:Ubuntu16.04 ROS中实现RVIZ控制驱动UR10E机械臂!

    踩过了太多的坑 xff0c 此博客警醒自己 xff01 能用的收藏一下 一 演示一切之前 xff0c 要清楚两个问题 xff1a 1 你的UR是什么型号 xff0c 示教器软件版本是什么 xff1f xff08 这个不会看的话 xff0c
  • STM32CubeMX安装及使用教程(一)

    背景 随着芯片行业不断发展 xff0c STM32系列芯片不断扩大市场份额 为了方便开发者的不同需求 xff0c 意法半导体 xff08 ST xff09 推出了一款图形化配置工具 STM32CubeMX STM32CubeMX可以通过图形
  • STM32CubeMX安装及使用教程(二)

    背景 第一章我们讲述了如何安装和配置STM32CubeMX软件 xff0c 这一章我们来说说如何简单的使用STM32CubeMX软件 软件使用 1 打开STM32CubeMX软件 xff0c 点击File gt New Project 2
  • xshell无法连接虚拟机中的ubuntu解决方案

    xshell无法连接虚拟机中的ubuntu解决方案 查看虚拟机中ubuntu的IP地址的方法 ifconfig a 利用xshell工具进行远程连接 ssh IP地址 发现无法连接 xff0c 这就是我一开始将VM安装好 xff0c 一次性
  • 气压计融合定高控制逻辑

  • Git简介

    什么是版本控制 学习Git之前首先要了解一个概念 版本控制 xff0c 什么是版本控制 xff0c 版本控制就是一种在开发的过程中用于管理我们对文件 目录或工程等内容的修改历史 xff0c 方便查看更改历史记录 xff0c 备份以便恢复以前
  • Git图形化管理工具Sourcetree的使用及git冲突问题

    目录 一 了解 Sourcetree1 什么是Sourcetree2 为什么要使用Sourcetree 二 Sourcetree下载与安装1 下载2 安装 三 Sourcetree的使用1 Gitee的介绍与使用什么是GiteeGitee的
  • [智能车]平衡车/直立车的入门经验(代码讲解)

    做为第十六届智能车的FW 在半年的做车经历中把能踩的坑都踩了个遍 写这篇文章是为了留个纪念 xff0c 也是为了帮新车友快速入门 xff08 可能完全0基础 xff09 我自己的经验也不足 xff0c 所以可能会存在一些漏洞 xff0c 还
  • Mac系统 dockerfile 报错 COPY failed: stat /var/lib/docker/tmp/docker-builderxxx

    报错 xff1a Step 3 4 span class token keyword span COPY nginx 1 12 2 tar gz usr local src COPY failed span class token func
  • VS code的git设置

    先建立一个空文件夹 在git窗口先点 初始化仓库 xff0c 再点侧边栏右上角的 更多 xff0c 选 远程 下的 添加远程存储仓库 输入远程仓库地址 xff0c 再输入仓库名称 打开 源代码管理存储库 视图 xff0c 点上面的git分支
  • L4Linux的版本比较

  • 利用XML文件的一个写日志的类!!!!!

    对于程序执行期间的错误跟踪 xff01 相信大家都有自己的一套办法 xff01 xff01 xff01 但都是利用文件文件 xff0c 我这次利用的是XML amp XSL xff0c 可产生报表格式的日志 轻松生成报表 xff01 xff
  • 【Kubernetes实战】(四)MiniKube方式部署

    目录 一 当前配置环境 二 准备工作 1 关闭防火墙和SeLinux 2 禁用swap交换分区 三 Docker安装 1 配置docker源 2 安装docker环境依赖 3 安装docker 4 启动docker并设置为开机自启 5 配置
  • DGPS与RTK的区别

    2013 10 11 10 49 11 分类 xff1a GNSS 举报 字号 订阅 最近一直感觉身在这个行业不能对这个行业理论知识一无所知 xff0c 这对于技术人来说应该是一种遗憾 所以决定要学一些东西 xff0c 并记录下来以便于以后
  • 基于Ubuntu19.04安装docker

    输入命令 lsb release a 显示如下 Distributor ID Ubuntu 类别是ubuntu Description Ubuntu 19 04 16年3月发布的稳定版本 xff0c LTS是Long Release 19
  • PHP获取当月开始时间和结束时间

    startTime 61 date 39 Y m 01 39 time 获取该月份的第一天 endTime 61 date 39 Y m t 39 time 获取该月份的最后一天

随机推荐

  • CSS3实现动态进度条

    CSS3的线性渐变使制造动态进度条成为可能 现在就来一步一步讲解如何创建动态进度条吧 以Chrome浏览器webkit内核为例 目标 xff1a 单个矩形条背景 目标进度条 xff0c 背景是淡蓝色 xff0c 上面平铺了一层倾斜的深蓝色条
  • C语言-阶乘数列

    求Sn 61 1 43 2 43 3 43 4 43 5 43 43 n 之值 xff0c 其中n是一个数字 include lt stdio h gt include lt math h gt long long factorial in
  • 深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记

    1 bootloader到kernel启动总逻辑流程图 ARM架构中 xff0c EL0 EL1是必须实现 xff0c EL2 EL3是选配 xff0c ELx跟层级对应关系 xff1a EL0 app EL1 Linux kernel l
  • STM32输出模式详解

    本文为个人见解 xff0c 如有问题欢迎指正 首先需要明确输出 输入的意思 输出是指STM32控制外设 xff08 主要指输出高电平或低电平 xff09 或STM32发送数据给外设 xff0c 输入是指外设发送数据给STM32 输出模式有三
  • [OPNET学习总结]——SITL

    软件自带的SITL例程中 xff0c 出现如下error xff1a lt lt lt Recoverable Error gt gt gt Object repository construction failed due to erro
  • 漫谈程序员系列:程序员的生活就这样吗

    我当了快十年程序员了 xff0c 终于老得可以来谈谈程序员的生活是什么样子了 或许陈奕迅的 十年 中的一段歌词 xff0c 可以表示很多程序员和软件开发之间的感情纠葛 xff1a 十年之前 我不认识你 你不属于我 我们还是一样 陪在一个陌生
  • 程序员转行为什么这么难

    尽管我在 大龄程序员的未来在何方 这篇文章里比较乐观地介绍了程序员保持竞争力的几个方向 xff0c 但现实依然是残酷的 xff1a 很多人将不得不离开软件开发工作 xff0c 转型去从事其他职业 当你要这么做时 xff0c 就会感慨 xff
  • 使用http_parser解析URL

    用C语言编写http应用 xff0c 解析URL是一个繁琐的事儿 前几天使用http parser实现httpclient xff0c 发现里面提供了一个解析URL的方法http parser parse url xff0c 用起来相当方便
  • Android app 后台被杀恢复

    android 模拟应用因内存不足被后台杀死命令 https www jianshu com p effb4546b9aa adb shell am kill all 应用通过home键已经停留在后台使用 xff0c 杀掉所有后台程序 xf
  • Ubuntu查看linux系统版本号

    查看ubuntu版本 输入命令 cat proc version 显示如下 Linux version 5 0 0 13 generic buildd 64 lcy01 amd64 020 linux内核版本号 gcc version 8
  • Linux C Socket简介和实现

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • C++ STL视频教程,初学者必备视频资料

    STL视频教程 初学者必备视频资料 我一个朋友做的 我转发到这里和大家分享 STL语音视频教程 下载地址 xff1a url 61 http www ctdisk com file 3388918 STL语音视频教程 7z url
  • QMessageBox简单用法(QT5.12)

    span class token comment for starf study span span class token macro property span class token directive hash span span
  • TOF相机 Realsense L515 与 Ipad pro Lidar Camera 对比

    最近好奇都是TOF 相机 L5151 和 Ipad pro 上带的深度相机模块有啥不一样 网上很少有相关的中文资料来介绍 原理上的差异 简单搜索了一下 在此小小总结 Apple Lidar Camera 苹果采用的激光是 VCSEL Ver
  • Arduino 读取GPS 数据发送解析并发布ROS topic(一)

    概述 通过Arduino收集GPS数据 xff0c 连接至电脑端 xff0c 在电脑端通过python对数据进行整理 xff0c 并通过发布 TOPIC xff0c 本部分主要记录如何通过Arduino读取GPS数据 接线方式 GPS 的
  • STM32 复位电路设计

    在此之前我是个只会抄写原理图的工程师 xff0c 每当遇到一个问题时 xff0c 确需要解决很久 xff0c 最根本的原因在于不明白其中的原理 xff0c 这次补充一下单片机复位电路设计 1 为什么要设计复位电路 xff1f 在做一件事情之
  • STM32核心板设计——电源设计

    1 STM32 数据手册电源部分研读 RTC电源管脚为V BAT 电源范围为1 8 3 6V xff0c 主要用于RTC时钟的供电 xff0c RTC在大部分场合用于保存一些重要的参数 xff0c 比如在电脑主板上用于保存boss的信息 x
  • stm32的复位电路问题

    现在比较流行的复位方式是这样的 xff1a 但我们都知道对于结构紧凑型硬件来说 xff0c 多一个电阻都是没必要的 在没有手动复位需求的场合 xff0c 能不能删掉按键与R24 xff0c 仅保留104电容 xff1f 通过阅读stm32
  • 外设驱动库开发笔记21:BME680环境传感器驱动

    环境传感器是一类我们很常用的传感器 它可以方便我们获取压力 温度 湿度以及空气质量等数据 在这一篇中 xff0c 我们将分析 BME680 环境传感器的功能 xff0c 并设计和实现 BME680 环境传感器的驱动 1 功能概述 BME68
  • 外设驱动库开发笔记45:MS4515DO压力传感器驱动

    很多时候我们需要检测流量和压力这些参数 xff0c 比如我们要检测大气压 xff0c 或者通过测量差压来获得输送流体的流量等 xff0c 都需要用到压力传感器 这一篇我们就来讨论MS4515DO压力传感器的数据获取 1 功能概述 MS451