PIC18F2480 10 位 ADC 采样偏低怎么调:12.86 µs 采样时间与 ACQT、TAD 核算七步落地

换通道后第一帧偏低、读数随信号源内阻变大而下降,多半是采样电容没充满。按 PIC18F2480 数据手册第 19 章拆解 120 pF 充电公式、ACQT 八档与 TAD 下限,给出 12.86 µs 核算与七步配置。

2026-11-05
PIC18F248010位ADC采样时间ACQTTAD模拟采集

一块 12 路 4-20 mA 采集板,用 PIC18F2480 的 10 位 ADC 轮流采样,现象很怪:刚上电读数正常,切换通道后的第一帧总偏低,信号源内阻大一点偏得更厉害,过几帧又慢慢爬回来。代码里 GO 置位、等转换完成、读结果,看着没问题。结论先给:问题出在采样保持电容没充满——PIC18F2480 的采样电容是 120 pF,源阻抗、内部采样开关电阻和引脚漏电流一起决定充电时间,手册算出来的最坏情况需要 12.86 µs;ACQT 设成 0 TAD 就等于把这个时间完全交给软件,而软件往往没等。

本文按 Microchip PIC18F2480/2580/4480/4580 数据手册(DS39637C)第 19 章整理,寄存器定义、采样模型与算例均取自该章。

一、10 位 ADC 的速度账:先看 11 个 TAD

这颗器件的 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 下的 TAD40 MHz 下的 TAD是否满足约 2 µs 下限
FOSC/20000.1 µs0.05 µs否
FOSC/80010.4 µs0.2 µs否
FOSC/320101.6 µs0.8 µs否
FOSC/41000.2 µs0.1 µs否
FOSC/161010.8 µs0.4 µs否
FOSC/641103.2 µs1.6 µs20 MHz 可以,40 MHz 不足
内部 RC111 / 011——休眠采集必须用它

表 19-1 还给了一列“最大器件频率”,看起来 64 分频在 40 MHz 也能用;但正文又要求 TAD 不低于约 2 µs。两句话要同时满足,40 MHz 下 64 分频只有 1.6 µs,按参数 130 就得降主频或改用内部 RC。工程上宁可留余量,别贴着上下限配。

二、12.86 µs 是怎么算出来的

采样保持的等效电路很朴素:信号源电阻 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 的终值误差取对数。

项目取值说明
放大器建立时间 TAMP5 µs固定项,与外部电路无关
温度补偿 TCOFF0.05 µs/℃25 ℃ 以上才计,50 ℃ 时 1.25 µs
采样电容充电 TC9.61 µs120 pF ×(1 kΩ+7 kΩ+2.5 kΩ)× ln(2048)
最小采样时间 TACQ12.86 µs5 + 1.25 + 9.61

把 RS 从 2.5 kΩ 换成 10 kΩ,充电项会涨到约 21.6 µs,总采样时间逼近 28 µs。这就是现场“信号源内阻一大,读数就低”的来历:不是 ADC 坏了,是采样窗口根本不够。遇到这种情况,正确做法是加一级运放缓冲把源阻抗降下来,而不是把 ACQT 一味加大,因为采样时间最终会挤占通道轮询周期。

三、ACQT 八档:把采样时间写进硬件

ADCON2 的 ACQT<2:0> 提供 0 到 20 个 TAD 的自动采样时间。置位 GO/DONE 后,模块先继续采样 ACQT 个 TAD,再自动开始转换,软件不用在选通道和置 GO 之间插延时。设为 000 则关闭自动采样,回到“软件自己等”的老办法,兼容没有该功能的器件。

ACQT<2:0>自动采样时间TAD=3.2 µs 时是否覆盖 12.86 µs
0000 TAD0否,需软件等待
0012 TAD6.4 µs否
0104 TAD12.8 µs差 0.06 µs,不建议
0116 TAD19.2 µs是,留约 50% 余量
1008 TAD25.6 µs是,适合高阻源
10112 TAD38.4 µs是,代价是速度
11016 TAD51.2 µs是
11120 TAD64 µ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,就会出现“某几路一上电就飘”的现象。

五、休眠采集与 CCP1 触发

电池设备常让 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 忽略,但定时器照样会被清零,这个不对称很容易让人误判“触发没生效”。

六、七步落地:从引脚到结果

  1. 按信号源阻抗核算 TACQ,确认 12.86 µs 这条底线,源阻抗超过 2.5 kΩ 先加缓冲。
  2. 用 ADCON1 的 PCFG 划出模拟通道,需要外部基准时预留 AN2、AN3。
  3. 按主频选 ADCS,保证 TAD 不低于约 2 µs;20 MHz 下直接选 64 分频。
  4. 按 TACQ 选 ACQT,TAD=3.2 µs 时至少 6 TAD,高阻源选 8 TAD。
  5. 把对应 TRIS 位置 1,置 ADON;不要把 ADON 和 GO/DONE 写在同一条指令里。
  6. 置 GO/DONE 启动转换,轮询等待其清零,或开 ADIE 走中断。
  7. 按 ADFM 选的对齐方式读 ADRESH:ADRESL;右对齐时高字节只有低 2 位有效。
/* 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 没清 0ADCS=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小时内响应