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