news 2026/11/4 11:03:58

ADS122U04+PIC32MZ:工业级温度采集信号链全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADS122U04+PIC32MZ:工业级温度采集信号链全解析

用 PIC32 自带的 12 位 ADC 去做温度采集,原型验证阶段完全没问题,但真到了工业现场和 HVAC 这种需要长时间稳定运行、环境干扰复杂的场合,位数不够、基准漂移、通道串扰这些短板会一个接一个被翻出来。我在几个项目里踩过一轮之后,最后把温度采集链路拆成了“独立 24 位 ADC + 主控 MCU”的组合,其中最典型也最顺手的一套就是 ADS122U04IPWR 配 PIC32MZ1024EFH064。这篇文章就照着这套组合,把整个链路拆开讲透:为什么这么选型、硬件怎么接、固件怎么配置、温度怎么算,以及现场调试最容易踩的坑。

这套组合解决的核心问题很明确:传感器信号太微弱,主控 ADC 精度不够;传感器板和主控板的距离拉开了,模拟信号直接走线容易丢精度;工业现场的共模干扰、地电位差、变频器噪声,都需要在前端就处理干净。ADS122U04 负责把毫伏甚至微伏级的传感器信号变成可靠的数字量,PIC32MZ1024EFH064 负责跑协议、算温度、连上位机。下面我按实际做项目的顺序,逐层展开。

1. 项目拆解与选型思路

1.1 24 位 ADC 解决了什么实际问题

先算一笔账。PT100 的灵敏度大约是 0.385Ω/°C,如果用 1mA 的电流激励,温度每变化 1°C 对应的电压变化只有 0.385mV。一个典型的 12 位 ADC,参考电压 3.3V 时,最低有效位 LSB 约等于 0.8mV。换句话说,主控内置 ADC 的理论分辨率连“1°C 一个码”都做不到,更别提实际系统中的参考电压漂移、电源纹波、采样保持噪声。测 HVAC 风管温度也许勉强能看,测工业过程温度就是自讨苦吃。

ADS122U04 是一颗 24 位 Δ-Σ 型 ADC,内部带了可编程增益放大器(PGA),增益从 1 到 128 可调。小信号先放大再量化,微伏级的热电偶信号也能被有效分辨。它的内部基准电压温漂做到 5ppm/°C 级别,比普通 MCU 内置基准好一个数量级,长时间运行时的读数稳定性完全不一样。配合 100SPS 左右的数据速率,有效无噪声分辨率大概能做到 17 到 18 位。这个数字听起来离 24 位有距离,但实际测温度时,重复性做到 0.01°C 量级是完全没有问题的。HVAC 通常要求 ±0.5°C,工业过程控制要求 ±0.2°C,这个方案有足够余量。

1.2 为什么选 UART 接口而不是 SPI 或 I2C

这里是我最想强调的一点。很多人看见 ADC 第一反应是 SPI,但 ADS122U04 偏偏用 UART,这其实是德州仪器在工业和楼宇自控场景下的有意设计。SPI 需要 MISO、MOSI、SCLK、CS 四根线,加上供电和地就是六根。传感器板和主控板一旦拉开距离,或者中间需要做电气隔离,SPI 的隔离器数量、PCB 面积、成本都会明显增加。I2C 虽然线少,但速度慢、抗干扰能力一般,而且地址冲突在多点总线里挺烦人。

UART 只需要 TX、RX 两根线,加上电源和地就是四线连接。隔离方案也简单,两颗数字隔离器或者一个双通道隔离器就能解决。PIC32MZ1024EFH064 本身带 6 个 UART 外设,资源完全够用,不会出现“为了接 ADC 抢串口”的问题。在 HVAC 控制柜里,传感器分板和控制板之间经常有半米到几米的距离,UART 在长距离传输和隔离设计上的优势非常明显。

1.3 PIC32MZ1024EFH064 在整个链路中的角色

PIC32MZ1024EFH064 属于 Microchip 的 MZ EF 系列,200MHz 主频的 MIPS 内核,带硬件浮点单元 FPU,1MB 闪存和 512KB RAM。这在 32 位 MCU 里属于中高配,跑温度线性化、滤波算法完全不是瓶颈。它在这个项目里承担三件事:第一,通过 UART 和 ADS122U04 通信,完成寄存器配置和数据帧读取;第二,执行温度换算算法,包括 PT100 的多项式计算、热电偶的查表和冷端补偿;第三,把换算后的温度值通过 RS485、CAN、以太网或者本地屏幕发送出去。

我用这个芯片还有一个现实原因:Microchip 的 Harmony 框架对 PIC32MZ 系列的支持很完整,UART 带 DMA 和环形缓冲区,高速率采集下不用 CPU 死等数据。做产品时省了很多底层时间,可以把精力集中在温度算法和系统可靠性上。

接口类型线数隔离成本适合距离抗干扰能力适用场景
SPI4+高短,板内为主中等板级高速采集
I2C2中短较弱板内低速通信
UART2+2低中长距离较强分板采集、隔离系统

2. 硬件设计:传感器前端、激励与电气隔离

2.1 RTD 前端:比例测量才是关键设计

测 PT100、PT1000 这类热电阻时,最容易犯的错误是“用固定基准电压 + 恒流源激励”,然后直接把 ADC 采到的电压换算成电阻。这个方案的致命问题在于:恒流源的漂移和基准电压的漂移是两个独立变量,它们都会以同样比例直接变成温度误差。想要达到 0.1% 的电阻测量精度,激励源和基准得同时做到 0.1% 以内,这在实际中是很难维持的。

ADS122U04 内部有两个可编程电流源,正确用法是让电流源同时流过基准电阻和 RTD,构成比例测量结构。ADC 的参考电压取自基准电阻两端,输入通道测量 RTD 两端的电压,于是输出码值直接就是 RTD 电阻和基准电阻之比,电流源的绝对值漂移、基准电压的漂移在计算中被自然抵消。系统里唯一关键的器件就是那颗基准电阻,我通常选 0.1% 精度、25ppm/°C 温漂的金属膜电阻,阻值根据量程定,比如 1.5kΩ 或 4.096kΩ。

散热和自热问题也要注意。激励电流虽然是可配置的,1mA 对 PT100 来说能显著降低自热误差,0.5mA 更稳妥但信噪比略降。实际项目中我一般用 1mA,功耗可控,且信号幅度足够覆盖 PGA 的良好工作区间。传感器线缆长的时候优先四线制,最差也要三线制,两线制在工业现场基本不建议用,导线电阻引入的误差实在不好补。

2.2 热电偶前端:共模电压、冷端和滤波

热电偶在工业场景里用得非常多,K 型、T 型、J 型都有出现。热电偶信号的特点是幅度极低,K 型热电偶在常温区大约 40μV/°C,所以在放大器之前必须保证前端干净。ADS122U04 内置 PGA 调到高增益之后,任何微小的差分输入噪声都会变成可见的读数跳动。

热电偶测量的两个核心问题,一个是冷端补偿,一个是共模干扰。冷端补偿的原理是把“热电偶输出 = 热端和冷端的电势差”还原成绝对温度。我常用的方案是利用 ADS122U04 内置温度传感器读取芯片结温,把冷端端子尽量贴近 ADC 引脚,然后固件里读内部温度用于补偿。这个方案省了一路外部 NTC,也省了标定流程。如果冷端和芯片之间隔得远,那就老老实实在端子排上放一个 NTC,用另一个通道测量。

共模干扰在工业现场非常普遍,尤其是大功率设备启动时,传感器线缆上会耦合出几十伏的共模电压。我的处理方式是:ADC 输入引脚前加 RC 低通滤波,时间常数大约几十微秒到百微秒,同时在输入端串接 PTC 或小阻值电阻做限流保护。如果共模来自变频器高频骚扰,屏蔽双绞线加单点接地有时候比隔离器更管用。

2.3 电源、隔离和 PCB 布局要点

工业场景下,传感器侧的“地”和主控侧的“地”经常不是同一个电位。几十毫伏的地电位差还算能忍,几伏甚至几十伏的瞬时地电位差,轻则读数异常,重则击穿芯片。所以我的标准做法是在 UART 两根线之间加数字隔离器,隔离器放在主控侧,传感器侧由隔离后的 DC-DC 电源模块独立供电。

ADS122U04 的模拟电源和数字电源我习惯分开走线,AGND 和 DGND 在 ADC 底部单点汇合。电源引脚旁路电容用 1µF 加 0.1µF 组合,基准电阻要离 ADC 的 REFP 和 REFN 引脚尽量近,走线短而粗,两侧加地过孔包围。模拟输入端的地要单独铺一个岛,数字信号线和时钟线不要从模拟区域穿过。这些布局规则看着琐碎,但 24 位 ADC 对噪声的敏感程度远超想象,layout 决定下限。

传感器板上的接插件要选带锁扣的,工业现场振动比较大,普通排针松松垮垮很容易造成间歇性接触不良,这个坑我碰到过不止一次。

3. 固件实现:寄存器配置、数据读取和温度换算

3.1 初始化 PIC32MZ 的 UART 外设

我在 Harmony 里生成底层代码,但手动配置也能做,关键是两点:波特率误差和引脚映射。PIC32MZ 的引脚默认并不是 UART 功能,必须通过 PPS 外设引脚选择寄存器把 UART 的 RX、TX 映射到具体引脚上,这一步漏掉,串口永远没有反应。另一个是波特率发生器,公式是U2BRG = (外设时钟 / (16 × 波特率)) - 1,算出来的值不是整数时会产生误差,建议选一个能整除的频率,比如用 57600 而不是 9600。

ADS122U04 支持 9600 到 115200 的 UART 速率,我一般用 57600,因为这个速率在这个芯片的时钟配置下误差最小。如果用了隔离器,还要注意隔离器的传输延迟,波特率误差容忍度自然放宽一些。

void uart2_init(uint32_t baud) { __builtin_disable_interrupts(); // 关闭UART2,先做配置 U2MODEbits.ON = 0; // 8位数据、无校验、1位停止位 U2MODEbits.PDSEL = 0; U2MODEbits.STSEL = 0; U2MODEbits.BRGH = 0; // 标准速度模式 // 波特率计算,其中GetPeripheralClock()返回外设时钟频率 U2BRG = (GetPeripheralClock() / (16 * baud)) - 1; // 使能UART并将引脚映射配置好 U2MODEbits.ON = 1; U2STAbits.UTXEN = 1; U2STAbits.URXEN = 1; }

这里有一个实践细节:PIC32MZ 的外设时钟默认可能和系统时钟不一致,要看 Harmony 里 UART 时钟片选。如果算错时钟,波特率偏了,ADS122U04 可能完全不应答。调试时用示波器看 TX 波形,量一下实际波特率,能省去很多无头绪的排查。

3.2 配置 ADS122U04 的寄存器

ADS122U04 的寄存器配置总共四个,每次上电先发 RESET 命令,让芯片回到已知状态,然后再写配置。寄存器 0 定义输入多路开关选择和 PGA 增益,寄存器 1 定义数据速率和工作模式,寄存器 2 选择基准电压和电流源大小,寄存器 3 控制 IDAC 电流输出去向和内置温度传感器开关。

寄存器具体每一位的定义可以直接参考芯片手册,我不喜欢背位字段,原则是:写完之后一定要读回来校验。UART 通信在工业环境里有误码,如果写进去和读出来不一致,说明链路已经不可靠,这时候要重新写并且查隔离器或接线。

命令封装函数我习惯统一做成一个模块,对外暴露几个接口:ads122u04_write_reg、ads122u04_read_reg、ads122u04_read_data。底层的发送接收都走同一个缓冲区,这样后面换 MCU 平台时,只需要改最底层的 UART 读写函数。

uint8_t ads122u04_read_data(uint8_t *status, int32_t *raw) { uint8_t buf[4]; ads122u04_cmd(0x10); // RDATA命令,具体命令码以手册为准 if (ads122u04_read_bytes(buf, 4) != 4) { return 0; } *status = buf[0]; *raw = (int32_t)((buf[1] << 16) | (buf[2] << 8) | buf[3]); // 转为有符号数,24位,负数要扩展符号位 if (*raw & 0x800000) { *raw |= ~0xFFFFFF; } return 1; }

采样模式我一般选择连续转换,因为这样固件不需要每采一次就启动一次转换,省去命令交互时间。连续模式下的数据流是持续的,每帧 4 字节,主循环只需判断缓冲区里是否有完整帧。

3.3 数据读取与数字滤波

直接从 ADC 拿到的原始码是不能直接用的,先转成电压,再转成温度。ADS122U04 的满量程输入范围和 PGA 增益有关系,内部基准通常是 2.048V,可测量的差分输入范围大约是±2.048 / 增益。电压换算公式是电压 = 原始码 × 满量程电压 / 8388608,这里 8388608 就是 2 的 23 次方。

滤波方面,我最开始只用平均值,后来发现现场偶发的脉冲干扰会被平均算法拖尾很久。改成中值加均值的两级方案:第一级中值滤波窗口 5,把脉冲干扰剔除;第二级平均值窗口 4,把随机噪声压住。这个组合在工业现场的实测效果比单纯平均好得多,代码开销也不大。

如果系统要求快速响应,比如风机温度保护需要快速判断过温,可以只用一阶低通滤波,系数取 0.2 到 0.5 之间,响应和噪声之间取平衡。不要在一开始就堆很重的滤波算法,应该先用原始数据观察噪声形态,再决定滤波策略。这一步建议做成一个开关,调试时能关掉滤波直接看原始码。

3.4 PT100 温度换算:查表法和计算法

PT100 的温度换算,工业现场最常用的是查表加线性插值。表格按 1°C 间隔存放对应阻值,查表找到相邻两个温度点,然后线性插值。这样做速度快、代码简单,误差大约在 0.1°C 以内。如果想要更高精度,可以用 Callendar-Van Dusen 方程直接计算。

0°C 以上,PT100 的阻值和温度关系满足二次方程,可以直接求根。0°C 以下多了一个高次项,需要迭代几次。我自己的实现是:先判断温度正负,0°C 以上用求根公式,0°C 以下用牛顿迭代,迭代四五次就能收敛到 0.01°C。FPU 的存在让这段计算跑得非常快,完全不影响系统实时性。

double pt100_to_temperature(double r) { // 简单版本,只覆盖0~850°C const double A = 3.9083e-3; const double B = -5.775e-7; const double R0 = 100.0; // r >= R0 时直接用二次求根 double disc = A*A - 4*B*(1.0 - r/R0); if (disc < 0) return -999; return (-A + sqrt(disc)) / (2*B); }

真正到做产品的时候,我更推荐先从厂家拿 PT100 分度表,转成静态数组存进 flash,然后查表和插值。原因很简单:方程计算对参数一致性要求高,如果传感器不是标准 PT100,而是有点偏差的廉价传感器,现场往往需要做一点偏移修正,查表代码里改偏移量比改方程参数直观得多。

3.5 热电偶冷端补偿的实现

热电偶输出的是热端和冷端之间的温差电动势,不能直接当温度用。补偿流程是:先采集冷端温度,再采集热电偶电压,用冷端温度反查分度表得到“冷端对应的电压”,把它加到实测电压上,再正查分度表得到热端温度。用 ADS122U04 内置温度传感器时,读出来的内部温度就是芯片附近的结温,映射为冷端参考点。

需要特别注意的是单位统一。内部温度传感器读出的值通常是摄氏度,热电偶分度表给的是摄氏度对应的毫伏值,两边单位不一致会导致整体温度偏移常数。我刚开始做调试时就是这里没统一,结果整个读数比实际高了好几度,排查了很久才发现是内部温度传感器数值处理的时候乘了个错误系数。

工业现场如果冷端端子离 ADC 很远,内部温度传感器就没法用了。这时候要在端子排上放一个 NTC 或者数字温度芯片,单独接一个测量通道。NTC 的精度直接影响补偿效果,推荐用 1% 精度 B 值 3435 的 10k NTC,25°C 附近误差小。当然更省心的方案是直接在端子上贴一块 PT100 做冷端测量,但成本和布线复杂度都会上来。

4. 从 HVAC 到工业现场:两类典型场景的部署方式

4.1 HVAC 场景:多点测量与成本控制

HVAC 系统里的典型温度测点包括风管回风温度、送风温度、冷冻水供回水温度、冷却水温度。温度范围基本在 -40°C 到 150°C,精度要求 ±0.5°C,少数对舒适度要求高的场合要求 ±0.3°C。这类场景有一个明显特点:测点数量多,一块控制器往往要同时接好几个模块,成本敏感度比其他场合高。

ADS122U04 四个输入通道如果全按单端模式使用,可以接四路 NTC 或者四路 PT1000。NTC 的响应速度慢,但用在风管和水管温度上完全够,性价比极高。PT1000 比 PT100 信号大十倍,引线电阻影响相对小,HVAC 里更合适。每次采样前我用 ADC 的内部多路开关切换通道,通道间读数差极短暂,控制系统完全感知不到。

HVAC 现场的干扰主要来源是压缩机启停和变频风机,工频分量居多,把 ADS122U04 的 50Hz 滤波功能打开后读数就会稳很多。冷水机组的管道温度采集如果直接从传感器板接到控制板,走线尽量避开变频器输出电缆,这是电缆沟布局的事,比在电路上补滤波更省钱。

4.2 工业场景:宽温、长距离和环境恶化

工业温度采集的典型点位是热电偶炉温、冷轧液温度、电机轴承温度、泵体温度,温度范围动不动到几百摄氏度,传感器以热电偶和 PT100 为主。工业现场的干扰频带比 HVAC 宽得多,变频器、电机换向、电焊机都会制造从低频到高频的噪声。这些能量耦合进传感器线缆后,如果不在前端处理干净,后面算法再强也救不回来。

我的做法是传感器线缆全用屏蔽双绞线,屏蔽层单点接地,位置选在主控端。传感器分板的前端电路和主控板之间加数字隔离器,从物理上断开地环路。模拟信号侧不做隔离器,而是利用 ADC 自身的共模抑制能力配合滤波。隔离后的电源用隔离 DC-DC 供电,前端电路的电源纹波控制在 10mV 以内,否则会对 24 位 ADC 的读数造成明显干扰。

工业现场还有传感器断线和短路的问题。断线检测可以利用 ADS122U04 内部的传感器检测功能,定期给输入引脚提供固定电流,观察引脚电压是否落在正常范围。这套功能平时不启用,我一般在主循环里每隔一段时间做一次“健康检查”,发现异常就报警,比用户看到读数异常再处理要主动得多。

4.3 同一套硬件适配两种场景的配置思路

我在这套平台上做了一个配置文件的概念:把每个通道的类型定义成参数,比如通道 0 是 PT100 三线、通道 1 是 K 型热电偶、通道 2 是 NTC。不同项目只需要在出厂前修改配置表,固件代码不动。这个思路在备件管理上特别有优势,硬件板卡只有一种,现场无论是 HVAC 还是工业,插上直接就能用。

扩展方向也明确:这个硬件架构可以扩展成多通道 RTD 采集模块,也可以加一个 CAN 或者 RS485 从站接口做远程采集。PIC32MZ1024EFH064 的资源绰绰有余,后续接以太网、WiFi 模块都不吃力。我建议在做第一版 PCB 时把 UART、SPI、GPIO 的备用引脚都引出来,后期扩展不用重新设计主板。

5. 调试实录:常见问题与排查技巧

5.1 UART 完全不通

遇到 ADS122U04 没反应,先别怀疑芯片坏了,按顺序排查:第一,PPS 引脚映射配了没有,PIC32MZ 的 UART 引脚默认不是 UART 功能,这步漏掉太多;第二,波特率算得对不对,用示波器看 ADC 的 TX 引脚上是否有波形;第三,如果用了数字隔离器,注意隔离器的方向是否正确,RX、TX 接反了照样不通。快速定位的土办法是直接把隔离器拆掉,用飞线临时短接,看能不能通,能通就是隔离器配置问题。

5.2 读数跳字,码值有大毛刺

这种问题绝大多数出在电源上。24 位 ADC 对 VDD 上的高频纹波极其敏感,尤其是开关电源引入的纹波。先看原理图,ADS122U04 的电源引脚是否正确地放置了 1µF 陶瓷电容加 0.1µF 电容的组合。再看布局,DVDD 和 AVDD 是否分开走线,地是否在 ADC 底下单点汇合。都排完还跳字,就用示波器夹住参考电压引脚看瞬间跌落,如果基准电阻两端有毛刺,多半是旁路电容不合适或者基准电阻离 ADC 太远。

5.3 50Hz 工频干扰严重

读数呈周期性波动时,优先怀疑工频。HVAC 现场特别常见,因为风机、水泵、变频器都是工频设备。ADS122U04 自带滤波模式,打开之后对工频的抑制会明显变好。另一个土办法是把数据速率设到 20SPS,ADC 的积分时间对齐到 50ms,工频干扰在积分窗口内被自然平均掉。这个方法对 60Hz 地区同样适用,把速率设成 16.7SPS 对齐 60ms 也能有同样的效果。

5.4 测出来的温度和实际不符

先判断偏移方向:如果整体偏高或偏低一个固定值,多半是冷端补偿或者基准电阻温漂问题。如果只在部分温度区间有偏差,那大概率是传感器非线性没有处理好。我在实验室的做法是用精密电阻箱替换传感器,给 PT100 通道依次输入 100Ω、119.4Ω、138.5Ω,对应 0°C、50°C、100°C,看输出码值和显示的换算温度是否一致。这样把问题明确隔离在“硬件电路”还是“固件算法”上,不用去拆整套系统。

6. 经验总结与扩展方向

做了这几个项目之后,我的体会是:24 位 ADC 这类芯片真正的难点不在传感器本身,而在整个信号链的稳定性和可维护性。ADS122U04 这种带 UART 的 ADC,把板间通信和隔离这两个最容易被忽略的环节大大简化了,配合 PIC32MZ1024EFH064 这种资源充裕的 MCU,一套代码基本能跑遍 HVAC 和大多数工业温度采集场景。

最后再分享一个实测小技巧,是我调这套平台时最受益的经验:调试时先看 ADC 原始码转出来的电压值,而不是直接盯着温度。传感器引脚的电压用万用表一量就知道数量级对不对,如果这一步对不上,后面所有温度换算都是白算。先把原始码转电压的环节验证通过,再谈查表和补偿,代码逻辑哪里有问题,很快就能定位到具体函数。这个习惯让我少走了很多弯路,也推荐给你试试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 11:03:51

车载Android显示开发核心指南:从冷启动优化到多屏适配实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 11:03:31

Rill Sound:ESP32-S3上的嵌入式WebAssembly音频可视化系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 11:02:18

ADS122U04 + STM32F437ZG 温度采集方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 11:01:53

ESP32 BLE鼠标开发实战:从零打造指环鼠标的HID链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 11:00:19

车载显示开发实战:从多屏映射到启动优化的关键技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 10:57:04

C++哈希表之闭散列方法的模拟实现详解

前言 哈希表&#xff08;hash table&#xff09;解决的是「按 key 快速查找」的问题。当不同 key 被映射到同一个桶时&#xff0c;就需要冲突处理。常见做法有两类&#xff1a;开链法&#xff08;separate chaining&#xff09;在每个桶上挂一条链表&#xff1b;闭散列&#xf…

作者头像 李华