杨为民 发表于 2026-4-18 18:59:35

关于12位ADC 计算公式是除4096还是除4095的问题讨论

(1)这是1个2023年的帖子。
12位ADC 计算公式是/4096还是/4095;10位ADC 计算公式是/1024还是/1023https://www.stcaimcu.com/thread-2438-1-1.html(出处: 国芯人工智能技术交流网站)
在帖子中对于ADC转换公式“ADCn通道的输入电压= 转换结果 / 4096* ADC_VRef+”,各个大V和网友也纷纷给出了自己的看法。

(2)我也在17楼给出了我的观点:除数应该是4095还是4096?这是一个伪问题!
厂家和每个用户都可以做一个最简单的测试:将ADCn通道的管脚直接连接到ADC_VRef+管脚上,然后编程序读出转换结果的值是多少。
我的观点:无论这个转换值是多少,除数就是那个读数!
如果读出来的读数是4095=0x0FFF,那么上面公式里的除数就是4095!(3)近三年过去了,有网友又顶起了这个帖子,认为“4096是点.4095是段,电压是分段,不是分点...所以4095是在段内更精确.”我的回复是:不是精确,而是正确。二者的差别是:数学和逻辑上的正确是指在任意的精度下都是正确的。工程意义上的精确是指在一定的精度是正确的,超过了这个精度就是不正确的了!(4)我查了最新的芯片手册,结果还是4096:
(5)按照同一个芯片手册ADC转换结果是:
读取ADC结果的最大值为0xFFF=4095,不可能读出4096=0x1000来。(6)那么请有条件的网友亲自动手在实验板上做以下3个实验,请没有条件的网友亲自动脑子在大脑里做以下3个实验:第一个实验:将“ADC被转换通道的输入脚”用短接线连接到“ADC外部参考源”上进行测试,这时“ADC被转换通道的输入电压Vin”肯定等于“ADC外部参考源电压”(请不要问为什么等)。这时按照公式22.3.2的计算:12位ADC转换结果 = 4096。请问动手的和动脑的网友,你们的“12位ADC转换结果”是4096吗?第二个实验:将“ADC被转换通道的输入脚”用短接线连接到“ADC外部参考源”上进行测试,这时“ADC被转换通道的输入电压Vin”肯定等于“ADC外部参考源电压”(请不要问为什么等)。这时按照公式22.3.3的推导:用初中代数移项法得到 1 = 12位ADC转换结果 / 4096。请问动手的和动脑的网友,你们的“12位ADC转换结果”是4096吗?第三个实验:将“ADC被转换通道的输入脚”用短接线连接到“MCU工作电压Vcc管脚”上进行测试,这时“ADC被转换通道的输入电压Vin”肯定等于“MCU工作电压Vcc”(请不要问为什么等)。这时按照公式22.3.4的计算:用初中代数消去法得到 1 = 4096 / 12位ADC转换结果 。请问动手的和动脑的网友,你们的“12位ADC转换结果”是4096吗?
(7)其实有网友在该贴的36楼已经给出了STC的正确公式,正确方法和正确思路,他在2025年说:一直是用STC官方的公式:Ux = Vref * Nx / Nref
Vref = 1190mV (读取芯片信息可以查看这个值的)
Nref = Get_ADCResult(15);
Nx= 测量的通道的值
都不用管它是4095,1023,还是4096,1024。
(8)对于STC官方的正确公式:Ux = Vref * Nx / Nref可以扩展到任意情况都是正确的,只要将Vref 解释为“ADC外部参考源电压”,将Nref 解释为“ADC外部参考源电压12位ADC转换结果”即可。也就是Nref = Get_ADCResult(ADC外部参考源电压通道),相当于将“ADC被转换通道的输入脚”用短接线连接到“ADC外部参考源”上进行测量的测量值。(9)建议在芯片手册中:首先介绍一下正确的“Ux = Vref * Nx / Nref”ADC转换公式的原理。其次厂家对于如果上面3个实验的结果“12位ADC转换结果”如果都是4095,那就理直气壮第在22.3.2、22.3.3和22.3.4公式在写4095。毕竟科学实验是检验公式是否正确的唯一标准,而手册也是供用户在实际实验中使用的。(10)当然还是会有人奇怪芯片手册为什么与权威教科书上的不同,建议在芯片手册的附录加一个条目,内容可以参考下面DeepSeek给出的回答。 提问:12位的ADC转换公式是什么,其中的除数应该是4095还是4096? 思考:嗯,用户问的是12位ADC的转换公式,具体是关于除数应该是4095还是4096。这是一个比较具体的电子工程或嵌入式开发问题。12位ADC的最大数字输出是2^12 - 1 = 4095,而满量程输入对应的数字量通常是4095。但转换公式中分母的选择取决于参考电压和期望的映射关系。我记得标准公式是:Vin = (ADC_Code / 4095) * Vref,这样当ADC_Code=4095时,Vin=Vref。如果用4096,那么最大码值4095对应的电压会是(4095/4096)*Vref,略小于Vref,这通常不是期望的满量程映射。但有些情况下,比如为了计算方便或者考虑偏移误差,可能会用4096。需要从原理上对为什么用4096进行解释。用户深层需求可能是想确认在实际编程或电路设计中该用哪个值,避免计算错误。应该给出明确答案,并解释原因。另外,可以提一下不同应用场景的惯例,比如大多数ADC数据手册使用4095,而有些软件滤波或平均计算中可能用4096来简化移位运算。但核心答案应该是4095。考虑到用户问的是“公式”,需要清晰给出公式并说明除数的物理意义。回复要准确、简洁,避免歧义。 回答:对于12位ADC,标准转换公式的除数应该是4095,而不是4096。 具体公式如下:
1.为什么是4095?- 12位ADC的数字输出范围是 “0 到 4095”(共4096个离散值)。- 当输入电压等于参考电压时,ADC输出应为 “4095”(满量程),而不是4096(因为4096无法用12位二进制表示)。- 为了保证满量程时输入电压等于参考电压,分母必须用4095,即:2. 何时会用到4096?少数场合(如某些DSP计算或避免浮点运算)会使用4096来近似,但这是“有误差的”:- 用4096时,满量程输出为:
存在约0.024%增益误差。- 只有在明确允许这种微小误差或后续有校正时,才可能采用4096。3. 总结- 理论正确、工程常用:分母 = 4095- 特殊近似用法:分母 = 4096(需明确知道误差影响)建议始终使用4095,除非你使用的ADC数据手册或算法明确要求用4096。

狂热主宰 发表于 2026-4-18 23:02:57

可能用4095会多一点

yangsifei 发表于 2026-4-19 00:37:19

就是两点成一条直线,总不能说是两条直线吧,三点才成两条直,所以12位只有4095个LSB

wulin 发表于 2026-4-19 06:43:26

感觉这个问题在小学二年级就纠结过:10米长的道路每隔两米种1棵树,一共要种几棵树。

yangsifei 发表于 2026-4-19 16:15:17

如果把地围起来那你只能种5棵因为只有5段,你总不能种要6棵吧,因为那两棵在边边上溢出了。边上是属于别人和你共有的。

yangsifei 发表于 2026-4-19 16:18:29

也就是说以点为中心挖个坑,有半个坑是别人的地……

杨为民 发表于 2026-4-19 20:24:45

wulin 发表于 2026-4-19 06:43
感觉这个问题在小学二年级就纠结过:10米长的道路每隔两米种1棵树,一共要种几棵树。 ...

一语道破真谛!所以送花给你!


(1)假如我们每一米种一颗树,共种12位4096颗树。
(2)假如我们从最左边一棵树从0开始给这些树编号,共编了0、1、2、... 4094、4095共计4096个号。
(3)假如我们从最左边一棵树开始计算距离与编号的关系,那么公式应该是:距离=4095 X 编号 呢?
还是公式应该是:距离=4096 X 编号 呢?
(4)假如现在你穿越回小学二年级,老师问你在公式里是应该乘4095还是乘4096?你会回答是乘多少?
(5)其实这个问题等价的是:12位AD,在0(地线)到5V(参考电压)之间总共种4096颗树,树的编号是从0到4095共计4096个编号,那么ADC电压变换公式应该是: 被测电压 = 5V * 树的编号 / 4095,
原因很简单:种在5V电压那里的那颗树的编号是“4095”二不是“4096”!


杨为民 发表于 2026-4-19 20:28:31

yangsifei 发表于 2026-4-19 16:15
如果把地围起来那你只能种5棵因为只有5段,你总不能种要6棵吧,因为那两棵在边边上溢出了。边上是属于别人 ...

应该点赞送花,只是稍稍粗心了点,所以扣了点分:区分5段地必须种6颗树,编号为0、1、2、3、4、5共计6个号码

杨为民 发表于 2026-4-19 20:32:38

yangsifei 发表于 2026-4-19 16:15
如果把地围起来那你只能种5棵因为只有5段,你总不能种要6棵吧,因为那两棵在边边上溢出了。边上是属于别人 ...

“边上是属于别人和你共有的”,请继续你的思路,把每颗树种在每一段的中间,然后给出距离与树的编号关系的公式,我重新送你20朵小红花

杨为民 发表于 2026-4-19 20:34:39

yangsifei 发表于 2026-4-19 16:18
也就是说以点为中心挖个坑,有半个坑是别人的地……

给出距离与树的编号关系的公式,我重新送你20朵小红花
页: [1] 2 3 4 5 6
查看完整版本: 关于12位ADC 计算公式是除4096还是除4095的问题讨论