|
(1)这是1个2023年的帖子。
12位ADC 计算公式是/4096还是/4095;10位ADC 计算公式是/1024还是/1023 https://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。
|