完成的工作 我以選題二為任務目標 - 經過自學,基本了解了MSP430G2553芯片的結構、外設模塊,加上之前利用CCS軟件給MSP430單片機燒制過程序,已基本了解CCS編程基本知識。
- 掌握了利用AD軟件繪制原理圖的基本步驟,并能根據原理圖繪制PCB圖,其中的布局布線原則能好好遵守。
- 制板到手后通過對貼片元器件的焊接,大大提高了焊接的能力,能保證不虛焊、焊反等問題并具有一定的美觀性。
- 通過查閱資料加上自己的改進完成了代碼的調試,最后的溫度采集和控制系統能實現利用OLED顯示實時溫度和供電電壓,并能輸出PWM波控制電機運轉,溫度越高PWM波占空比越高電機轉得越快。
二、系統設計 2.1 硬件設計 2.1.1 硬件系統方案框圖及介紹 
包含六大模塊,分別是:DS18B20,實現對溫度的采集; AMS1117,穩壓芯片組成電源部分; OLED,將采集的信息顯示在屏幕上; L9110S,驅動電機運轉; MAX3232,實現RS-232性能,搭配四個0.1uF的電容組成電池供電設備。 MSP430G2553,整個系統的CPU; 2.1.2MSP430G2553單片機的特點 ? 低電源電壓范圍:1.8V 至 3.6V ? 超低功耗 – 運行模式:230μA(在 1MHz 頻率和 2.2V 電壓條件下) – 待機模式:0.5μA – 關閉模式(RAM 保持):0.1μA ? 5 種節能模式 ? 可在不到 1μs 的時間里超快速地從待機模式喚醒 ? 16 位精簡指令集 (RISC) 架構,62.5ns 指令周期時間 ? 基本時鐘模塊配置 – 具有四種校準頻率并高達 16MHz 的內部頻率 – 內部超低功耗低頻 (LF) 振蕩器 – 32kHz 晶振 – 外部數字時鐘源 ? 兩個 16 位 Timer_A,分別具有三個捕獲/比較寄存器 ? 多達 24 個支持觸摸感測的 I/O 引腳 2.1.3MSP430G2553單片機管腳作用 2.1.4原理圖設計主要規范 1、元件編號以設計圖為準,不要修改元件的原始編號 2、以設計模塊為單元進行繪制,完整的單元模塊內元件用導線連接 3、功能模塊之間用網絡標號連接 4、重要器件的管腳與PDF文檔一致 5、特殊器件的原理圖庫制作要簡潔且能說明問題 6、引出所需的各種接口如電源接口、測試接口、下載接口等,功能模塊之間添加跳線為模塊測試用 7、有極性區分的兩引腳器件連接注意正負如極性電容、數碼管(共陽共陰要實測)等,三引腳器件連接注意引腳功能排列順序如電位器、三極管、集成穩壓電源芯片等。 8、電阻、二極管等在原理圖庫中的符號直接修改成小一些的符號(以10mil為單位合理縮小)。 9、以A4大小繪圖,盡量緊促 10、自制封裝器件的單位用公制mm。 11、元件外圍邊框為元件焊接放置時的垂直投影 12、元件的絲印層不要覆蓋至焊盤 13、焊盤孔徑大小較管腳尺寸(方形引腳器件應測量對角尺寸)大0.2~0.3mm,具體值視具體器件而定,優先采用0.6mm、0.8mm、1.0mm、1.2mm等尺寸 14、焊盤的外徑應為大于等于焊盤孔徑的2倍 15、自制元件封裝的命名:元件編號—安裝方式(默認為立式安裝可不做標注,臥式安裝時標W) 16、常用元件可參考原庫封裝 17、特殊元件封裝的參考點設置以PCB板的裝配圖尺寸標注的參考點為準 18、有極性區分的兩引腳器件1腳為正,三引腳器件連接注意引腳排列與功能一致(尤其注意三極管的管腳與原理圖及手冊要對應) 2.1.5 系統原理圖及各部分介紹 溫度采集模塊 供電模塊 驅動電機模塊 電池充電模塊 系統CPU OLED顯示模塊 2.1.6 PCB設計主要規范和PCB圖 (1)不同電壓等級電源應該隔離,電源走線不應交叉。 (2)走線采用 45°拐角或圓弧拐角,不允許有尖角形式的拐角。 (3)PCB走線直接連接到焊盤的中心,與焊盤連接的導線寬度不允許超過焊盤外徑的大小。 (4)高頻信號線的線寬不小于 20mil,外部用地線環繞,與其他地線隔離。 (5)干擾源(DC/DC 變換器、晶振、變壓器等)底部不要布線,以免干擾。 (6)盡可能加粗電源線和地線,在空間允許的情況下,電源線的寬度不小于 50mil。 (7)低電壓、低電流信號線寬 9~30mil,空間允許的情況下盡可能加粗。 (8)信號線之間的間距應該大于 10mil,電源線之間間距應該大于 20mil。 (9)大電流信號線線寬應該大于 40mil,間距應該大于 30mil。 (10)過孔最小尺寸優選外徑 40mil,內徑 28mil。在頂層和底層之間用導線連接時,優選焊盤。 (11)不允許在內電層上布置信號線。 (12)內電層不同區域之間的間隔寬度不小于 40mil。 (13)在繪制邊界時,盡量不要讓邊界線通過所要連接到的區域的焊盤。 (14)在頂層和底層鋪設敷銅,建議設置線寬值大于網格寬度,完全覆蓋空余空間,且不留有死銅,同時與其他線路保持 30mil(0.762mm)以上間距(可以在敷銅前設置安全間距,敷銅完畢后改回原有安全間距值)。 (15)在布線完畢后對焊盤作淚滴處理。 (16)金屬殼器件和模塊外部接地。 (17)放置安裝用和焊接用焊盤。 (18)DRC 檢查無誤。 2.1.7原理圖和PCB設計軟件 (1)原理圖編譯時,提示Net has no driving source 一是將對應元件的管腳類型修改為對應的類型;(如果是input、output等,表示進行電氣規則檢查,需要將相連接的關聯元件的管腳類型都進行相應設置,比如:這兒5腳是input,則和它連接的部分可調整為output;如果是passive類型,則表示不需要進行電氣規則檢測。) 第二個方法是:點擊“放置——指示——沒有ERC”,這兒,沒有ERC即表示不就行電氣規則檢查,然后,在告警的相應點處放置一個No ERC即可 (2)原理圖編譯時,提示Floating Net Label...at... 網絡標號懸浮,沒有連接 (3)畫完原理圖的時候一定要讓所有的元件都有封裝,否則導PCB的時候會找不到元件 (4)若發現圖不正確,一定要先改原理圖,再用原理圖更PCB. (5)PCB原件移動提示綠色報錯問題 可能的原因:1、不符合DRC規則,比如原件之間距離過近 2、右下角ROOM沒有刪除 2.1.8 焊接電路板注意事項 1、選擇合適的焊接溫度 電烙鐵的焊接溫度過高或者過低,都容易造成焊接不良。 2、焊接元器件遵循從小到大的原則 焊接元器件要先焊接小,再焊接大。 3、注意極性反向 像一些電容、電阻、二極管和三極管,是有極性方向的,在焊接時要避免接反。 4、錫不易過多 焊接時要確保焊點的周圍都有錫,防止虛焊,但并不是錫越多越好,當焊點的錫量層錐形即是最好的。電路板焊接時還要注意通風,可以選擇配備一個抽風機,防止焊接時產生的氣體吸入人體,對人體造成傷害。 2.2 軟件設計 2.2.1 軟件設計流程 
測溫函數
#ifndef __DS18B20_H
#define __DS18B20_H
#include<msp430g2553.h>
#define DQ_OUT P2DIR|=BIT1
#define DQ_IN P2DIR&=~BIT1
#define DQ_H P2OUT|=BIT1
#define DQ_L P2OUT&=~BIT1
#define DQ_READ (P2IN&BIT1)
#define uchar unsigned char
#define uint unsigned int
float readtemperature(void);
#endif //__DS18B20_H
OLED顯示函數
#ifndef __OLED_H
#define __OLED_H
#include <msp430.h>
#include <intrinsics.h>
#define u8 unsigned char
#define u32 unsigned int
#define OLED_CMD 0 //寫命令
#define OLED_DATA 1 //寫數據
#define Set_Bit(val, bitn) (val |= (/*1 <<*/(bitn)))
#define Clr_Bit(val, bitn) (val &= ~(/*1<<*/(bitn)))
#define Get_Bit(val, bitn) (val & (1<<(bitn)) )
//----------------------------------------------------------------------------------
//OLED SSD1306 SPI 時鐘D0
//#define OLED_SSD1306_SCLK_DIR (P1DIR)
//#define OLED_SSD1306_SCLK_OUT (P1OUT)
#define OLED_SSD1306_SCLK_PIN_NUM (BIT7)
#define OLED_SSD1306_SCLK_IO_INIT (Set_Bit(P3DIR,OLED_SSD1306_SCLK_PIN_NUM))
#define OLED_SCLK_Set() (Set_Bit(P3OUT,OLED_SSD1306_SCLK_PIN_NUM))
#define OLED_SCLK_Clr() (Clr_Bit(P3OUT,OLED_SSD1306_SCLK_PIN_NUM))
//----------------------------------------------------------------------------------
//OLED SSD1306 SPI 數據D1
//#define OLED_SSD1306_SDIN_DIR (P1DIR)
//#define OLED_SSD1306_SDIN_OUT (P1OUT)
#define OLED_SSD1306_SDIN_PIN_NUM (BIT7)
#define OLED_SSD1306_SDIN_IO_INIT (Set_Bit(P1DIR,OLED_SSD1306_SDIN_PIN_NUM))
#define OLED_SDIN_Set() (Set_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))
#define OLED_SDIN_Clr() (Clr_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))
//----------------------------------------------------------------------------------
//OLED SSD1306 數據/命令DC
//#define OLED_SSD1306_DC_DIR (P1DIR)
//#define OLED_SSD1306_DC_OUT (P1OUT)
#define OLED_SSD1306_DC_PIN_NUM (BIT5)
#define OLED_SSD1306_DC_IO_INIT (Set_Bit(P2DIR,OLED_SSD1306_DC_PIN_NUM))
#define OLED_DC_Set() (Set_Bit(P2OUT,OLED_SSD1306_DC_PIN_NUM))
#define OLED_DC_Clr() (Clr_Bit(P2OUT,OLED_SSD1306_DC_PIN_NUM))
//----------------------------------------------------------------------------------
//OLED SSD1306 片選CS
//#define OLED_SSD1306_CE_DIR (P1DIR)
//#define OLED_SSD1306_CE_OUT (P1OUT)
#define OLED_SSD1306_CE_PIN_NUM (BIT3)
#define OLED_SSD1306_CE_IO_INIT (Set_Bit(P2DIR,OLED_SSD1306_CE_PIN_NUM))
#define OLED_CS_Set() (Set_Bit(P2OUT,OLED_SSD1306_CE_PIN_NUM))
#define OLED_CS_Clr() (Clr_Bit(P2OUT,OLED_SSD1306_CE_PIN_NUM))
//----------------------------------------------------------------------------------
//OLED SSD1306 復位/RES
//#define OLED_SSD1306_RST_DIR (P1DIR)
//#define OLED_SSD1306_RST_OUT (P1OUT)
#define OLED_SSD1306_RST_PIN_NUM (BIT4)
#define OLED_SSD1306_RST_IO_INIT (Set_Bit(P2DIR,OLED_SSD1306_RST_PIN_NUM))
#define OLED_RST_Set() (Set_Bit(P2OUT,OLED_SSD1306_RST_PIN_NUM))
#define OLED_RST_Clr() (Clr_Bit(P2OUT,OLED_SSD1306_RST_PIN_NUM))
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
//-----------------OLED端口定義----------------
void delay_ms(unsigned int ms);
//OLED控制用函數
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);
void OLED_ShowString(u8 x,u8 y, u8 *p);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
#endif
測電壓函數
void ADC_unit()
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
ADC10CTL1 |= CONSEQ_2; //單通道重復采樣模式
ADC10CTL0 |= SREF_1+REFON+REF2_5V;//選擇內部參考源 2.5V,打開基準源
ADC10CTL0 |= ADC10SHT_3+MSC; //過采樣率設置為 64 個采樣周期,打開 AD 轉換
ADC10CTL1|= ADC10SSEL_1+ADC10DIV_1+SHS_0; //ACLK2 分 頻 為 采 樣 時 鐘 , 用ADC10SC 觸發采集
ADC10CTL1 |=INCH_3; //選擇通道 A3
ADC10CTL0 |= ADC10ON; //開啟 ADC10
ADC10AE0 |= BIT3; //開啟外部通道 A3
}
void readvoltage()
{
Voltage=0;
int i=0;
ADC10_Result=0;
for(;i<20;i++)
{
ADC10CTL0 |=ENC+ADC10SC; //開始轉換
//while((ADC10CTL0 &ADC10IFG)==0); //等待 ADC10IFG 標志變高(轉換完成)
ADC10_Result+=ADC10MEM; //讀取采樣結果
}
ADC10_Result= ADC10_Result/20;
Voltage=(ADC10_Result*2.5*4)/1023;
}
PWM波輸出函數
void sys_Clock_Init() //時鐘初始化為 1MHz;
{
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
}
void PMW_OUT_Init () //PWM 輸出初始化
{
P3DIR |= BIT5;
P3SEL |= BIT5;
TA0CTL |= TASSEL_1+TACLR+MC_1;
TA0CCTL1 |= OUTMOD_7; //選擇高電平模式的 PWM 輸出
TA0CCR0=500; // TA1CCR0 寫入 2000(1MHZ/2000)輸出達到了 500HZ
}
2.2.2 程序編程的主要規范
1.程序起名望文知義;
2.變量、函數起名規范;
3.循環變量可以用i,j,k;
4.計數器、累加器,一定要先賦初值0,循環內部循環變量需要變化;
5.注釋規范;
6.代碼縮進對齊;
7.適當空行,將不同功能程序段分開,每段的最前頭,有單獨的注釋;
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便保存):
word文檔.7z
(987 KB, 下載次數: 34)
2021-11-4 04:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|