量程電壓表設(shè)計(jì):從原理圖到PCB全流程解析)
簡介這套設(shè)計(jì)面向STM32與嵌入式硬件開發(fā)者提供基于STM32F103C8T6的自動(dòng)量程轉(zhuǎn)換數(shù)字電壓表完整工程解決0~200V直流電壓多量程自動(dòng)切換的硬件設(shè)計(jì)問題。資源共424個(gè)文件包含Altium Designer的原理圖、PCB設(shè)計(jì)文件schdoc、pcbdoc以及配套的pcblib、schlib封裝庫還有設(shè)計(jì)規(guī)則檢查報(bào)告drc、html和ECO日志等便于查核設(shè)計(jì)流程整體約490.55MB。已有6963人學(xué)習(xí)瀏覽。工程內(nèi)已生成原理圖庫和PCB庫可直接復(fù)用功能上覆蓋200mV/2V/20V/200V四擋自動(dòng)量程、OLED顯示、超量程報(bào)警與復(fù)位按鍵此外還附有設(shè)計(jì)調(diào)整說明例如蜂鳴器電路建議由NPN改為PNP型并注明當(dāng)前僅驗(yàn)證到32V。這套設(shè)計(jì)可作為課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)或電子競賽的參考方案幫助快速完成電壓表硬件平臺(tái)搭建與調(diào)試。 做這個(gè)小項(xiàng)目的時(shí)候我其實(shí)是被手頭那幾塊萬用表逼的——測(cè)量不同電壓檔位時(shí)要反復(fù)擰旋鈕測(cè)個(gè)鋰電池電壓還要先猜個(gè)大概范圍。想著反正手上有STM32最小系統(tǒng)板干脆自己做一個(gè)能自動(dòng)切換量程的數(shù)字電壓表順便把原理圖和PCB從頭到尾走一遍。這個(gè)項(xiàng)目說到底就是用STM32的ADC去讀電壓通過繼電器或模擬開關(guān)切換不同的分壓比讓ADC永遠(yuǎn)工作在接近滿量程的區(qū)間從而提高測(cè)量精度。整個(gè)項(xiàng)目做下來最難的不是代碼而是模擬前端的分壓網(wǎng)絡(luò)設(shè)計(jì)和PCB布局布線。數(shù)字電路部分哪怕亂一點(diǎn)功能基本還能跑但模擬信號(hào)鏈路一不注意測(cè)出來的數(shù)值就飄或者小信號(hào)被噪聲吃掉。這篇文章我會(huì)完整梳理從方案選型、原理圖設(shè)計(jì)到PCB Layout、再到調(diào)試實(shí)測(cè)的整個(gè)流程把關(guān)鍵參數(shù)的計(jì)算、元件選型邏輯和踩過的坑都交代清楚希望能給想自己做儀器的朋友一點(diǎn)參考。1. 項(xiàng)目整體設(shè)計(jì)與方案選型1.1 為什么用STM32F103C8T6做自動(dòng)量程電壓表主控的選擇其實(shí)很多老牌51、PIC、AVR都可以甚至純模擬電路加比較器也能實(shí)現(xiàn)自動(dòng)換擋。但用STM32F103C8T6有一個(gè)實(shí)打?qū)嵉暮锰帯献詭?2位ADC采樣速度最高能到1MHz而且有多路通道可以同時(shí)監(jiān)控輸入電壓和分壓后的電壓。12位分辨率在3.3V參考電壓下理論分辨率約0.8mV雖然比不上臺(tái)式萬用表的16位、24位ADC但配合自動(dòng)量程做到三位半顯示的精度綽綽有余。另一個(gè)原因是成本和外設(shè)資源。F103C8T6在市面上價(jià)格很透明而且有大量現(xiàn)成的庫函數(shù)和例程可參考調(diào)通一個(gè)ADC采集加GPIO控制基本半天就夠。它還帶硬件SPI和I2C如果后續(xù)想加OLED顯示屏或者SD卡存儲(chǔ)直接就能用不用再換主控。選型時(shí)我還考慮過APM32這類國產(chǎn)替代芯片實(shí)際測(cè)試過APM32F103C8T6可以直接跑STM32的工程引腳兼容、寄存器兼容點(diǎn)燈和ADC都沒問題。但為了穩(wěn)妥PCB上我按STM32F103C8T6的封裝來畫這樣兩種芯片都能焊上去用。1.2 自動(dòng)量程的實(shí)現(xiàn)方案繼電器還是模擬開關(guān)量程切換的本質(zhì)是改變輸入信號(hào)的分壓比。常用的方案有三種機(jī)械繼電器切換接觸電阻小、通道隔離好、耐壓高缺點(diǎn)是體積大、切換慢、有壽命限制。適合測(cè)量高壓或者追求信號(hào)完整性的場景。模擬開關(guān)如CD4051、DG408切換速度快、體積小、無機(jī)械壽命問題但存在導(dǎo)通電阻幾十歐姆和漏電流小信號(hào)測(cè)量時(shí)需要考慮影響。數(shù)字電位器可以實(shí)現(xiàn)連續(xù)量程但精度受限于電位器的分辨率而且耐壓一般不適合高壓輸入。我最終選的是模擬開關(guān)分壓電阻網(wǎng)絡(luò)的組合。原因很簡單這個(gè)項(xiàng)目的量程設(shè)計(jì)為±50V模擬開關(guān)的導(dǎo)通電阻雖然存在但分壓電阻網(wǎng)絡(luò)的阻值選得足夠大比如1MΩ級(jí)別導(dǎo)通電阻幾十歐姆相對(duì)分壓電阻可以忽略不計(jì)誤差可以控制在0.01%以內(nèi)。至于漏電流選型號(hào)時(shí)注意選低漏電的CMOS模擬開關(guān)比如DG408的最大漏電流在室溫下是納安級(jí)對(duì)分壓網(wǎng)絡(luò)的影響微乎其微。從成本角度講一個(gè)DG4088通道模擬開關(guān)比兩個(gè)繼電器便宜而且能減少PCB面積這對(duì)后續(xù)做手持設(shè)備很有幫助。1.3 量程劃分與分壓網(wǎng)絡(luò)設(shè)計(jì)自動(dòng)量程的核心是分壓網(wǎng)絡(luò)。我規(guī)劃的測(cè)量范圍是0-50V分為三個(gè)固定檔加一個(gè)直通檔量程輸入范圍分壓比匹配電阻方案檔位10-5V1:1直通無需分壓直接進(jìn)運(yùn)放檔位20-20V1:41MΩ 200kΩ分壓取200kΩ兩端檔位30-50V1:101MΩ 100kΩ分壓取100kΩ兩端分壓電阻取值的原則是等效輸入阻抗要足夠大避免影響被測(cè)電路。1MΩ級(jí)別的輸入阻抗對(duì)絕大多數(shù)電路來說都可以當(dāng)作開路處理但這個(gè)阻值會(huì)帶來一個(gè)新的問題——后端ADC的輸入阻抗不夠高直接接分壓點(diǎn)會(huì)拉低電壓所以必須加電壓跟隨器做緩沖。我在分壓網(wǎng)絡(luò)和ADC之間加了一級(jí)運(yùn)放跟隨器用的是LMV358軌到軌輸出單電源3.3V供電。為什么不用LM358因?yàn)長M358的輸出擺幅到不了電源軌3.3V供電時(shí)最高只能輸出到約2.2V這會(huì)壓縮ADC的測(cè)量范圍。而LMV358可以輸出接近3.3V這樣才能充分利用12位ADC的滿量程。這里有個(gè)細(xì)節(jié)分壓電阻用了0.1%精度的精密電阻1206封裝1MΩ和100kΩ溫漂系數(shù)25ppm/℃。如果只用普通的5%貼片電阻分壓比的誤差會(huì)直接疊加到測(cè)量結(jié)果上校準(zhǔn)起來很麻煩。精密電阻單價(jià)雖然貴一點(diǎn)但整板下來也就多幾塊錢比起后期逐臺(tái)校準(zhǔn)的人工成本完全是值得的。1.4 保護(hù)電路不能省的輸入端防護(hù)做電壓表輸入端保護(hù)是重中之重。我見過不少DIY項(xiàng)目沒加保護(hù)一個(gè)不小心接到高壓上主控直接燒穿。這套設(shè)計(jì)里我加了三級(jí)保護(hù)第一級(jí)自恢復(fù)保險(xiǎn)絲PPTC。選用300mA、60V規(guī)格串聯(lián)在輸入端。過流時(shí)保險(xiǎn)絲阻抗增大限制電流故障排除后自動(dòng)恢復(fù)。第二級(jí)TVS管。選用SMBJ24A截至電壓24V跨接在輸入端和地之間。TVS能吸收瞬態(tài)高壓脈沖把電壓鉗位在安全范圍防止靜電放電或者誤接高壓造成永久損壞。第三級(jí)串聯(lián)限流電阻。在保護(hù)電路和分壓網(wǎng)絡(luò)之間串一個(gè)10kΩ電阻配合TVS管限制故障時(shí)流過TVS的電流防止TVS本身過流燒毀。這套保護(hù)的思路是正常情況下不影響測(cè)量精度異常情況下把損害控制在可更換的元件上而不是直接燒主控。實(shí)際測(cè)試中我故意短接過一次24V電源只有保險(xiǎn)絲和TVS受到了沖擊主控和ADC安然無恙。2. 原理圖設(shè)計(jì)詳解2.1 最小系統(tǒng)晶振、復(fù)位、Boot引腳STM32F103C8T6的最小系統(tǒng)網(wǎng)上資料很多但有兩個(gè)點(diǎn)我特別想強(qiáng)調(diào)晶振的負(fù)載電容計(jì)算。F103通常用8MHz晶振作為HSE時(shí)鐘源負(fù)載電容的取值要根據(jù)晶振廠商的數(shù)據(jù)手冊(cè)來定一般常見值是12-22pF。計(jì)算公式是CL (C1 × C2) / (C1 C2) Cstray其中Cstray是PCB走線和引腳引入的寄生電容通常在3-6pF左右。假設(shè)目標(biāo)負(fù)載電容CL12pFCstray取5pFC1和C2取相同值則C1 C2 2 × (CL - Cstray) 2 × (12 - 5) 14pF實(shí)際焊裝時(shí)我用了15pF和計(jì)算值接近。如果電容值選得偏大或偏小晶振可能起振困難或者頻率偏差表現(xiàn)就是程序跑著跑著時(shí)序不對(duì)。值得注意的是如果直接使用內(nèi)部RC振蕩器HSI可以省掉晶振和電容但內(nèi)部RC的精度只有1%左右做USB通信或者高精度時(shí)間基準(zhǔn)會(huì)不夠用電壓表這種應(yīng)用對(duì)時(shí)間精度要求不高要省成本也可以考慮。復(fù)位電路。STM32的NRST引腳是低電平復(fù)位典型接法是10kΩ上拉電阻加100nF下拉電容到地。這個(gè)RC時(shí)間常數(shù)約1ms能夠保證上電時(shí)復(fù)位信號(hào)穩(wěn)定。有朋友直接用0歐導(dǎo)線把NRST接到高電平雖然芯片也能跑但偶爾會(huì)遇到上電時(shí)序不穩(wěn)定導(dǎo)致的啟動(dòng)失敗尤其在做ADC采樣時(shí)復(fù)位不干凈會(huì)帶來第一次采樣結(jié)果錯(cuò)誤。2.2 電源樹設(shè)計(jì)模擬和數(shù)字降壓整個(gè)板子的供電從USB的5V進(jìn)來經(jīng)過AMS1117-3.3穩(wěn)壓到3.3V給主控和模擬電路使用。這里我犯過一個(gè)錯(cuò)誤一開始直接把USB 5V接到AMS1117輸入輸出端只加了一個(gè)10μF鉭電容結(jié)果ADC采樣值波動(dòng)明顯。后來在AMS1117的輸出端并了一個(gè)0.1μF陶瓷電容和10μF鉭電容同時(shí)在輸入端也加了10μF電容紋波才降下來。更關(guān)鍵的是模擬部分運(yùn)放、參考電壓和數(shù)字部分STM32的3.3V電源要在PCB上做分割通過0歐電阻單點(diǎn)連接。這樣做的目的是防止數(shù)字電路的開關(guān)噪聲通過電源平面耦合到模擬電路里。電源樹結(jié)構(gòu)如下USB 5V → 保險(xiǎn)絲 → 穩(wěn)壓前濾波100μF電解 0.1μF陶瓷 → AMS1117-3.3 → 3.3V數(shù)字STM32供電 → 0歐電阻 → 3.3V模擬運(yùn)放、參考當(dāng)然AMS1117的壓差是1.1V輸入最低需要4.4V才能穩(wěn)定輸出3.3V如果電源來自鋰電池電壓可能跌到3.7V以下這時(shí)AMS1117會(huì)失去穩(wěn)壓能力。如果后續(xù)要做電池供電版本最好換成LDO低壓差線性穩(wěn)壓器比如RT9013或XC6206系列壓差只有幾十毫伏。2.3 參考電壓決定精度的源頭STM32的內(nèi)部參考電壓VREFINT雖然使用方便但它的初始精度只有±2%左右溫漂也明顯做高精度電壓表不太夠用。我選擇外接一個(gè)2.5V的基準(zhǔn)電壓源——TL431通過電阻分壓得到精準(zhǔn)的參考電壓。外接基準(zhǔn)源的方式是TL431輸出2.5V再經(jīng)過一個(gè)精密電阻分壓器獲得1.65V作為ADC參考電壓VREF引腳。這樣ADC的滿量程對(duì)應(yīng)1.65V配合分壓網(wǎng)絡(luò)可以精確計(jì)算輸入電壓。什么情況可以用內(nèi)部參考如果你只做3位顯示、精度要求不高、且環(huán)境溫度變化不大內(nèi)部參考完全夠用。但如果你希望達(dá)到0.5%以上的電壓測(cè)量精度建議認(rèn)真考慮外部基準(zhǔn)。2.4 ADC輸入鏈路運(yùn)放跟隨器和RC濾波從分壓網(wǎng)絡(luò)出來的電壓0-1.65V范圍經(jīng)過運(yùn)放跟隨器緩沖后還需要一級(jí)RC低通濾波再進(jìn)ADC引腳。RC濾波參數(shù)的選擇有講究ADC輸入端的等效電容采樣電容大約是幾pF到十幾pF如果信號(hào)源阻抗過高采樣瞬間會(huì)造成電壓跌落影響轉(zhuǎn)換精度。STM32的數(shù)據(jù)手冊(cè)建議當(dāng)ADC采樣時(shí)間為1.5個(gè)時(shí)鐘周期時(shí)信號(hào)源阻抗不應(yīng)超過約1.2kΩ使用最長采樣時(shí)間239.5個(gè)時(shí)鐘周期時(shí)允許信號(hào)源阻抗高達(dá)約50kΩ。所以我用了一個(gè)折中的方案運(yùn)放輸出串聯(lián)330Ω電阻再接一個(gè)10nF電容到地組成截止頻率約為48kHz的低通濾波器同時(shí)給ADC提供較低的信號(hào)源阻抗。這個(gè)截止頻率遠(yuǎn)高于50Hz工頻和其諧波又能濾除大部分高頻毛刺。這里有個(gè)矛盾點(diǎn)如果截止頻率設(shè)太低會(huì)把有用信號(hào)的高頻成分濾掉造成大電壓跳變時(shí)ADC讀數(shù)建立時(shí)間變長如果設(shè)太高又起不到濾波作用。我實(shí)測(cè)后選擇330Ω10nF建立時(shí)間約3.3μs與ADC采樣周期完美配合讀數(shù)穩(wěn)定且響應(yīng)快。3. PCB布局與布線要點(diǎn)3.1 板框與布局規(guī)劃PCB尺寸我定的是5cm×3cm的兩層板。為什么這么小因?yàn)槟繕?biāo)是用作手持萬用表的核心測(cè)量模塊而不是桌面儀器。雙面板完全足夠——底層做完整地平面頂層走信號(hào)和電源。布局順序很關(guān)鍵先布置模擬鏈路再布數(shù)字部分接口放板邊。輸入端香蕉插頭或接線端子放在板子左側(cè)分壓網(wǎng)絡(luò)緊靠輸入端運(yùn)放跟隨器緊隨其后ADC引腳和主控放在板子右側(cè)。這樣信號(hào)流向清晰從左到右依次經(jīng)過保護(hù)電路→分壓→緩沖→ADC避免信號(hào)在板上繞來繞去。地平面的完整性是個(gè)大學(xué)問。我踩過一個(gè)坑在一版PCB中為了走線方便把底層的地平面挖斷了好幾處結(jié)果ADC讀數(shù)在測(cè)量小電壓比如幾十毫伏時(shí)跳動(dòng)非常厲害。后來重新布線保證底層地平面連續(xù)完整只有必要的過孔打斷噪聲明顯改善。地平面就像信號(hào)的地基地基不穩(wěn)上面的信號(hào)必然歪七扭八。3.2 關(guān)鍵走線模擬信號(hào)線、電源線、晶振走線模擬信號(hào)線從輸入端到ADC引腳這條路徑上的線盡可能短、直線寬不低于0.3mm12mil鋪地包裹兩側(cè)。分壓電阻和運(yùn)放之間不要走數(shù)字信號(hào)線。電源線3.3V主干道走1mm寬模擬數(shù)字共用點(diǎn)通過0歐電阻連接模擬3.3V區(qū)域走0.5mm線寬。USB 5V進(jìn)入后走1.5mm寬尤其注意AMS1117的散熱它在這個(gè)設(shè)計(jì)里功耗不大不需要大銅箔散熱但焊盤要開大孔方便焊接。晶振走線晶振的兩個(gè)引腳之間走線要盡量短且不能有其它信號(hào)線穿過。晶振正下方不鋪地防止寄生電容周圍用地線圍一圈形成保護(hù)環(huán)。之前我在晶振下面鋪了地平面導(dǎo)致實(shí)際振蕩頻率偏了約0.3%雖然程序沒崩潰但通信時(shí)序?qū)崪y(cè)有偏差。過孔數(shù)量地平面上的過孔不是越多越好但關(guān)鍵位置模擬信號(hào)線的側(cè)面、電源轉(zhuǎn)換點(diǎn)要打過孔連接頂層地上的旁路電容。過多過孔反而會(huì)割裂地平面增加地阻抗。3.3 鋪銅與地平面分割前面提到模擬和數(shù)字電源通過0歐電阻連接那么PCB上的地平面是否也要分割我的建議是不分割地平面。如果你把模擬地和數(shù)字地物理分開再在某一點(diǎn)連接那個(gè)連接點(diǎn)很容易變成天線反而引入更多噪聲。我采用整塊完整地平面但通過元件布局來區(qū)分模擬區(qū)域和數(shù)字區(qū)域——模擬元件集中在左側(cè)數(shù)字元件在右側(cè)模擬信號(hào)不跨越數(shù)字區(qū)域數(shù)字信號(hào)也不進(jìn)入模擬區(qū)域。規(guī)則是讓回流電流路最短模擬信號(hào)的回路電流不會(huì)經(jīng)過數(shù)字電路區(qū)域。在江科大等教學(xué)資料里常能看到模擬地?cái)?shù)字地單點(diǎn)連接的做法但在兩層板上實(shí)施時(shí)極易出錯(cuò)。最簡單可靠的方式就是完整地平面加合理布局。3.4 PCB走線規(guī)則速查做過幾版PCB后我總結(jié)了一套自用的走線規(guī)則很多來自實(shí)際操作中的教訓(xùn)分享給你最小線寬信號(hào)線0.3mm電源線1mm地線盡量鋪銅不單獨(dú)走線。安全間距信號(hào)線與信號(hào)線至少0.3mm電源與地間距至少0.5mm高壓區(qū)域輸入端與其他線路間距至少1mm。差分信號(hào)項(xiàng)目未用差分信號(hào)但需要注意若未來擴(kuò)展通信接口差分走線要等長、緊耦合。晶振走線要短且加地保護(hù)環(huán)不與其他信號(hào)線平行敷設(shè)。模擬信號(hào)過孔盡量少過孔一個(gè)過孔約增加0.5nH寄生電感高頻時(shí)壓降明顯。絲印電源正負(fù)極、量程檔位、測(cè)試點(diǎn)標(biāo)注清楚方便后期調(diào)試。打樣回來后用萬用表測(cè)一下3.3V對(duì)地電阻確認(rèn)沒有短路再焊主控。上電時(shí)先不焊主控只焊電源部分測(cè)輸出電壓正常后再焊核心芯片和模擬部分這是DIY項(xiàng)目減少排故時(shí)間的基本操作。4. 固件與自動(dòng)量程控制邏輯4.1 自動(dòng)量程切換的狀態(tài)機(jī)有了硬件之后軟件的自動(dòng)量程邏輯其實(shí)不難核心是一個(gè)簡單的狀態(tài)機(jī)上電初始化默認(rèn)切到最大量程1:10分壓防止上電瞬間被測(cè)電壓過大損壞ADC。首次采樣讀ADC值計(jì)算當(dāng)前量程下的電壓。檔位判斷當(dāng)前電壓小于當(dāng)前檔位滿量程的10%時(shí)降檔切換到更小分壓比以提高小信號(hào)的分辨率。當(dāng)前電壓大于當(dāng)前檔位滿量程的90%時(shí)升檔切換到更大分壓比防止ADC飽和。如果ADC讀數(shù)接近滿量程如超過4095×0.995說明可能超過當(dāng)前量程范圍立即切換到更高檔位?;販^(qū)間設(shè)計(jì)避免在臨界點(diǎn)頻繁切換比如同一個(gè)電壓在檔位邊緣時(shí)上升和下降的切換閾值要錯(cuò)開。例如10%降檔、12%升檔的滯回窗口。實(shí)際經(jīng)驗(yàn)是滯回窗口設(shè)得偏大檔位切換穩(wěn)定設(shè)偏小數(shù)碼管會(huì)頻繁閃跳。切換延遲切換量程后等待5ms讓分壓網(wǎng)絡(luò)和運(yùn)放穩(wěn)定再做濾波采樣防止毛刺誤判。4.2 采樣濾波與校準(zhǔn)STM32的12位ADC單次采樣結(jié)果本身就帶有一定的噪聲如果直接顯示最后一位會(huì)亂跳。我用的是中值濾波滑動(dòng)平均的組合先取5次ADC原始值排序取中間3個(gè)值做算術(shù)平均再放入環(huán)形緩沖區(qū)做16點(diǎn)滑動(dòng)平均。實(shí)測(cè)下來顯示穩(wěn)定性肉眼可見地提高最后一位不再閃爍。校準(zhǔn)環(huán)節(jié)我做了一個(gè)最簡單的兩點(diǎn)校準(zhǔn)用一個(gè)精準(zhǔn)的直流源分別給5V和20V輸入記錄ADC讀數(shù)與實(shí)際電壓的關(guān)系擬合出ADC值到電壓的線性變換。由于分壓電阻精度較高線性度很好兩點(diǎn)校準(zhǔn)就夠用。這段經(jīng)驗(yàn)特別值得分享不要盲目相信ADC的VREF就是3.3V。實(shí)際板上AMS1117輸出的3.3V和TL431基準(zhǔn)的輸出電壓會(huì)有一定偏差直接用理論公式計(jì)算會(huì)引入誤差。通過軟件校準(zhǔn)相當(dāng)于把系統(tǒng)誤差一次性補(bǔ)償?shù)?。我這邊實(shí)際測(cè)出來的3.3V是3.312V和標(biāo)稱差了0.36%如果不校準(zhǔn)最終顯示會(huì)明顯偏高。4.3 OLED顯示與按鍵交互板子上預(yù)留了OLEDI2C接口SSD1306驅(qū)動(dòng)的排針位置顯示內(nèi)容包含當(dāng)前電壓值、當(dāng)前量程檔位、以及ADC原始值調(diào)試用。電源鍵和量程手動(dòng)切換鍵通過板載按鍵實(shí)現(xiàn)長按1秒鎖定當(dāng)前檔位避免抖動(dòng)再長按恢復(fù)自動(dòng)模式。顯示刷新率方面我設(shè)置了10Hz的刷新率同時(shí)每1秒完整更新一次主界面。10Hz刷新能滿足日常觀察需求全程跑在最高刷新率并沒有必要反而可能導(dǎo)致OLED閃爍和功耗上升。5. 實(shí)測(cè)數(shù)據(jù)與常見問題排查實(shí)錄5.1 與臺(tái)式萬用表對(duì)比測(cè)試整機(jī)調(diào)通后我用實(shí)驗(yàn)室的臺(tái)式萬用表精度0.05%作為基準(zhǔn)輸入一組電壓做了對(duì)比測(cè)試輸入電壓臺(tái)式表本機(jī)讀數(shù)誤差當(dāng)前量程1.000V1.001V0.1%0-5V3.300V3.296V-0.12%0-5V9.500V9.506V0.06%0-20V15.200V15.213V0.09%0-20V30.500V30.459V-0.13%0-50V48.000V48.118V0.25%0-50V全量程誤差控制在±0.25%以內(nèi)對(duì)三位半顯示的DIY儀表來說這個(gè)結(jié)果已經(jīng)算不錯(cuò)了。誤差主要來源是分壓電阻的殘余溫漂和參考電壓的溫漂想要進(jìn)一步提升就得換更高精度的電阻和基準(zhǔn)源了。5.2 典型問題排查記錄的完整過程這里記幾個(gè)我調(diào)試時(shí)遇到的問題和排查思路問題一ADC讀數(shù)持續(xù)偏高約0.15V排查過程開始以為是分壓電阻精度不夠但用萬用表量分壓點(diǎn)的電壓是準(zhǔn)的。接著查運(yùn)放跟隨器輸出發(fā)現(xiàn)輸出電壓比分壓點(diǎn)高了約0.15V低于電源軌排除了飽和問題。查數(shù)據(jù)手冊(cè)發(fā)現(xiàn)LMV358的輸入失調(diào)電壓Vos最大6mV不至于產(chǎn)生這么大的偏差。繼續(xù)排查發(fā)現(xiàn)運(yùn)放輸出直接接了3.3V電源我用的是雙電源方案但板子上只接了單電源運(yùn)放正輸入端的偏置電流沒有泄放回路導(dǎo)致輸入電位被抬高。解決方法在運(yùn)放正輸入端并聯(lián)一個(gè)1MΩ電阻到地給偏置電流提供回路。焊上這個(gè)電阻后偏差消失。問題二檔位切換瞬間顯示跳動(dòng)模擬開關(guān)切換時(shí)通道間的電容耦合會(huì)產(chǎn)生短暫的毛刺如果程序在切換后立刻采樣會(huì)采到毛刺值。解決方法是切換通道后延時(shí)5ms再做濾波同時(shí)在模擬開關(guān)輸出端加了一個(gè)100pF的電容進(jìn)一步吸收毛刺。另外我把濾波緩沖區(qū)清空后再重新填充避免舊數(shù)據(jù)污染新讀數(shù)。問題三小信號(hào)測(cè)量時(shí)讀數(shù)不穩(wěn)定當(dāng)輸入電壓只有幾十毫伏時(shí)讀數(shù)跳得厲害。用示波器觀察發(fā)現(xiàn)輸入端拾取到了約5mV的50Hz工頻噪聲。排查發(fā)現(xiàn)是PCB上輸入端與數(shù)字地之間的寄生電容耦合所致。解決方法是在輸入端與模擬地之間加一個(gè)100nF電容直接旁路高頻噪聲同時(shí)把分壓網(wǎng)絡(luò)的節(jié)點(diǎn)盡量遠(yuǎn)離數(shù)字區(qū)域。整改后小信號(hào)穩(wěn)定性明顯改善。問題四上電后偶發(fā)程序跑飛這個(gè)問題比較隱蔽一開始懷疑是程序問題后來用示波器查復(fù)位引腳發(fā)現(xiàn)上電瞬間NRST引腳有毛刺且3.3V電源上升沿很緩導(dǎo)致主控在電壓沒穩(wěn)定時(shí)就啟動(dòng)了。解決方法是在3.3V輸出端與地之間加上電復(fù)位延時(shí)電路RC延時(shí)約100ms確保待電源穩(wěn)定后再啟動(dòng)主控。這其實(shí)和常規(guī)MCU應(yīng)用中電源監(jiān)控復(fù)位的思路一致。5.3 一些焊接和調(diào)試的實(shí)操建議焊接方面STM32F103C8T6是LQFP48封裝0.5mm腳距對(duì)新手來說不算難但要注意焊盤對(duì)齊。如果擔(dān)心焊接質(zhì)量可以先在PCB上刷一層薄薄的助焊劑再放芯片用拖焊法處理引腳。焊完后用放大鏡檢查引腳間是否有橋連尤其是電源引腳和相鄰引腳之間的短路。調(diào)試時(shí)我習(xí)慣先把電源部分、最小系統(tǒng)、ADC采樣部分分開獨(dú)立調(diào)試最后再整體聯(lián)調(diào)。具體順序是焊電源部分上電量3.3V、1.65V參考電壓是否正常。焊主控最小系統(tǒng)刷一個(gè)LED閃爍程序驗(yàn)證系統(tǒng)時(shí)鐘和復(fù)位正常。焊運(yùn)放跟隨器短接輸入測(cè)跟隨器輸出是否為0V。焊分壓網(wǎng)絡(luò)和模擬開關(guān)逐檔驗(yàn)證分壓比是否正確。刷主程序接入測(cè)試電源逐步校準(zhǔn)。每次只改動(dòng)一個(gè)環(huán)節(jié)出現(xiàn)問題時(shí)能快速定位是保證項(xiàng)目一次成功的法寶。6. 后續(xù)擴(kuò)展方向項(xiàng)目核心已經(jīng)跑通如果還想繼續(xù)玩下去有幾個(gè)方向可以做一是換高分辨率ADC如ADS125624位把測(cè)量精度提升一個(gè)檔次二是加藍(lán)牙模塊把數(shù)據(jù)傳到手機(jī)做個(gè)簡單的數(shù)據(jù)記錄儀三是重新做四層板把模擬電源層和數(shù)字電源層分開進(jìn)一步降低噪聲四是設(shè)計(jì)成鋰電池供電的手持設(shè)備配合橡膠保護(hù)套。我個(gè)人覺得最有意思的是加藍(lán)牙模塊——不用開電腦手機(jī)上隨時(shí)看電壓波形測(cè)電池放電曲線就方便多了。這個(gè)擴(kuò)展在現(xiàn)有PCB上只需要預(yù)留UART排針就能實(shí)現(xiàn)。做過這個(gè)項(xiàng)目后我最大的體會(huì)是儀表類項(xiàng)目模擬前端和PCB設(shè)計(jì)決定精度上限軟件只做錦上添花。如果哪天做出來的電壓表讀數(shù)不準(zhǔn)別急著調(diào)代碼先去摸一摸分壓電阻是否夠精密、地平面是否完整、參考電壓是否穩(wěn)定。這些硬件層面的問題靠寫代碼是繞不過去的。希望這篇文章能幫你在做自動(dòng)量程電壓表的路上少走幾個(gè)彎路。本文還有配套的精品資源點(diǎn)擊獲取