找回密码
 立即注册
楼主: ggqqss

ADC采样值不正常

[复制链接]

2

主题

7

回帖

2023

积分

金牌会员

积分
2023
 楼主| 发表于 2026-8-22 12:12:59 | 显示全部楼层
主频11.0592MHz,设置ADCCFG = 0x8f, 没有作用,故障依旧。
回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 2026-8-22 13:12:05 | 显示全部楼层
ggq*** 发表于 2026-8-22 12:12
主频11.0592MHz,设置ADCCFG = 0x8f, 没有作用,故障依旧。

楼主可以将故障板子的R19、R21阻值减小到10%以确定故障与R19、R21阻值过大相关。至于ADC省电取样的方法多得是,不必纠结于此。
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
发表于 2026-8-22 15:16:13 | 显示全部楼层
如果有多余IO口,可以考虑IO口控制采样的gnd,采集时刻开一下,采完了恢复高阻即可达到省电,ADC本身也有输入阻抗,采样电阻太大了可能干扰比较严重一些

如果不想修改电路,可以尝试如下办法:
设置ADC采样端口为开漏,每次采样前对adc端口短暂置0,然后拉高到1恢复,此时等待一会再采样ADC,可以有效去掉电压残影(或者由于采样电阻太大导致的ADC保持电容放电不充分问题)
回复

使用道具 举报 送花

已绑定手机

0

主题

6

回帖

54

积分

注册会员

积分
54
发表于 2026-8-22 15:43:14 | 显示全部楼层
return ((int)ADC_RES)<<8|ADC_RESL;     //返回十位ADC结果
回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 2026-8-22 21:19:03 | 显示全部楼层

两种ADC测量电源电压的省电电路,
图1 IO口测量时准双向低电平,停止时高阻。
图2 IO口测量时强推挽高电平,停止时高阻。

无标题.jpg

回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-8-22 22:30:27 | 显示全部楼层

我已经获取了所有关键信息。现在让我综合分析这个问题。

根据您的原理图、代码、论坛讨论以及 STC8H 手册规范,我为您做一个深入、系统性的分析。


STC8H8K64U ADC 采样值(批次异常)问题综合分析

一、原理图问题分析

从您的原理图可以看到,ADC10(P0.2)通道采集电池电压,分压电路结构为:

  • R19(接 VCC_TEST)与 R21 1M 与 C14 100nF 构成分压+滤波网络
  • 分压后的信号送到 P0.2 / ADC10 引脚

这里最大的问题在于:外部源阻抗极高(1MΩ 级),这对 ADC 采样精度和一致性影响极大。

二、手册规范依据(核心结论)

根据 STC8H 手册「ADC模数转换,内部1.19V参考信号源」 章节,ADC 的电气特性如下:

参数 典型值
通道等效电阻​R_{AIN} ∞(无穷大,理想值)
采样保持电容前串接抗静电电阻​R_{ESD} 700Ω
内部采样保持电容​C_{ADC} 16.5pF

手册明确指出:

"适当加长对外部信号的采样时间,就是对ADC内部采样保持电容的充电或放电时间,时间够,内部才能和外部电势相等。"

同时手册强调:

"被选择为ADC输入通道的I/O口,必须设置PxM0/PxM1寄存器将I/O口模式设置为高阻输入模式。"

三、您代码中的几个关键问题

问题 1:ADC 输入引脚未设置为高阻输入(最关键!)

从您提供的代码中,没有看到设置 P0M0/P0M1 将 P0.2 设为高阻输入。手册明确要求被选为 ADC 输入通道的 I/O 口必须设为高阻输入模式。

如果 P0.2 处于准双向模式(默认复位值),内部有弱上拉电阻(270~150μA),会与外部 1MΩ 分压网络产生不可忽略的分压效应,导致:

  • 各芯片批次间弱上拉阻值有制造误差(手册标注"存在制造误差")
  • 弱上拉电流会叠加在外部 1MΩ 分压上,引起采样点电位偏移
  • 不同批次芯片的弱上拉电流不同,从而造成"批次差异"

问题 2:外部源阻抗过高,采样电容充电不足

根据手册,ADC 内部采样保持电容为 ​C_{ADC}=16.5pF,且前端串接 ​R_{ESD}=700Ω。外部是 1MΩ 分压 + 100nF 滤波电容。

  • 外部源阻抗高达 1MΩ,而 ADC 内部采样窗口只有 SMPDUTY 设定的时钟数
  • 在极短采样时间内,16.5pF 采样电容无法通过 1MΩ 高阻源充分充电到外部真实电压
  • 采样值更多反映的是采样电容上的残留电荷,而非当前外部电压
  • 不同批次芯片的内部特性差异被放大,导致"少数板子电压降低采集值反而升高"的异常现象

问题 3:ADC 时钟频率配置

您的代码中 ADCCFG = 0x2f,即 SPEED[3:0]=1111,​F_{ADC}=SYSclk/2/16。

假设系统主频为 40MHz(STC8H8K64U 支持外置 40MHz 晶振):

  • ​F_{ADC} = 40MHz / 2 / 16 = 1.25MHz
  • 手册规定 12位ADC最快速度为800K,10位ADC最快为500K(每秒转换次数)
  • 您的 ADC 时钟远超手册规定范围,属于超频使用

实际上您已经尝试把 ADCCFG=0x8f(即 SPEED=1111,​F_{ADC}=SYSclk/2/16),在 11.0592MHz 主频下为 11.0592/2/16 ≈ 0.35MHz,这个频率本身是合适的,但您反馈"没有作用"——这说明问题不在 ADC 时钟频率,而在于外部源阻抗和 I/O 模式。

四、为什么会出现"电压降低,采集值反而升高"的反向异常

这个反向现象的根本原因是:ADC 采样瞬间,采样电容上的电荷没有真正反映外部信号。

结合论坛用户 回复 2(王***) 的分析:

"ADC本身也有输入阻抗,采样电阻太大了可能干扰比较严重。如果不想修改电路,可以尝试:设置ADC采样端口为开漏,每次采样前对adc端口短暂置0,然后拉高到1恢复,此时等待一会再采样ADC,可以有效去掉电压残影(或者由于采样电阻太大导致的ADC保持电容放电不充分问题)"

具体机制:

  1. 外部 1MΩ 分压 + 100nF 滤波电容形成 RC 网络,时间常数 ​\tau = 1MΩ \times 100nF = 100ms,极大
  2. 当外部电压下降时,100nF 上的电荷需要通过 1MΩ 缓慢释放,但释放速度远慢于采样频率
  3. ADC 采样瞬间,16.5pF 采样电容与外部网络快速交换电荷
  4. 如果前一次采样后采样电容上残留的电荷尚未通过 1MΩ 完全泄放,就会导致本次采样值偏高(而不是跟随外部降低)
  5. 不同批次芯片内部采样电容的电荷泄放路径(漏电)特性和弱上拉电流不一致,导致部分板子出现反向现象

五、解决方案

方案 1:修正 I/O 口模式(必做,手册强制要求)

// P0.2 设为高阻输入(ADC10)
P0M0 &= ~0x04;  // P0.2 的 M0 位清零
P0M1 |=  0x04;  // P0.2 的 M1 位置1 → 高阻输入

方案 2:降低外部源阻抗(论坛回复 1/5/6 的核心建议)

论坛 网*** 回复:

"分压电阻阻抗太高,跟滤波电容形成的RC滞后过大……建议减少电容容量,加个跟随器做缓冲,用软件滤波来抗干扰。"

以及 wul*** 回复:

"如果为了省电,可以用一个空闲IO置高电平经过小一点的分压电阻采样,采样结束这个IO置低电平。"

推荐做法(省电且保证精度):

  • 用一个 空闲 I/O 作为采样电源开关:采样时该 I/O 输出高电平,通过 较小阻值(如 10kΩ~100kΩ) 的分压电阻供电,采样结束后该 I/O 置为高阻,实现省电
  • 或加 运放电压跟随器 做缓冲,彻底消除源阻抗影响

方案 3:加长采样时间

手册强调:

"适当加长对外部信号的采样时间,就是对ADC内部采样保持电容的充电或放电时间,时间够,内部才能和外部电势相等。"

建议增大 ADCTIM 中的 SMPDUTY[4:0] 到最大值 31(11111B),以获取最长采样窗口。

方案 4:ADC 模块上电后延时约 1ms

手册明确指出:

"给 MCU 的内部ADC 模块电源打开后,需等待约1ms,等MCU内部的ADC电源稳定后再让ADC工作。"

您的代码中 ADCInit() 打开 ADC 电源后立即采样,没有延时,这也会导致首采样值异常。

方案 5:去掉或减小外部滤波电容

C14 100nF 与 1MΩ 形成的时间常数 ​\tau = 100ms,对于电池电压这种缓变信号本不需要,但对采样瞬间的电荷交换影响巨大。建议减小到 1nF~10nF 或直接去掉。


六、综合结论

您的现象(部分板子电压降低采样值反而升高)不是芯片缺陷,而是外部电路设计 + I/O 模式配置不当共同导致的:

问题 影响
P0.2 未设为高阻输入 内部弱上拉与 1MΩ 分压网络分压,批次差异放大
外部 1MΩ 源阻抗过高 采样电容 16.5pF 无法充分充电/泄放,采样值失真
100nF 滤波电容过大 RC 时间常数 100ms,采样瞬间电荷交换异常
ADC 上电无 1ms 延时 首次采样值异常

最直接的验证方法(据论坛用户 fang*** 建议):将故障板子的 R19/R21 阻值减小 10 倍(如改为 100kΩ 左右),看故障是否消失。如果消失,就确认是源阻抗过高导致的批次差异放大问题。


信息来源:

  • STC8H 系列手册「21 ADC模数转换,内部1.19V参考信号源」章节
  • STC8H 系列手册「12 I/O口」章节
  • STC 论坛帖子《ADC采样值不正常》(thread-25361)

需要我为您提供一份修正后的完整 ADC 初始化 + 采样代码(基于 STC8H8K64U、含正确的 I/O 高阻设置、合理的采样时序和滤波),可以直接用于您的项目吗?


🔍 搜索 "https://www.stcaimcu.com/thread-25361-1-1.html"

📌 相关论坛讨论

  1. ADC采样值不正常

⏱️ 查找用时 16.7s | 总回答用时 36.7s

回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-8-22 22:34:48 | 显示全部楼层
截图202608222231482725.jpg


为何要分压 ?不在乎消耗的电流,可以 R19/R21 改小

截图202608222233463790.jpg
回复

使用道具 举报 送花

2

主题

7

回帖

2023

积分

金牌会员

积分
2023
 楼主| 发表于 2026-8-24 07:54:09 | 显示全部楼层
神*** 发表于 2026-8-22 22:34
为何要分压 ?不在乎消耗的电流,可以 R19/R21 改小

谢谢各位
回复

使用道具 举报 送花

6

主题

93

回帖

1188

积分

金牌会员

积分
1188
发表于 2026-8-24 09:21:37 | 显示全部楼层
楼主的MCU供电和ADC基准是外部的供电还是电池供电?
MCU我用了很多很少说ADC跑偏的,一般异常还是设计问题.
看分压内阻确实够高,
一般我做的都是尽量降低输入阻抗以保证响应速度和减小外部干扰.
回复

使用道具 举报 送花

2

主题

34

回帖

777

积分

高级会员

积分
777
发表于 2026-8-28 10:14:05 | 显示全部楼层
也遇到过类似情况,ADC采集温度,25-100°没问题,当超过100°,就出现不稳定现象。波动很大,软件滤波也没问题,电压也稳定。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-8 01:13 , Processed in 0.078072 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表