1. 程式人生 > >電路設計與PCB布板(含MSP430程式除錯經驗淺談)

電路設計與PCB布板(含MSP430程式除錯經驗淺談)

上週調了一個電路板,結合到之前畫過的一塊板子,現在寫一點點心得,留作日後自我取笑解嘲。

首先,原理圖設計。

這玩意兒難得沒有百密一疏的時候,所以很少一次性投板後就不用改了的時候。一般參照datasheet的電路。一般常見的電路也可上網搜尋,一大把。但是一定要知道這些電阻電容作用是什麼,為什麼是這個值。比如簡單而言某個電阻是限流還是匹配(想到射頻電路里的阻抗網路那章了,傷不起)。

一般重要的晶片都要加退耦電容,在原理圖上可以擺成一排,布板時在哪需要往哪丟(別多了,原因是成本和空間考慮,一般一個鉭電容的作用範圍很大,具體網上可查)。

MOS管是壓控流型,所以很容易被靜電打壞,不要手潮溼得就去摸。靜電生活中太常見,簡而言之就是瞬間電壓,電壓很大幾千伏但是電流很小,所以能量很小。

關於三極體和MOS管的用法水很深,同事推薦了一本書,小日本鈴木雅臣寫的《電晶體電路設計》,推薦。尤其注意的是PMOSVds是小於0的,別接反了,否則,嘿嘿。MOS管比較貴,別浪費。另外如果打壞了,如果是電池供電,正極直接到地了,電池會……不過一般的鋰氬電池質量還行。

能在硬體中做的事就別留給軟體控制。這次專案中的直流電機驅動電路考慮到死區而沒有用互鎖設計,結果除錯時打壞了好幾個管子。

如果IO口不夠要去複用Jtag下載口之類的,要想好了,這樣就不能線上除錯了。

對外介面部分,你沒法確定人家會輸入什麼鬼東西那就加TVS管,否則到時板子上晶片怎麼被打壞的都不知道。

如果要用到數字電源和模擬電源,一定要隔離。“隔離”要好好揣摩啊。(看看隔離晶片有哪些)布板時分開覆銅。適當加磁珠。

對於一些LED指示燈,設計時一定要想想這個管腳上電後是什麼電平。否則它可不是在你想亮的時候亮,不想亮的時候不亮。原理圖不大的話,就別分頁級聯什麼的了,省的看的時候切換來切換去的。

模組之間留意電平匹配,雖然貌似CMOS電平和TTL電平可以堆到一起,但還要看看系統要求。

其次,PCB布板

PCB板的元器件封裝最好自己製作(當然排針、一般的貼片電阻電容之類的就不用了),這樣正確性才有保障,免得日後再次投板,再美其名曰:改版。一般常見的錯誤是晶片(特別是SOT)的管腳和實際的弄錯,這樣日後除錯的時候就不用到處飛線了。

一般對照晶片的datasheet 裡面關於封裝的部分自己製作,若對板子空間要求不特別大,建議引腳焊盤向內和向外延長共計1mm

左右,要是用mil的話估算下。不然嚴格按照datasheet的尺寸做好後以後焊接不方便。

另外注意了,原理圖和PCB管腳一定要一一對應,這是起碼的。

電路板佈局很重要,這一步做好了佈線才好弄。佈局時考慮下訊號流的走向。一般輸入模組(或者介面)在一邊,輸出模組(或者介面)在另一半。處理器晶片一般要儘量靠近中間,排針什麼的一定要儘量靠邊(其實做產品的話,按鍵,指示燈,介面什麼的都是結構已經決定好了的,硬體設計必須按照結構的來)。其它模組就考慮重要訊號線到處理器晶片相應管腳儘量短,然後綜合平衡一下。

晶振一定要優先放,離對應晶片管腳要近,兩個腿的線也儘量一樣長。

接下來就是佈線了。各個模組到MCU的訊號線優先布,這些線儘量不打過孔,一般的線過孔也別超過3個。走線最基本的別走銳角就對了(想當年大學時還使用自動佈線,悲劇)。

這些訊號線中又優先布高頻訊號線,不要走過孔,因為過孔有電容和電感特性,這裡主要是電感特性,你想想高頻訊號線上加個電感是什麼效果就知道了。舉個例子比如USB訊號線。

電源線可以留到最後布,因為一般都能走通。對於電源線,這裡又要注意過孔的電容效應了,不過有位前輩支了一招,重要電源線上如果要過孔,可以擺8個左右過孔的一起過,然後相當於8個電容並聯……目的達到了。

佈線時記得開啟自動推擠功能,這樣走線才平行,得到很漂亮的板子。

考慮到電磁相容之類的,可能的話,如果是兩層板,頂層走訊號線,底層走電源線,然後,一層橫向走,一層縱向走。

最後過孔一般全都加淚滴吧。記得板子要覆銅。

最後,軟體程式碼

這次用的還是微控制器,16位的MSP430,所以還是MCU呵呵。對於很多產品,對價格不敏感對功耗卻很敏感。430滿足這樣的東東。

寫程式碼一定要先架構好,否則到最後修修補補太多還不如推倒重新寫,問題是那時的你舍不捨得。

至於晶片能不能滿足需求,在設計初期的晶片選型時就應該論證過了,一般就看看對應模組有沒有,內部的儲存空間有多少,工作頻率滿足要求否之類的。

這次遇到的第一個問題,電池發熱。必然是有地方短路了,把板子全面檢查一遍,最後是MOS管那出問題了。

然後是下載時顯示棧滿,我當時開了50Kb的棧空間啊,什麼定義的區域性變數也不很多,最後發現是因為Jtag複用了IO口,而那個口被一直拉低了。最後解決方法是下載完成以後再利用那個口。

然後是程式下載到板子上結果不是自己想要的。還是學藝不精,原來自己耍小聰明,使用了定時器ACCR0CCR1CCR2全部,他們都用一個計數器TAR,在程式中間反覆修改CCR2的值使它在兩個值之間切換。結果才想起CCRx的值只能改大不能改小,否則就要先清空TAR。最後解決方法是CCR2不修改,合併兩個狀態。

然後是led燈閃爍正常,但是電機無動作。最後發現是PC沒有進到CCR0的中斷服務程式A0。但是問題在哪?問了萬兄,他也覺得沒有問題。後來我自己一點點試驗,才發現在初始化配置某個暫存器的時候,清空了TAR,這個貌似不應該有問題額,誤打誤撞的。

後來去掉初始化清空TAR操作後,A0是進去了,但是還是無動作,問萬兄,他在第一句看門狗初始化的地方設定斷點,結果發現晶片在不斷復位,明明有喂狗的,都不知道為什麼,最後關掉看門狗算了。

最後是檢測到的訊號不對,這個還得謝萬兄,經驗真是重要的東西。一方面,MSP430IO口如果設為輸入並且讀值給一個變數,如# define  KEYIN  P2IN&BIT0 ,然後使用ifKEYIN)之類的語句不行。讀取和判斷必須分開。另一方面。外部中斷優先順序比TimerA低,在A0中斷中開啟GIE也不會被外中斷打斷,但是不管開沒開GIE都會使某個外中斷標誌位置1,在響應完A0後去響應外中斷。

又快到週一了,想起了加菲貓的那句話:I hate Mondays!