基于STM32_DS18B20单总线传感器驱动

基于STM32_DS18B20单总线传感器驱动

文章目录

  • 基于STM32_DS18B20单总线传感器驱动
  • 前言
  • 一、BS18B20?
  • 二、原理
    • 1.复位与检验
    • 2.基本命令
    • 3.唯一ROM识别码
    • 4.温度转换
  • 三、驱动代码
  • 四、注意事项


前言

本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单对1-Wire总线接口的传感器做个示例讲解,该项目基于硬件平台STM32F407,使用标准库本完成。


一、BS18B20?

DS18B20数字温度计提供9至12位(可配置)温度读数,指示设备的温度。信息通过1-Wire总线接口发送到/从DS18B20,因此只需要从中央微处理器连接到DS18B20的一根线(和接地)。读取、写入和执行温度转换的电源可以从数据线本身获得,而不需要外部电源。每个DS18B20都包含一个唯一的硅序列号,所以多个DS18B20可以存在于同一个1-Wire总线上。这允许在许多不同的地方放置温度传感器。此功能有用的应用包括暖通空调环境控制,感应建筑物,设备或机械内部的温度,以及过程监控和控制。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
特点:
1.唯一的1线接口只需要一个端口引脚进行通信
2.多功能简化了分布式温度传感应用
3.不需要外部组件,可从数据线供电。
4.供电范围3.0V至5.5V 零待机电源
5.测量温度范围为-55°C至+125°C。相当于-67°F到+257°F ±0.5°C精度从-10°C到+85°C
6.温度计分辨率可编程从9到12位

二、原理

1.复位与检验

主机发送(TX)复位脉冲(低信号,至少480µs),然后主机释放线路并进入接收模式(RX),线总线通过5k上拉电阻拉到高状态。在检测到DQ引脚上的上升沿后,DS18B20等待15-60µs,然后发送存在脉冲(60-240µs的低电平信号),主机在该时段检测到DQ的低电平信号,表示DS18B20设备存在,否则设备不存在。参见驱动中:void DS18B20_Reset(void)和uint8_t DS18B20_Check(void)函数。
在这里插入图片描述

2.基本命令

DS18B20常见的命令及含义如表所示:

名称命令码功能
Read ROM33h该命令允许总线主机读取DS18B20的8位族码、唯一的48位序列号和8位CRC。该命令只能在总线上有单个DS18B20时使用。如果总线上有多个从站,当所有从站试图同时传输时,就会发生数据冲突(open drain将产生有线AND结果)。
Match ROM55hmatch ROM命令,后跟64位ROM序列,允许总线主机在多路总线上寻址特定的DS18B20。只有与64位ROM序列完全匹配的DS18B20才会响应以下内存功能命令。所有与64位ROM序列不匹配的从存储器将等待复位脉冲。该命令可用于总线上的单个或多个设备。
Skip ROMCCh该命令允许总线主机在不提供64位ROM代码的情况下访问内存功能,从而在单丢总线系统中节省时间。如果总线上有一个以上的从站,并且在Skip ROM命令之后发出了Read命令,那么当多个从站同时传输时,总线上就会发生数据冲突(open drain下拉将产生一个有线and结果)。相当于跳过了识别码查验,直接读取温度
Search ROMF0h当系统最初启动时,总线主机可能不知道1-Wire总线上的设备数量或它们的64位ROM代码。搜索ROM命令允许总线主人使用消除过程来识别总线上所有从设备的64位ROM代码。
Read ScratchpadBEh该命令读取刮记本的内容。读取将从字节0开始,并将继续通过刮擦板,直到读取第九个(字节8,CRC)字节。如果不是所有的位置都要读取,主机可以在任何时候发出复位以终止读取。
Search ROM44h该命令开始温度转换。无需进一步收集数据。温度转换将被执行,然后DS18B20将保持空闲。如果总线主机按照该命令发出读时隙,只要DS18B20忙于进行温度转换,它就会在总线上输出0;当温度转换完成时,它将返回一个1。如果parasitepowered,总线主必须在发出该命令后立即启用一个大于tconv的强上拉。

基本操作过程参见官方手册给出的如下流程图
在这里插入图片描述

3.唯一ROM识别码

每个DS18B20包含一个64位长的唯一ROM代码。发送0x33命令后可读取改64位识别码,前8位是1-Wire族代码(DS18B20代码为28h)。接下来的48位是唯一的序列号。最后8位是前56位的CRC(CRC = X8 + X5 + X4 + 1),(参见图4)。当有多个DS18B20设备同时挂在1-Wire总线下时,可通过发送0x55匹配命令后发送识别码来匹配ROM识别码来确定控制或读取哪一个DS18B20设备数据。以前的方式是先准确无误得读取每个DS18B20设备唯一ROM识别码并提前写入代码中,如果某个传感器设备损坏,更换传感器设备的同时要更改代码或识别码配置文件。后来手册中给出一个Search ROM命令(暂时没试过)。
在这里插入图片描述

4.温度转换

DS18B20的核心功能是其直接数字温度传感器。DS18B20的分辨率是可配置的(9,10,11或12位),12位读数为出厂默认状态。这相当于0.5°C, 0.25°C, 0.125°C或0.0625°C的温度分辨率。在发出Convert T [44h]命令后,执行温度转换,热数据以16位扩展符号的二进制补码格式存储在刮板存储器中。一旦转换完成,可以通过发出Read Scratchpad [BEh]命令在1-Wire接口上检索温度信息。数据通过1-Wire总线传输,首先是LSB总线。温度寄存器的MSB包含“符号”(S)位,表示温度是正的还是负的。表2描述了输出数据与测量温度的确切关系。该表采用12位分辨率。转换方式参见驱动void DS18B20_GetTemp_Main(void)函数。
在这里插入图片描述

三、驱动代码

.h文件:

#ifndef __DS18B20_H
#define __DS18B20_H#include "stdio.h"
#include "Config.h" 
#include "SysTick.h"/********************************************DS18B20 devier********************************************/
#define DS18B20_IS_READY          (1u)   //设备存在      
#define DS18B20_NOT_READY         (0u)   //设备不存在#define DS18B20_DQ_IN()           {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;}   //PG9 输入模式
#define DS18B20_DQ_OUT()          {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;}   //PG9 输出模式#define DS18B20_DQ_PORT           GPIOG
#define DS18B20_DQ_PIN            GPIO_Pin_9#define DS18B20_WAIT_TIMEOUT      (uint8_t)240	  //等待时间
#define DS18B20_DELAY             (uint8_t)5	  //延时时间#define DS18B20_DQ_LOW            GPIO_ResetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN)    //为设置低电平
#define DS18B20_DQ_HIGH           GPIO_SetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN)      //设置为高电平 #define DS18B20_DQ_STATUS         GPIO_ReadInputDataBit(DS18B20_DQ_PORT,DS18B20_DQ_PIN)		//读取DQ状态#define DS18B20_delay_us(a)       SysCtlDelayus(a)			//延时函数ustypedef enum
{DS18B20_1 = 0,DS18B20_2,DS18B20_3,DS18B20_4,DS18B20_Num_Counter
}DS18B20_Num;/*DS18B20_SerialNumber
------------------------------------------------------------------------------------
|  8-BIT CRC CODE      |     48-BIT SERIAL NUMBER      |    8-BIT FAMILY CODE(28h) |
------------------------------------------------------------------------------------
MSB                 LSB MSB                         LSB  MSB                       LSB
*/
typedef struct
{uint8_t DS18B20_IndexNumber;          //设备编号uint8_t DS18B20_SerialNumber[8];      //ROM唯一识别码short   DS18B20_Temperature;          //温度数据
}DS18B20_ATTRIB_Type;extern uint8_t DS18B20_Init(void);
extern void DS18B20_Reset(void);
extern short DS18B20_Get_Temperature(uint8_t Index_Num);
extern void DS18B20_GetTemp_Main(void);#endif

.c文件:

 #include "DS18B20_Dev.h"//#define DS18B20_MORE_THAN_ONE static DS18B20_ATTRIB_Type DS18B20_Temp[DS18B20_Num_Counter] = {{DS18B20_1,{0x08,0x22,0x70,0xB0,0x9C,0x87,0x28},0u},{DS18B20_2,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_3,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_4,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},   };static uint8_t DS18B20_Check(void);
static uint8_t DS18B20_Read_Bit(void);
static uint8_t DS18B20_Read_Byte(void);
static void DS18B20_Write_Byte(uint8_t aByte);
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer);/************************************************************************************
*@fuction	:DS18B20_Init
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
extern uint8_t DS18B20_Init(void)
{DS18B20_Reset();if(DS18B20_Check() == DS18B20_IS_READY){#ifdef DS18B20_MORE_THAN_ONEDS18B20_Get_RomID(DS18B20_Temp[0].DS18B20_SerialNumber);#elsereturn DS18B20_IS_READY;#endif}
}/************************************************************************************
*@fuction	:DS18B20_Start
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
void DS18B20_Start(void)
{DS18B20_Reset();	   if(DS18B20_Check() == DS18B20_IS_READY)	 {DS18B20_Write_Byte(0xCC);   //skip romDS18B20_Write_Byte(0x44);   //convert}else{//error}
}/************************************************************************************
*@fuction	:DS18B20_Reset
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
void DS18B20_Reset(void)
{//DS18B20 复位时序:DQ输出模式 DQ = 0(750us), DQ = 0(20us.DS18B20_DQ_OUT();DS18B20_DQ_LOW;DS18B20_delay_us(750);DS18B20_DQ_HIGH;DS18B20_delay_us(15);
}/************************************************************************************
*@fuction	:DS18B20_Check
*@brief		:
*@param		:--
*@return	:1-device ok/0-device error
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
uint8_t DS18B20_Check(void)
{uint8_t wait_time = 0;uint8_t Ready_Dev = 0;//DQ输入模式DS18B20_DQ_IN();//等待DQ脚被DS18B20拉低while((DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//等待DQ脚被DS18B20抬高wait_time = 0;while((!DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//如果未超时,则说明设备存在return (uint8_t)DS18B20_IS_READY;              }}
}/************************************************************************************
*@fuction	:DS18B20_Write_Byte
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
static void DS18B20_Write_Byte(uint8_t aByte)
{		uint8_t i = 0;uint8_t temp = 0;//将DQ设置为输出模式DS18B20_DQ_OUT();for(i = 0;i < 8;i++){temp = aByte&0x01;aByte = aByte>>1;if(temp){	//最低位为1DS18B20_DQ_LOW;DS18B20_delay_us(2);DS18B20_DQ_HIGH;DS18B20_delay_us(60);          }else{	  //最低位为0DS18B20_DQ_LOW;DS18B20_delay_us(60);DS18B20_DQ_HIGH;DS18B20_delay_us(2);}       }
}/************************************************************************************
*@fuction	:DS18B20_Read_Bit
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Bit(void) 			 //read one bit
{uint8_t Bit_Status;DS18B20_DQ_OUT();       //SET PG9 OUTPUTDS18B20_DQ_LOW; DS18B20_delay_us(2);DS18B20_DQ_HIGH; DS18B20_DQ_IN();        //SET PG9 INPUTDS18B20_delay_us(12); if(DS18B20_DQ_STATUS){Bit_Status = 1;}else{    Bit_Status = 0;}    DS18B20_delay_us(50);return Bit_Status;
}
/************************************************************************************
*@fuction	:DS18B20_Read_Byte
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Byte(void)
{uint8_t i = 0 ,Bit_Status = 0,aByte = 0;//DQ为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){//低位先出Bit_Status = DS18B20_Read_Bit();aByte = (Bit_Status << 7) | (aByte >> 1);}return aByte;
}/************************************************************************************
*@fuction	:DS18B20_Read_Byte
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer)
{//uint8_t RomID[8];uint8_t i = 0;//DS18B20_Start();                    // ds1820 start convertDS18B20_Reset();DS18B20_Check();	 DS18B20_Write_Byte(0x33);             // skip rom//SDA为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){ID_Buffer[i] = DS18B20_Read_Byte();}//return aByte;
}/************************************************************************************
*@fuction	:DS18B20_GetTemp_Main
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
void DS18B20_GetTemp_Main(void)
{uint8_t temp;uint8_t TL,TH;short Temperature;DS18B20_Start();                    // ds1820 start convertDS18B20_Reset();DS18B20_Check();	 DS18B20_Write_Byte(0xCC);           // skip romDS18B20_Write_Byte(0xBE);           // read	    TL = DS18B20_Read_Byte();           // LSB   TH = DS18B20_Read_Byte();           // MSB   if(TH > 7){TH = ~TH;TL = ~TL; temp = 0;     //温度为负  }else{      temp = 1;      //温度为正}      	  	  Temperature = TH;                           //获得高八位Temperature <<= 8;    Temperature += TL;                          //获得低八位Temperature = (double)Temperature * 0.625;  //转换     if(temp){DS18B20_Temp[0].DS18B20_Temperature = Temperature;                       //返回温度值}else {DS18B20_Temp[0].DS18B20_Temperature = -Temperature;}      
}/************************************************************************************
*@fuction	:DS18B20_Get_Temperature
*@brief		:
*@param		:--
*@return	:void
*@author	:_Awen
*@date		:2022-12-04
************************************************************************************/
extern short DS18B20_Get_Temperature(uint8_t Index)
{return DS18B20_Temp[0].DS18B20_Temperature;
}

四、注意事项

1.硬件电路中DQ脚外部会加上拉电阻,主机释放总线会被上拉电阻自动上拉,但为保险器件我们将主机释放中线写为主动上拉为高电平
2. .h文件中对延时函数DS18B20_delay_us(a)的定义,关于 SysCtlDelayus(a)实际是ARM汇编的一种延时函数的写法,参见另一篇关于延时函数的博客(汇编延时)https://blog.csdn.net/Yin_w/article/details/130036593?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156213.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计选什么题目好?springboot智慧养老中心管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux磁盘常见知识

目录 一、基础概念 1.1 文件系统类型 1.2 主分区、扩展分区、逻辑分区三者关系 1.3 UUID 1.4 lvm逻辑卷管理系统 二. 常用命令 2.1 查看命令 2.2 分区命令 2.3 格式化命令 1.4 挂载命令 三、扩容根目录 一、基础概念 1.1 文件系统类型 文件系统类型决定了向分区中存放、读取数…

C++——string

目录 STL STL六大组件 标准库中的string类 string类 string类常用接口 构造函数 下标遍历[] 迭代器 范围for push_back() append() insert() operator pop_back() erase() reserve resize clear c_str() substr() find() rfind() find_first_of getline str…

MQ-小试牛刀

MQ MQ解决了什么问题&#xff1f; 异步处理 解耦合 削峰填谷 大规模数据处理 解耦 A系统发送数据到BCD三个系统&#xff0c;通过接口调用发送。如果 E 系统也要这个数据呢&#xff1f;那如果C系统现在不需要了呢&#xff1f;A系统负责人几乎崩溃… A系统跟其它各种乱七…

2023版 STM32实战9 RTC实时时钟/闹钟

RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 注意事项 -1- 要手动配置中断寄存器 -2- 需要等待写操作完成 -3- 时钟闹钟中段…

FPGA面试题(4)(跨时钟域处理)

跨时钟域处理方法 慢->快快->慢单bit在快时钟域同步打拍&#xff0c;将信号同步到快时钟域展宽后同步打拍多bit异步FIFO异步FIFO握手信号 一.打两拍 适用于单bit跨时钟域处理所谓的打两拍就是定义两级寄存器实现延时 那为什么是打两拍&#xff0c;不是打一拍&#x…

mysql面试题44:MySQL数据库cpu飙升的话,要怎么处理?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL数据库cpu飙升的话,要怎么处理呢? 当MySQL数据库的CPU使用率飙升时,可能表示数据库负载过重或存在性能问题。以下是处理MySQL数据库CPU飙…

腾讯云优惠券种类、领取方法及使用教程分享

腾讯云是国内领先的云计算服务提供商&#xff0c;为用户提供丰富的云计算产品和服务。为了吸引更多用户使用腾讯云的产品和服务&#xff0c;腾讯云会定期推出各种优惠券活动。本文将为大家介绍腾讯云优惠券的种类、领取方法及使用教程。 一、腾讯云优惠券种类介绍 腾讯云优惠券…

项目管理的优秀软件推荐,助力提升团队效能!

我们知道&#xff0c;每个产品在上市的过程中都需要经历市场调研、研发设计、功能测试、上市评估、营销推广等阶段。作为项目经理&#xff0c;最关键的任务不仅是确保产品的顺利孵化和上市&#xff0c;还有管理团队。我们研究了许多项目管理用户&#xff0c;工作的难点是如何在…

{2023版}老牌配资平台排行报告:十大排名和实盘评估详情

随着投资者对股市的深入了解&#xff0c;越来越多的人开始选择配资交易。在配资平台的选择上&#xff0c;除了要注意平台的合法性和安全性外&#xff0c;平台的口碑和服务质量也是非常重要的考虑因素。为了方便投资者的选择&#xff0c;尚红网、倍悦网、兴盛网、诚利和、嘉正网…

文本情感计算技术(深度)

文本情感计算技术的发展得益于社交媒体的蓬勃发展。文本情感计算的研究至今已有 20年的历史&#xff0c;仍是国内外学术界和产业界的研究热点。随着新技术的变迁、新任务的出现&#xff0c;以及更高性能算法需求的增长&#xff0c;文本情感计算涉及多项有挑战性的研究任务。文本…

渗透测试KAILI系统的安装环境(第八课)

KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架&#xff0c;其核心思想是面向服务的架构&#xff08;SOA&#xff09;&#xff0c;支持http、websocket、tcp等多种通信协议&#xff0c;同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…

4大软件测试策略的特点和区别(单元测试、集成测试、确认测试和系统测试)

四大软件测试策略分别是单元测试、集成测试、确认测试和系统测试。 一、单元测试 单元测试也称为模块测试&#xff0c;它针对软件中的最小单元&#xff08;如函数、方法、类、模块等&#xff09;进行测试&#xff0c;以验证其是否符合预期的行为和结果。单元测试通常由开发人…

如何在.NET Core3.1 类库项目中使用System.Windows.Forms

网上说法大多都是直接添加对.Net Framework框架的引用&#xff0c;但是这种方法打包很不友好。于是开始了网络搜索&#xff0c;翻到了微软的文档&#xff0c;才找到直接引用 System.Windows.Froms 程序集的方法。还隐藏的很深&#xff0c;地址&#xff1a;Upgrade a Windows Fo…

查看和分析 IIS 日志文件以增强 Web 服务器安全性

Microsoft IIS服务器&#xff0c;无论是Web还是FTP&#xff0c;对于企业来说都是必不可少的。但是&#xff0c;IT 安全管理员的工作并不止于部署 IIS 服务器。部署后&#xff0c;管理员必须采取安全措施来保护这些服务器&#xff0c;监控 IIS 服务器安全性的一种行之有效的方法…

数据集笔记:分析OpenCellID 不同radio/ create_time update_time可视化

1 读取数据 &#xff08;以新加坡的cellID为例&#xff09; import geopandas as gpd import pandas as pdopencellidpd.read_csv(OpenCellID_SG.csv,headerNone,names[radio,mcc,net,area,cell,unit,lon,lat,range,samples,changeable1,created1,updated,AveSignal]) opence…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

高效团队协作软件推荐:提升工作效率的优选方案!

使用团队协作软件有什么好处&#xff1f;可以摆脱过时的电子表格&#xff0c;有了单一的真实来源&#xff0c;您可以随时检查任何任务并获得可用的最新信息。 一目了然地查看所有正在进行的工作&#xff0c;看板式面板、甘特图和燃尽图等可视化工具可让您随时轻松获得项目的高级…

【web实现右侧弹窗】JS+CSS如何实现右侧缓慢弹窗动态效果『附完整源码下载』

文章目录 写在前面涉及知识点页面效果1、页面DOM创建1.1创建底层操作dom节点1.2 创建存放弹窗dom节点 2、页面联动功能实现&#xff08;关闭与弹出&#xff09;2.1 点击非右侧区域实现关闭2.2 点击叉叉及关闭按钮实现关闭功能 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留…

HDMI 基于 4 层 PCB 的布线指南

HDMI 基于 4 层 PCB 的布线指南 简介 HDMI 规范文件里面规定其差分线阻抗要求控制在 100Ω 15%&#xff0c;其中 Rev.1.3a 里面规定相对放宽了一些&#xff0c;容忍阻抗失控在 100Ω 25%范围内&#xff0c;不要超过 250ps。 通常&#xff0c;在 PCB 设计时&#xff0c;注意控…