設(shè)計(jì)核心原理與PCB實(shí)戰(zhàn))
1. 從“最小系統(tǒng)”說(shuō)起為什么它是一切嵌入式開發(fā)的起點(diǎn)如果你剛接觸單片機(jī)或者是從Arduino、樹莓派這類開發(fā)板轉(zhuǎn)過(guò)來(lái)第一次聽到“最小系統(tǒng)”這個(gè)詞可能會(huì)有點(diǎn)懵。開發(fā)板不是買來(lái)就能用嗎為什么還要自己“設(shè)計(jì)”一個(gè)最小系統(tǒng)這恰恰是區(qū)分“玩具級(jí)”玩家和“工程級(jí)”開發(fā)者的第一道分水嶺。最小系統(tǒng)顧名思義就是能讓一顆微控制器MCU芯片“活”起來(lái)、執(zhí)行程序的最精簡(jiǎn)電路。它不包含任何花里胡哨的外設(shè)比如液晶屏、傳感器、Wi-Fi模塊它只提供MCU生存和工作的“生命支持系統(tǒng)”。為什么我們要費(fèi)心去設(shè)計(jì)它原因有三。第一成本與定制化。一個(gè)成熟的商業(yè)項(xiàng)目如果直接使用集成了大量你不需要的功能的開發(fā)板無(wú)疑是巨大的浪費(fèi)。設(shè)計(jì)自己的最小系統(tǒng)板可以只保留必需電路將BOM成本壓到最低同時(shí)板子形狀、接口位置都能按產(chǎn)品結(jié)構(gòu)定制。第二深入理解硬件。親手畫一遍最小系統(tǒng)原理圖、走一遍PCB布局布線你會(huì)徹底明白復(fù)位電路為什么那樣接、晶振的負(fù)載電容怎么選、電源為什么要加去耦電容。這個(gè)過(guò)程積累的經(jīng)驗(yàn)是看一百遍開發(fā)板原理圖都換不來(lái)的。第三排查故障的底氣。當(dāng)你的產(chǎn)品出現(xiàn)莫名其妙的重啟、死機(jī)、程序跑飛時(shí)如果你連最小系統(tǒng)都不甚了解排查將無(wú)從下手。理解了最小系統(tǒng)就等于掌握了硬件問(wèn)題的“根因分析法”。今天我們就以經(jīng)典的PIC16F877A這款8位單片機(jī)為例手把手拆解一個(gè)最小系統(tǒng)的設(shè)計(jì)全過(guò)程。雖然現(xiàn)在STM32等32位ARM Cortex-M芯片大行其道但PIC16F877A因其結(jié)構(gòu)清晰、外設(shè)典型、資料海量依然是學(xué)習(xí)單片機(jī)硬件原理的絕佳標(biāo)本。理解了它的最小系統(tǒng)你再去看STM32F103C8T6、ESP8266乃至更復(fù)雜的STM32G431會(huì)發(fā)現(xiàn)核心思想一脈相承只是復(fù)雜度不同而已。網(wǎng)絡(luò)上熱門的“STM32F103C8T6最小系統(tǒng)板原理圖”其設(shè)計(jì)邏輯與我們今天要講的并無(wú)二致。2. PIC16F877A芯片解讀管腳功能與最小系統(tǒng)需求映射設(shè)計(jì)最小系統(tǒng)第一步不是打開畫圖軟件而是徹底讀懂芯片的數(shù)據(jù)手冊(cè)Datasheet。對(duì)于PIC16F877A我們需要重點(diǎn)關(guān)注那些與“生存”直接相關(guān)的管腳。PIC16F877A是40引腳DIP封裝或44引腳PLCC/QFP封裝我們以常見的40DIP為例。它的管腳可以大致分為幾類電源引腳VDD, VSS這是芯片的“糧食”。它有多個(gè)VDD和VSS引腳例如引腳11、32是VDD引腳12、31是VSS必須全部正確連接。內(nèi)部數(shù)字和模擬電路共用電源但為了穩(wěn)定性通常建議在靠近芯片處將模擬VDD/VSS與數(shù)字VDD/VSS通過(guò)磁珠或0歐電阻單點(diǎn)連接我們做最小系統(tǒng)時(shí)可先直接相連。主時(shí)鐘引腳OSC1/CLKIN, OSC2/CLKOUT這是芯片的“心臟”。PIC16F877A支持多種時(shí)鐘模式包括低成本的外部RC振蕩、精準(zhǔn)的外部晶振、內(nèi)部RC振蕩等。最小系統(tǒng)通常選擇外部晶振以獲得穩(wěn)定的時(shí)序。主復(fù)位引腳MCLR這是芯片的“重啟按鈕”。低電平有效當(dāng)此引腳被拉低時(shí)芯片復(fù)位。最小系統(tǒng)必須包含一個(gè)可靠的復(fù)位電路。編程/調(diào)試引腳PGC, PGD對(duì)于PIC系列這是ICSPIn-Circuit Serial Programming接口對(duì)應(yīng)引腳39PGC/ICSPCLK和40PGD/ICSPDAT。這是將程序“灌入”芯片的通道最小系統(tǒng)必須將其引出。I/O端口引腳RA0-RA5, RB0-RB7, RC0-RC7, RD0-RD7, RE0-RE2這些是芯片的“手腳”用于控制外設(shè)和讀取信號(hào)。在最小系統(tǒng)中我們通常用排針將它們?nèi)恳龇奖愫罄m(xù)擴(kuò)展。最小系統(tǒng)的核心需求就是為上述1-4類引腳提供正確、穩(wěn)定的電路支持并將第5類引腳開放給用戶。任何一款MCU的最小系統(tǒng)設(shè)計(jì)都遵循這個(gè)思路。比如STM32F103C8T6你需要關(guān)注的是它的VDD/VSS、NRST復(fù)位、OSC_IN/OSC_OUT晶振、SWDIO/SWCLK編程調(diào)試、以及BOOT0/BOOT1啟動(dòng)模式引腳。ESP8266雖然集成了Wi-Fi但其最小系統(tǒng)同樣需要VCC/GND、EN使能/復(fù)位、GPIO0/GPIO2/GPIO15啟動(dòng)模式配置、以及XTAL晶振電路。3. 核心電路設(shè)計(jì)電源、時(shí)鐘與復(fù)位現(xiàn)在我們進(jìn)入實(shí)操環(huán)節(jié)逐一構(gòu)建最小系統(tǒng)的三大核心支柱。3.1 電源電路設(shè)計(jì)穩(wěn)定是壓倒一切的前提PIC16F877A的工作電壓范圍是2.0V到5.5V常見選擇是5V或3.3V。5V系統(tǒng)兼容性好但功耗較高3.3V系統(tǒng)更現(xiàn)代功耗低但需要注意某些外設(shè)的電平兼容。這里我們以經(jīng)典的5V系統(tǒng)為例。電源輸入最小系統(tǒng)板通常通過(guò)一個(gè)DC插座或排針引入外部5V電源。關(guān)鍵點(diǎn)必須在電源入口處放置一個(gè)極性保護(hù)二極管如1N4007和一個(gè)至少100uF的電解電容用于緩沖電源插拔時(shí)的浪涌電流。穩(wěn)壓與濾波如果外部輸入是高于5V的電壓如9V適配器則需要一顆LDO穩(wěn)壓芯片如經(jīng)典的LM7805。即使輸入是5V也建議使用低壓差的穩(wěn)壓芯片如AMS1117-5.0來(lái)提供更干凈的電源。穩(wěn)壓芯片的輸入、輸出端都需要按數(shù)據(jù)手冊(cè)要求搭配電容。去耦電容這是新手最容易忽略也最影響系統(tǒng)穩(wěn)定性的部分。原則是在每對(duì)VDD/VSS電源引腳附近放置一個(gè)0.1uF100nF的陶瓷電容并盡可能靠近芯片引腳。對(duì)于PIC16F877A你需要在引腳1112、引腳3132附近各放置一個(gè)。此外在整板電源入口處可以再并聯(lián)一個(gè)10uF的鉭電容或電解電容。這些去耦電容的作用是為芯片內(nèi)部瞬間變化的電流提供就近的“能量水池”避免電壓波動(dòng)通過(guò)長(zhǎng)導(dǎo)線傳遞引發(fā)邏輯錯(cuò)誤或噪聲。注意電容的封裝選擇很重要。0.1uF去耦電容務(wù)必選用高頻特性好的多層陶瓷電容MLCC如0603或0805封裝而不是直插的瓷片電容。鉭電容有極性焊接時(shí)切勿反接。3.2 時(shí)鐘電路設(shè)計(jì)給芯片一顆精準(zhǔn)的“心”PIC16F877A的時(shí)鐘模式通過(guò)配置字Configuration Bits選擇。我們?cè)O(shè)計(jì)硬件時(shí)需要為最常用的“HS”高速晶振模式做好準(zhǔn)備。晶振選型根據(jù)你程序所需的時(shí)序精度和速度要求選擇。對(duì)于學(xué)習(xí)4MHz、8MHz、20MHz都是常見選擇。4MHz和8MHz的晶振非常便宜且穩(wěn)定。關(guān)鍵參數(shù)負(fù)載電容Load Capacitance CL。常見的直插HC-49S封裝晶振CL通常是18pF或20pF。負(fù)載電容計(jì)算與匹配這是時(shí)鐘電路設(shè)計(jì)的精髓。晶振兩端OSC1和OSC2到地需要各接一個(gè)電容稱為負(fù)載電容C1, C2。它們的值并非隨意公式為CL (C1 * C2) / (C1 C2) Cstray。其中Cstray是PCB走線和芯片引腳的寄生電容通常估算為3-5pF。為了簡(jiǎn)化通常令C1 C2。假設(shè)晶振CL20pF估算Cstray5pF則所需C1 C2 2 * (CL - Cstray) 2*(20-5)30pF。因此我們可以選擇兩個(gè)27pF或33pF的陶瓷電容。不匹配的負(fù)載電容會(huì)導(dǎo)致晶振起振困難、頻率漂移甚至停振。布局布線要點(diǎn)晶振和它的兩個(gè)負(fù)載電容必須盡可能靠近芯片的OSC1和OSC2引腳。走線要短而粗用地線將時(shí)鐘電路區(qū)域包圍起來(lái)以避免它成為干擾其他電路的噪聲源。千萬(wàn)不要把晶振放在板子邊緣或靠近其他高速信號(hào)線。對(duì)比一下STM32F103C8T6的晶振電路原理完全一樣也是OSC_IN/OUT接晶振和兩個(gè)負(fù)載電容常用8MHz負(fù)載電容20pF配兩個(gè)20pF電容。ESP8266的晶振電路也是同理常用26MHz或40MHz。3.3 復(fù)位電路設(shè)計(jì)可靠的“重啟”機(jī)制PIC16F877A的MCLR引腳是低電平復(fù)位。一個(gè)經(jīng)典可靠的復(fù)位電路包含兩部分上拉和延時(shí)?;倦娐吩贛CLR引腳和VDD之間連接一個(gè)10kΩ的上拉電阻。這樣在正常工作時(shí)MCLR被拉高。在MCLR引腳和地之間連接一個(gè)常開按鍵復(fù)位按鈕。當(dāng)按鍵按下時(shí)MCLR被直接拉到地芯片復(fù)位。增加復(fù)位可靠性上述簡(jiǎn)單電路在電源上電瞬間可能產(chǎn)生毛刺導(dǎo)致誤復(fù)位。改進(jìn)方案是加入一個(gè)RC延時(shí)電路。將上拉電阻換成1kΩ-10kΩ再在MCLR引腳到地之間接一個(gè)0.1uF-10uF的電容。上電時(shí)電容充電使MCLR電壓緩慢上升形成一個(gè)確定的上電復(fù)位延時(shí)。按鍵并聯(lián)在電容兩端按下時(shí)放電復(fù)位。關(guān)鍵點(diǎn)RC時(shí)間常數(shù)要足夠大確保在電源穩(wěn)定后復(fù)位信號(hào)才釋放。例如R10kΩ, C10uF時(shí)間常數(shù)τRC0.1秒通常足夠。專用復(fù)位芯片對(duì)于要求極高的工業(yè)產(chǎn)品建議使用如MAX809、CAT809這類專門的復(fù)位監(jiān)控芯片。它們能在電源電壓低于某個(gè)閾值如4.63V時(shí)自動(dòng)產(chǎn)生復(fù)位信號(hào)解決電源緩慢下降或波動(dòng)引起的“掉電不死”問(wèn)題。STM32的NRST引腳也是低電平復(fù)位其電路設(shè)計(jì)與PIC的MCLR完全通用。ESP8266的EN引腳是高電平使能可以理解為“高電平復(fù)位”電路邏輯相反通常也是通過(guò)RC電路和按鍵實(shí)現(xiàn)復(fù)位功能。4. 編程調(diào)試接口與啟動(dòng)配置電路最小系統(tǒng)做好了怎么把程序?qū)戇M(jìn)去這就需要引出編程調(diào)試接口。4.1 PIC的ICSP接口設(shè)計(jì)PIC的ICSP接口極其簡(jiǎn)潔核心就是三根線PGC (ICSPCLK)編程時(shí)鐘線。PGD (ICSPDAT)編程數(shù)據(jù)線。MCLR編程時(shí)編程器會(huì)控制此引腳電壓來(lái)使芯片進(jìn)入編程模式。因此在最小系統(tǒng)板上你需要用一個(gè)標(biāo)準(zhǔn)的6針排針或5針因?yàn)閂PP有時(shí)不需要單獨(dú)接將這三個(gè)信號(hào)以及VDD、VSS引出。常見的連接順序是1-VPP/MCLR, 2-VDD, 3-VSS, 4-PGD, 5-PGC, 6-空或輔助信號(hào)。使用標(biāo)準(zhǔn)的ICSP接口你可以直接連接PICKit、ICD等編程器。實(shí)操心得在PCB布局時(shí)務(wù)必把ICSP接口放在板子邊緣并且PGC/PGD的走線盡量不要過(guò)長(zhǎng)且不要靠近晶振等高頻信號(hào)線避免編程時(shí)受到干擾導(dǎo)致失敗。可以在PGC/PGD線上串聯(lián)一個(gè)100Ω左右的小電阻起到一定的阻尼和隔離作用。4.2 對(duì)比STM32的SWD與ESP8266的串口下載這里可以看出不同架構(gòu)的差異STM32 (ARM Cortex-M)主流使用SWD (Serial Wire Debug)接口僅需SWDIO數(shù)據(jù)、SWCLK時(shí)鐘、GND和3.3V四根線即可完成編程和調(diào)試。它比古老的JTAG接口更節(jié)省引腳。因此STM32F103C8T6最小系統(tǒng)板必然有一個(gè)4針或5針的SWD接口排針。ESP8266它通常通過(guò)UART串口進(jìn)行程序下載。下載時(shí)需要將GPIO0引腳拉低以進(jìn)入下載模式上電復(fù)位后即可通過(guò)TX/RX燒錄。因此ESP8266的最小系統(tǒng)板上除了UART的TX、RX還需要通過(guò)跳線帽或按鈕來(lái)控制GPIO0的電平。啟動(dòng)配置電路是另一個(gè)關(guān)鍵。PIC16F877A的啟動(dòng)模式通過(guò)配置字在軟件中設(shè)置。而STM32有BOOT0和BOOT1引腳通過(guò)它們的高低電平組合決定是從主Flash、系統(tǒng)存儲(chǔ)器用于串口下載還是SRAM啟動(dòng)。最小系統(tǒng)板上通常會(huì)用跳線帽來(lái)選擇這些模式。ESP8266的GPIO0、GPIO2、GPIO15在上電時(shí)的電平狀態(tài)共同決定了啟動(dòng)模式如Flash啟動(dòng)、UART下載等這些引腳通常也需要通過(guò)電阻拉到固定電平高或低。5. PCB布局布線實(shí)戰(zhàn)要點(diǎn)與坑點(diǎn)匯總原理圖正確只是成功了一半PCB布局布線才是決定系統(tǒng)穩(wěn)定性的關(guān)鍵。很多人調(diào)不通板子問(wèn)題都出在這里。5.1 布局優(yōu)先級(jí)的黃金法則核心區(qū)域優(yōu)先以MCU芯片為中心。首先放置晶振及負(fù)載電容必須緊貼OSC1/OSC2引腳。其次是所有去耦電容必須緊貼對(duì)應(yīng)的VDD/VSS引腳。然后是復(fù)位電路元件靠近MCLR引腳。接口定位將電源輸入接口、編程調(diào)試接口、I/O引出排針等固定在板子邊緣合適位置。電源接口要考慮到外部線纜的走向。電源路徑規(guī)劃想象電流的流向。從電源入口 → 穩(wěn)壓芯片 → 主濾波電容 → 各個(gè)VDD引腳。這條路徑要盡量短、粗減少壓降和干擾。模擬與數(shù)字區(qū)域的隔離如果用到芯片內(nèi)部的ADC模擬數(shù)字轉(zhuǎn)換器要特別注意。將模擬電源AVDD、模擬地AVSS與數(shù)字部分通過(guò)磁珠或0歐電阻單點(diǎn)連接。模擬信號(hào)走線如連接到RA0-RA3的傳感器信號(hào)要遠(yuǎn)離數(shù)字信號(hào)線特別是時(shí)鐘、PWM等。5.2 布線關(guān)鍵細(xì)節(jié)電源線寬根據(jù)電流大小計(jì)算線寬。對(duì)于單片機(jī)核心電流不大但主電源路徑如從接口到穩(wěn)壓芯片的線寬建議不小于24mil0.6mmVDD到芯片引腳的線寬15mil0.38mm以上。地線要更寬最好使用大面積鋪銅覆銅作為地平面。地平面至關(guān)重要強(qiáng)烈建議雙面板的底層Bottom Layer進(jìn)行完整的地平面覆銅。這為所有信號(hào)提供了最短的回流路徑是抑制電磁干擾EMI、提高穩(wěn)定性的最有效手段。覆銅時(shí)通過(guò)大量過(guò)孔Via將頂層的地線與底層地平面連接起來(lái)形成“法拉第籠”效應(yīng)。信號(hào)線避免直角高速信號(hào)線走線避免90度直角改用45度角或圓弧走線以減少信號(hào)反射和電磁輻射。對(duì)于PIC16F877A這類低速芯片此要求不嚴(yán)格但養(yǎng)成好習(xí)慣很重要。過(guò)孔的使用過(guò)孔會(huì)引入電感不適合作為電源主路徑。電源線換層時(shí)可以打多個(gè)過(guò)孔并聯(lián)以減小阻抗。5.3 常見坑點(diǎn)與調(diào)試技巧芯片不工作無(wú)任何反應(yīng)檢查電源用萬(wàn)用表測(cè)量每個(gè)VDD引腳對(duì)VSS的電壓確認(rèn)是否為穩(wěn)定的5V或3.3V。這是第一步也是最常出錯(cuò)的一步可能是穩(wěn)壓芯片焊反、去耦電容短路。檢查復(fù)位引腳測(cè)量MCLR引腳電壓正常應(yīng)為高電平接近VDD。如果一直被拉低檢查復(fù)位按鍵是否卡住復(fù)位電容是否短路或漏電。檢查晶振用示波器探頭需用X10檔減少負(fù)載效應(yīng)測(cè)量OSC2引腳應(yīng)能看到清晰的正弦波或方波。如果不起振檢查a) 晶振是否損壞b) 負(fù)載電容值是否匹配c) 焊接是否良好晶振外殼不要接地d) 配置字是否設(shè)置為正確的振蕩模式如HS。程序下載失敗檢查連接確認(rèn)編程器與板子ICSP接口連接正確、牢固。檢查電源確保編程時(shí)板子由編程器供電或外部供電穩(wěn)定。有些編程器供電能力不足。檢查PGC/PGD這兩根線可能被其他電路占用或短路。確保它們與其它I/O口之間沒(méi)有直接短路特別是如果這些I/O口接了強(qiáng)上拉或下拉電阻。一個(gè)技巧在原理圖上將用于編程的PGC/PGD引腳的網(wǎng)絡(luò)標(biāo)號(hào)用特殊顏色高亮提醒自己布線時(shí)注意。系統(tǒng)運(yùn)行不穩(wěn)定偶爾復(fù)位電源噪聲用示波器交流耦合檔觀察VDD引腳上的電壓紋波。如果紋波過(guò)大超過(guò)100mV檢查去耦電容是否足夠、是否靠近芯片、LDO輸入輸出電容是否按規(guī)格書配置。地線干擾檢查地平面是否完整信號(hào)回流路徑是否被割斷。模擬地和數(shù)字地單點(diǎn)連接的點(diǎn)選擇是否合理通常選在芯片下方或電源入口處。外部干擾如果I/O口連接了電機(jī)、繼電器等感性負(fù)載必須增加續(xù)流二極管、光耦隔離等措施防止反電動(dòng)勢(shì)竄入核心系統(tǒng)。6. 從PIC到STM32/ESP8266最小系統(tǒng)設(shè)計(jì)的通用思維通過(guò)詳細(xì)拆解PIC16F877A我們已經(jīng)掌握了最小系統(tǒng)設(shè)計(jì)的核心方法論。這套方法是通用的需求分析研讀芯片數(shù)據(jù)手冊(cè)找出所有電源引腳、時(shí)鐘引腳、復(fù)位引腳、編程調(diào)試引腳和啟動(dòng)配置引腳。電路設(shè)計(jì)電源設(shè)計(jì)輸入濾波、穩(wěn)壓如需、各級(jí)去耦網(wǎng)絡(luò)。時(shí)鐘根據(jù)精度和成本需求選擇時(shí)鐘源晶振/陶瓷諧振器/RC/內(nèi)部并匹配負(fù)載電容。復(fù)位設(shè)計(jì)手動(dòng)復(fù)位和上電復(fù)位電路或選用專用復(fù)位芯片。編程調(diào)試引出該芯片架構(gòu)的標(biāo)準(zhǔn)接口ICSP/JTAG/SWD/UART。啟動(dòng)配置通過(guò)電阻或跳線帽固定相關(guān)引腳電平。PCB實(shí)現(xiàn)布局核心元件緊靠芯片接口靠邊。布線電源線粗地平面完整高速/時(shí)鐘信號(hào)短直模擬數(shù)字隔離。檢查DRC設(shè)計(jì)規(guī)則檢查和電氣規(guī)則檢查必不可少。當(dāng)你拿到一塊STM32F103C8T6最小系統(tǒng)板原理圖時(shí)你會(huì)發(fā)現(xiàn)一個(gè)LDO如AMS1117-3.3一組8MHz晶振加20pF電容一個(gè)NRST復(fù)位電路10k上拉10uF電容到地加按鍵一個(gè)4針SWD接口兩個(gè)BOOT模式選擇跳線以及一排I/O口排針——完全符合上述模板。ESP8266最小系統(tǒng)板也是如此一個(gè)LDO一個(gè)26MHz或40MHz晶振一個(gè)EN復(fù)位電路一個(gè)Flash供電電路通常需接3.3V一個(gè)UART下載電路涉及GPIO0控制以及天線匹配電路對(duì)于RF性能至關(guān)重要。所以不要再把最小系統(tǒng)板看作一個(gè)黑盒子。它是一張清晰的藍(lán)圖展示了如何與一顆微控制器芯片正確對(duì)話。親手設(shè)計(jì)并制作一塊哪怕是最簡(jiǎn)單的PIC16F877A或STM32F103C8T6最小系統(tǒng)板你所獲得的硬件設(shè)計(jì)直覺(jué)和調(diào)試能力將遠(yuǎn)超單純?cè)诂F(xiàn)成開發(fā)板上寫代碼。下次當(dāng)你看到網(wǎng)絡(luò)上熱門的“C8T6最小系統(tǒng)板原理圖”時(shí)你不僅能看懂每一部分的作用更能評(píng)價(jià)其設(shè)計(jì)優(yōu)劣甚至能根據(jù)自己的項(xiàng)目需求進(jìn)行優(yōu)化和裁剪。這才是從玩家走向工程師的關(guān)鍵一步。