|
ADC變換在單片機控制甚至在整個自動化控制領域都占有重要的一席之地,ADC變換也是一切數字探測器的基礎。 對于在ADC轉換公式“ADCn通道的輸入電壓 = (轉換結果 /4096) * ADC_VRef+”中的除法分母究竟應該是“除4096還是除4095”的問題一直是一個存在爭議的問題。在網絡上,在AI問答中,實際應用中、在教科書中,在各種手冊中,選哪一個的都有。 本文介紹了筆者用STC的打狗棒核心板實際做ADC轉換實驗的結果,通過實際實驗結果想說明: 究竟是“除4096還是除4095”不是一道“誰對誰錯”的對錯題,而是一道“選誰或者不選誰”的選擇題。 (1)將P01管腳直接連接到VCC上,對應ADC09測量通道。 將P02管腳直接連接到GND上,對應ADC10測量通道。
Fig_01_連接.jpg (135.54 KB, 下載次數: 0)
下載附件
2026-4-24 13:27 上傳
(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通道:
Fig_02_main.jpg (51.29 KB, 下載次數: 0)
下載附件
2026-4-24 13:27 上傳
另一個地方是分別輸出不同除數計算得到電壓值:
Fig_03_ADC.jpg (151.68 KB, 下載次數: 0)
下載附件
2026-4-24 13:28 上傳
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)既然是選擇題,如果你是具體編寫程序的程序員,或者你是一名研究生,我認為你應該像我一樣,具體編寫實驗程序,同時給出兩種選擇的效果,然后交給你的老板或者老師,請他做出選擇。 |