|
ADC变换在单片机控制甚至在整个自动化控制领域都占有重要的一席之地,ADC变换也是一切数字探测器的基础。 对于在ADC转换公式“ADCn通道的输入电压 = (转换结果 /4096) * ADC_VRef+”中的除法分母究竟应该是“除4096还是除4095”的问题一直是一个存在争议的问题。在网络上,在AI问答中,实际应用中、在教科书中,在各种手册中,选哪一个的都有。 本文介绍了笔者用STC的打狗棒核心板实际做ADC转换实验的结果,通过实际实验结果想说明: 究竟是“除4096还是除4095”不是一道“谁对谁错”的对错题,而是一道“选谁或者不选谁”的选择题。 (1)将P01管脚直接连接到VCC上,对应ADC09测量通道。 将P02管脚直接连接到GND上,对应ADC10测量通道。 (2)直接使用打狗棒的STC官方例程中的“05-16路ADC转换-串口2返回结果”。 (3)将例程中的串口2程序修改为串口1输入输出,运行程序得到以下的结果: [10:59:22.975]接收←ADC00=2760 [10:59:23.179]接收←ADC01=2783 [10:59:23.379]接收←ADC02=0613 [10:59:23.583]接收←ADC03=2803 [10:59:23.787]接收←ADC04=2768 [10:59:23.991]接收←ADC05=2771 [10:59:24.195]接收←ADC06=2767 [10:59:24.395]接收←ADC07=2746 [10:59:24.599]接收←ADC08=2773 [10:59:24.803]接收←ADC09=4092 [10:59:25.007]接收←ADC10=0000 [10:59:25.208]接收←ADC11=2772 [10:59:25.410]接收←ADC12=2777 [10:59:25.614]接收←ADC13=2764 [10:59:25.818]接收←ADC14=2766 [10:59:26.022]接收←Bandgap=1100 从中可以看到在这轮采样中,12位ADC输入端的测量值连接VCC的为ADC09=4092,连接GND的为ADC10=0000。 (4)修改范例程序,假定VCC=5.0000V,也就是假定在ADC转换公式“ADCn通道的输入电压 = (转换结果 /4096) * ADC_VRef+”中的ADC_VRef+等于“VCC=5.0000V”,然后编程分别输出除以4095和4096的结果。 程序修改分两个地方,一个地方是只输出9、10和15通道: 另一个地方是分别输出不同除数计算得到电压值: 1)修改了第143行,不进行16次采样平均,因为采样平均值很难到达4095. 2)增加了第164行和165行程序,分别计算了用4095和4096作为除数得到的电压结果。 3)修改第166行程序输出计算出来的结果。 (5)下面是计算VCC的5V电压的输出结果,由于有噪声,对VCC的采样结果不是每次都得到同样的值: ADC09=4095 4095->5.000000 4096->4.998779 ADC10=0000 4095->0.000000 4096->0.000000 Bandgap=1138 ------------ ADC09=4095 4095->5.000000 4096->4.998779 ADC10=0000 4095->0.000000 4096->0.000000 Bandgap=1127 ------------ ADC09=4093 4095->4.997558 4096->4.996338 ADC10=0000 4095->0.000000 4096->0.000000 Bandgap=1139 ------------ ADC09=4095 4095->5.000000 4096->4.998779 ADC10=0000 4095->0.000000 4096->0.000000 Bandgap=1135 (6)从上面可以看到,如果是除以“4095”,则可以显示对VCC的采样的计算值是“5.000000”,而如果是除以“4096”,则可以显示对VCC的采样的计算值是“4.998779”。 (7)假如一个工厂需要生产一款“数字电压表”,那么具体承担编写程序的工程师就需要做出一个具体的选择“是除4096还是除4095”,所以这实际上是一道选择题而不是对错题。 (8)既然是选择题,那么选什么答案就会依选择者的身份或者立场不同而不同:1)比如作为用户,我认为他肯定选择除“4095”的那一款,原因是他明明已经知道被测电压是VCC,他明明已经知道VCC的电压值是VCC=5.0000V,他为什么不选择测量显示值已经等于“5.000000”的产品,非要选择一个测量显示值不等于“5.000000”而是等于“4.998779”的产品。 2)比如作为卖产品的售货员,我认为她肯定选择除“4095”的那一款。毕竟向顾客解释清楚“4.998779”就等于“5.000000”是只差一个LSB的正常现象是一个高超难度的困难,这个难度不亚于向顾客推销一款新年钟声响起时却只显示时间“23:59:00”的电子钟的难度,那也是只差一个LSB。 3)比如作为生产产品的老板,我认为他肯定选择除“4095”,因为电压表不过是一个日常工具,为什么要故意选择显示“4.998779”人用户怀疑产品的质量呢? 4)比如作为上大学生“ADC原理”课的老师,我认为他肯定选择除“4096”,因为他当初学的书本上就那么写的。 5)比如作为上“ADC原理”课的大学生,我认为他肯定选择除“4096”,毕竟谁一定要跟考试成绩过不去呢? (9)既然是选择题,如果你是具体编写程序的程序员,或者你是一名研究生,我认为你应该像我一样,具体编写实验程序,同时給出两种选择的效果,然后交给你的老板或者老师,请他做出选择。 |