换通道后第一帧偏低、读数随信号源内阻变大而下降,多半是采样电容没充满。按 PIC18F2480 数据手册第 19 章拆解 120 pF 充电公式、ACQT 八档与 TAD 下限,给出 12.86 µs 核算与七步配置。
一块 12 路 4-20 mA 采集板,用 PIC18F2480 的 10 位 ADC 轮流采样,现象很怪:刚上电读数正常,切换通道后的第一帧总偏低,信号源内阻大一点偏得更厉害,过几帧又慢慢爬回来。代码里 GO 置位、等转换完成、读结果,看着没问题。结论先给:问题出在采样保持电容没充满——PIC18F2480 的采样电容是 120 pF,源阻抗、内部采样开关电阻和引脚漏电流一起决定充电时间,手册算出来的最坏情况需要 12.86 µs;ACQT 设成 0 TAD 就等于把这个时间完全交给软件,而软件往往没等。
本文按 Microchip PIC18F2480/2580/4480/4580 数据手册(DS39637C)第 19 章整理,寄存器定义、采样模型与算例均取自该章。
这颗器件的 ADC 是逐次逼近型,每个二进制位对应一个 TAD,一次 10 位转换固定要 11 个 TAD。TAD 由 ADCON2 的 ADCS<2:0> 从器件时钟分频得到,也可以用内部 RC。手册要求 TAD 尽量短但不能低于约 2 µs(见参数 130),因为内部比较器和电荷 redistribution 都需要建立时间。两条限制一夹,采样率上限就定死了:20 MHz 下选 64 分频得 TAD=3.2 µs,一次转换 35.2 µs,单通道轮询也就两万八千次每秒左右。
| TAD 来源 | ADCS<2:0> | 20 MHz 下的 TAD | 40 MHz 下的 TAD | 是否满足约 2 µs 下限 |
|---|---|---|---|---|
| FOSC/2 | 000 | 0.1 µs | 0.05 µs | 否 |
| FOSC/8 | 001 | 0.4 µs | 0.2 µs | 否 |
| FOSC/32 | 010 | 1.6 µs | 0.8 µs | 否 |
| FOSC/4 | 100 | 0.2 µs | 0.1 µs | 否 |
| FOSC/16 | 101 | 0.8 µs | 0.4 µs | 否 |
| FOSC/64 | 110 | 3.2 µs | 1.6 µs | 20 MHz 可以,40 MHz 不足 |
| 内部 RC | 111 / 011 | — | — | 休眠采集必须用它 |
表 19-1 还给了一列“最大器件频率”,看起来 64 分频在 40 MHz 也能用;但正文又要求 TAD 不低于约 2 µs。两句话要同时满足,40 MHz 下 64 分频只有 1.6 µs,按参数 130 就得降主频或改用内部 RC。工程上宁可留余量,别贴着上下限配。
采样保持的等效电路很朴素:信号源电阻 RS、引脚互连电阻 RIC、内部采样开关电阻 RSS 串起来给 CHOLD 充电。手册给的典型值是 CHOLD=120 pF、RIC≤1 kΩ、5 V 下 RSS≈7 kΩ,并建议模拟源阻抗不超过 2.5 kΩ。充电到 1/2 LSb 误差以内,时间常数为(RIC+RSS+RS)×CHOLD,按 1/2048 的终值误差取对数。
| 项目 | 取值 | 说明 |
|---|---|---|
| 放大器建立时间 TAMP | 5 µs | 固定项,与外部电路无关 |
| 温度补偿 TCOFF | 0.05 µs/℃ | 25 ℃ 以上才计,50 ℃ 时 1.25 µs |
| 采样电容充电 TC | 9.61 µs | 120 pF ×(1 kΩ+7 kΩ+2.5 kΩ)× ln(2048) |
| 最小采样时间 TACQ | 12.86 µs | 5 + 1.25 + 9.61 |
把 RS 从 2.5 kΩ 换成 10 kΩ,充电项会涨到约 21.6 µs,总采样时间逼近 28 µs。这就是现场“信号源内阻一大,读数就低”的来历:不是 ADC 坏了,是采样窗口根本不够。遇到这种情况,正确做法是加一级运放缓冲把源阻抗降下来,而不是把 ACQT 一味加大,因为采样时间最终会挤占通道轮询周期。
ADCON2 的 ACQT<2:0> 提供 0 到 20 个 TAD 的自动采样时间。置位 GO/DONE 后,模块先继续采样 ACQT 个 TAD,再自动开始转换,软件不用在选通道和置 GO 之间插延时。设为 000 则关闭自动采样,回到“软件自己等”的老办法,兼容没有该功能的器件。
| ACQT<2:0> | 自动采样时间 | TAD=3.2 µs 时 | 是否覆盖 12.86 µs |
|---|---|---|---|
| 000 | 0 TAD | 0 | 否,需软件等待 |
| 001 | 2 TAD | 6.4 µs | 否 |
| 010 | 4 TAD | 12.8 µs | 差 0.06 µs,不建议 |
| 011 | 6 TAD | 19.2 µs | 是,留约 50% 余量 |
| 100 | 8 TAD | 25.6 µs | 是,适合高阻源 |
| 101 | 12 TAD | 38.4 µs | 是,代价是速度 |
| 110 | 16 TAD | 51.2 µs | 是 |
| 111 | 20 TAD | 64 µs | 是 |
4 TAD 那一档很值得注意:12.8 µs 只差 0.06 µs,实验室常温下可能看不出问题,到了 50 ℃ 高温或批次差异就会露头。这也是为什么建议至少选 6 TAD。另外一个细节是,自动采样结束后没有任何标志告诉你“采样已结束、转换已开始”,只有转换完成时 GO/DONE 清零、ADIF 置位,所以别指望用轮询判断采样阶段。
第一是方向寄存器。模拟输入对应的 TRIS 位必须置 1 设成输入;如果误设成输出,转换的其实是引脚输出的高低电平。反过来,被 PCFG 配成数字输入的引脚上如果加着模拟电平,输入缓冲器会超出规格耗电,读 PORT 还会读到 0。
第二是参考电压占通道。VCFG0=1 时 VREF+ 来自 AN3,VCFG1=1 时 VREF- 来自 AN2;一旦启用外部基准,这两个引脚就不能再当普通模拟输入用。做 12 路采集却把 AN2、AN3 排进信号列表,是最常见的“两路读数永远不对”。
第三是上电默认值。PCFG 的复位值受配置字 PBADEN 影响:PBADEN=1 时 PCFG=0000,全部通道按模拟处理;PBADEN=0 时 PCFG=0111,AN0 到 AN7 为模拟、其余为数字。移植代码时只改 ADCON0 不改 ADCON1,就会出现“某几路一上电就飘”的现象。
电池设备常让 CPU 睡着、ADC 自己采。手册要求休眠期间必须用内部 RC 作为 A/D 时钟;如果 ACQT=000 并启动转换,转换会延后一个指令周期开始,目的就是让 SLEEP 指令先执行完。进休眠前还要把 IDLEN 清 0,否则芯片进的是空闲模式而不是休眠。
需要和 PWM 同步采样时,可以用 ECCP1 的特殊事件触发:把 ECCP1M<3:0> 配成 1011,触发信号会置位 GO/DONE 并同时把 Timer1 或 Timer3 清零,下一个周期自动重复。注意前提是 ADON 已经置 1;ADON=0 时触发被 ADC 忽略,但定时器照样会被清零,这个不对称很容易让人误判“触发没生效”。
/* PIC18F2480,FOSC=20 MHz,AN0 单通道,右对齐 */
void adc_init_an0(void)
{
ADCON0 = 0x00; /* CHS=0000 选 AN0,ADON 先关 */
ADCON1 = 0x0E; /* VCFG=00 用 AVDD/AVSS,PCFG=1110 仅 AN0 模拟 */
ADCON2 = 0xA6; /* ADFM=1 右对齐,ACQT=100(8 TAD),ADCS=110(FOSC/64) */
TRISA0 = 1; /* 模拟输入必须是输入方向 */
ADCON0bits.ADON = 1; /* 单独一条指令开模块 */
}
uint16_t adc_read_an0(void)
{
ADCON0bits.GO = 1; /* 先自动采样 8 TAD,再转换 11 TAD */
while (ADCON0bits.GO) { ; } /* 35.2 µs + 25.6 µs 后完成 */
return ((uint16_t)ADRESH << 8) | ADRESL;
}
这段配置在 20 MHz 下单次“采样+转换”约 60.8 µs,12 路轮询一遍约 0.73 ms。如果系统要求更快,只能降源阻抗后改小 ACQT,或者提高主频再重算 TAD,不能直接砍采样时间。
| 现象 | 根因 | 改法 |
|---|---|---|
| 换通道后第一帧偏低 | ACQT=000,软件没等够采样时间 | 设 6 到 8 TAD,或保留原延时 |
| 读数随信号源内阻变大而偏低 | RS 超过 2.5 kΩ,CHOLD 充不满 | 加运放缓冲,再复核 TACQ |
| 数值无规律跳动 | TAD 低于约 2 µs,比较器没建立完 | 改用 64 分频或内部 RC |
| 高通道号一直读满量程 | 选了 2X80 上不存在的 AN5 到 AN7 | 核对型号通道数,改 PCFG 与 CHS |
| 休眠唤醒后读到旧值 | 没用内部 RC,或 IDLEN 没清 0 | ADCS=111,进休眠前清 IDLEN |
| 10 位结果只有 8 位在动 | ADFM 设成左对齐却按右对齐解析 | 统一对齐方式,右对齐读 16 位拼接 |
一句话总结:ADC 读数偏低先别怀疑芯片,把采样时间这笔账算清楚——120 pF 的采样电容、2.5 kΩ 的源阻抗上限、12.86 µs 的最坏充电时间,决定了 ACQT 最低选几档、TAD 最低取多少;算完再配寄存器,第一帧就不会再骗人。
还想接着看:PIC16F877A ADC 校准与 EEPROM 参数存储、嵌入式 ADC 高精度采集设计、PIC18F2480 EUSART 自动波特率校准。
本文基于 Microchip PIC18F2480/2580/4480/4580 数据手册(DS39637C)技术资料整理优化。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应