同步電動機運行穩定性和可靠性對工業生產有重要的影響。單片機用于同步電動機勵磁控制,由于軟件豐富,能使勵磁裝置結構簡化、功能增多且易于實現復雜的控制規律,同時還具有參數整定靈活,使用維護方便和故障自診斷功能。目前,國內許多基于單片機的同步電動機勵磁控制系統與傳統的模擬勵磁控制系統相比性能有很大的提高,但因為采用的單片機內部資源較少使得單片機外圍電路復雜,其內部控制程序采用查表的方法,這樣影響了整個勵磁控制系統的精度、快速性和穩定性。PIC16F877單片機內部資源豐富,廣泛應用于工業控制領域。我們研制了基于PIC16F877單片機的同步電動機新型智能勵磁控制系統,控制程序可以實時計算,利用內部的捕捉單元可以很容易實現自動投勵、全壓投切電路。同時我們通過控制晶閘管移相整流模塊的控制端電壓來控制整流模塊的輸出,使得整個系統硬件電路簡單、調試維護方便、系統性能較高。
PIC單片機簡介
1.PIC單片機(Peripheral Interface Controller)是一種用來開發和控制外圍設備的集成電路(IC)。一種具有分散作用(多任務)功能的CPU。與人類相比,大腦就是CPU,PIC 共享的部分相當于人的神經系統。
2.PIC單片機是一個小的計算機。
3.PIC單片機有計算功能和記憶內存像CPU并由軟件控制運行。然而,處理能力—般,存儲器容量也很有限,這取決于PIC的類型。但是它們的最高操作頻率大約都在20MHz左右,存儲器容量用做寫程序的大約1K—4K字節。
時鐘頻率與掃描程序的時間和執行程序指令的時間有關系。但不能僅以時鐘頻率來判斷程序處理能力,它還隨處理裝置的體系結構改變(1*)。如果是同樣的體系結構,時鐘頻率較高的處理能力會較強。
PIC單片機詳細介紹
這里用字來解釋程序容量。用一個指令(2*)表示一個字。通常用字節(3*)來表示存儲器(4*)容量。一個字節有8位,每位由1或0組成。PIC16F84A單片機的指令由14位構成。當把1K個指令轉換成位為:1 x 1,024 x 14 = 14,336位。再轉換為字節為:14,336/(8 x 1,024) = 1.75K。在計算存儲器的容量時,我們規定 1G 字節 = 1,024M 字節, 1M 字節 = 1,024K 字節, 1K 字節= 1,024 位. 它們不是以1000為倍數,因為這是用二進制計算的緣故。
1*計算機的物理結構,包括組織結構、容量、該計算機的CPU、存儲器以及輸入輸出設備間的互連。經常特指CPU的組織結構,包括它的寄存器、標志、總線、算術邏輯部件、指令譯碼與執行機制以及定時和控制部件。
2*指出某種操作并標識其操作數(如果有操作數的話)的一種語言構造
3*作為一個單位來操作(運算)的一個二進制字符串,通常比計算機的一個字短。
4*處理機內的所有可尋址存儲空間以及用于執行指令的其它內存儲器。
在計算存儲器的容量時,我們規定 1G 字節 = 1,024M 字節, 1M 字節 = 1,024K 字節, 1K 字節= 1,024 字節. 它們不是以1000為倍數,因為這是用二進制計算的緣故。
用PIC單片機使電路做的很小巧變得可能。
因為PIC單片機可以把計算部分、內存、輸入和輸出等都做在一個芯片內。所以她工作起來效率很高、功能也自由定義還可以靈活的適應不同的控制要求,而不必去更換不同的IC。這樣電路才有可能做的很小巧。
PIC單片機命名規則
PIC XX XXX XXX (X) -XX X /XX
1 2 3 4 5 6 7 8
1.前綴: PIC MICROCHIP 公司產品代號,特別地:dsPIC為集成DSP功能的新型PIC單片機
2.系列號:10、12、16、18、24、30、33、32,其中
PIC10、PIC12、PIC16、PIC18為8位單片機
PIC24、dsPIC30、dsPIC33為16位單片機
PIC32為32位單片機
3.器件型號(類型):
C CMOS 電路
CR CMOS ROM
LC 小功率CMOS 電路
LCS 小功率保護
AA 1.8V
LCR 小功率CMOS ROM
LV 低電壓
F 快閃可編程存儲器
HC 高速CMOS
FR FLEX ROM
4.改進類型或選擇
54A 、58A 、61 、62 、620 、621
622 、63 、64 、65 、71 、73 、74
42 、43 、44等
5.晶體標示:
LP 小功率晶體,
RC 電阻電容,
XT 標準晶體/振蕩器
HS 高速晶體
6.頻率標示:
-02 2MHZ,
-04 4MHZ,
-10 10MHZ,
-16 16MHZ
-20 20MHZ,
-25 25MHZ,
-33 33MHZ
7.溫度范圍:
空白 0℃至70℃,
I -45℃至85℃,
E -40℃至125℃
8.封裝形式:
L PLCC 封裝
JW 陶瓷熔封雙列直插,有窗口
P 塑料雙列直插
PQ 塑料四面引線扁平封裝
W 大圓片
SL 14腿微型封裝-150mil
JN 陶瓷熔封雙列直插,無窗口
SM 8腿微型封裝-207mil
SN 8腿微型封裝-150 mil
VS 超微型封裝8mm×13.4mm
SO 微型封裝-300 mil
ST 薄型縮小的微型封裝-4.4mm
SP 橫向縮小型塑料雙列直插
CL 68腿陶瓷四面引線,帶窗口
SS 縮小型微型封裝
PT 薄型四面引線扁平封裝
TS 薄型微型封裝8mm×20mm
TQ 薄型四面引線扁平封裝
pic單片機選型技巧
(1)“芯片含有(功能或數量)略大于設計需求”,“設計需求盡可能(用)芯片完成(少用外圍器件)”; (2)“選大(大廠)不選小,選多(供應量多)不選少,選名(名牌)不選渺(飄渺,不知詳情的廠子),選廉(廉價)但要好(質量保證)”。具體要從單片機應用的技術性、實用性和開可發性等方面來考慮:
1、內存
單片機FLASH的容量根據程序的大小確定,FLASH容量必須大于代碼量。舉例來說,如果你的代碼量大約50 KB,那么建議你選擇FLASH容量為64 KB或128 KB的單片機。
2、速度
單片機的運行速度首先看時鐘頻率,一般情況對于同一種結構的單片機,時鐘頻率越高速度越快。如果你的設計對速度要求很高,那么要選擇一個運行速度較快的單片機。例如,一般情況下,電機控制應用大多采用100ksps或更高的采樣速率,因此當單片機用于電機控制時,時鐘頻率要足夠高。總之,在選用單片機時要根據產品需要選擇時鐘頻率,不要片面追求高速度,時鐘頻率越高功耗也就越大。此外,單片機的穩定性、抗干擾性等參數基本上跟單片機的運行速度成反比。因此,要盡量尋找可以在很高的時鐘頻率下運行而功耗又不高的單片機。
3、外設需求
如果你的設計需要ADC、SPI、GPIO、USB等之類的外設,那么你需要尋找一款集成所有這些外設的單片機。因為,使用一個具有上述外設的單片機顯然比使用一個普通的單片機及外圍加一個單獨的ADC更為經濟。此外,外設集成于單片機同時也意味著更低的功耗,因為沒有可以產生功耗的外圍電路,也沒有用于連接外圍電路的能產生功耗的敷銅,只有單片機本身產生功耗。
4、方便的開發工具
這是個非常重要的方面,因為開發工具可以極大地影響你所設計的產品的功耗。很多公司都已經開發出了具有代碼優化功能的編譯器,所以當你編譯代碼的時候,編譯器會告知具體編譯信息,你可以根據編譯信息優化代碼以降低功耗。舉例來說,如果你的設計需要用到ADC、UART和GPIO等外設,你就需要初始化這些器件,但是設計中使用UART是有條件的(僅用于調試時顯示結果),此時編譯器會提示你禁用這個外設以降低功耗。必須得說這種智能化的開發工具對開發者來說是一種福音。
5、未來需求和兼容性
設計者在設計產品時需要考慮產品未來可能需要升級等之類的問題。例如,若需要給設計增加某些功能,那么可能需要增加內存、外設等,還可能需要加提高單片機的運行速度。因此,在單片機的選型上需要在當前設計需求以及未來設計上尋找平衡,以滿足不同程度的要求。
6、成本
一個好的設計不僅要功能完善,而且要滿足成本要求,如果無法控制成本,再好的設計也是枉然。因此,需要盡可能地降低單片機甚至整個產品的成本。
7、工作電壓(VCC)
單片機的工作電壓是指可以讓其正常工作所需要提供的電壓。工作電壓越高,單片機的功耗也就越大。因此,為了降低產品功耗,必須要盡可能地降低工作電壓。
除此之外,我還要建議設計者根據具體產品需求選擇合適芯片架構。若僅是個簡單的控制應用(如照明系統、電子玩具等),那么并不需要一個像ARM那樣具有復雜架構的芯片。此外,對于低功耗設計,單片機必須具有睡眠模式,基于中斷操作的睡眠模式/低功耗模式的使用是降低功耗的一個標準的行業慣例。
最后再來一句老生常談:不要拘泥與芯片是否先進,單片機只是一個工具,真正的功夫在于你的專業知識,要用最合適的芯片做出最合適的產品。
PIC單片機常用指令
#include 或 include
#include 偽指令的作用是把另外一個文件的內容全部包含復制到本偽指令所在的位置。被包含復制的文件可以是任何形式的文本文件,當然文件中的內容和語法結構必須是MPASM 能夠識別的。最經常被“include”的是針對 PIC 單片機內部特殊功能寄存器定義的包 含 頭 文 件 , 在MPLAB安 裝 后 它 們 全 部 放 在 路 徑 “ C:Program FilesMPLAB IDEMCHIP_Tools”下,每一個型號的 PIC 單片機都有一個對應的預定義包含頭文件,擴展名是“.inc”。除了一些符號預定義文件,你也可以把現有的其它程序文件作為一個代碼模塊直接“包含”進來作為自己程序的一部分。見例 3-01。
#include 把預定義的 PIC16F877A 寄存器符號包含到此處
#include ”math.asm” 把現有的程序文件包含進來作為自己代碼的一部分
例 3-01
請注意被包含文件的引用方式。一種是《》尖括號引用,這種引用意味著讓編譯器去默認的路徑下尋找該文件,MPASM默認的寄存器預定義文件存放路徑即為上面提及的MPLAB 安裝后的目錄;另一種是””雙引號引用,這種引用方式的意思是指示編譯器從引號中指定的全程文件路徑下尋找該文件。例 3-01 中”math.asm”沒有指定路徑,即意味著在當前項目路徑下尋找 math.asm 文件。如果編譯器找不到被包含的文件,將會有錯誤信息告知。請在你的源程序中盡量用 MPLAB 標準頭文件定義的寄存器符號。一來這些被定義的寄存器符號和芯片數據手冊上的描述一一對應,理解起來即直觀又容易;二來如果用你自己定義符號就缺乏一個大家能一起交流的標準平臺,其他人要解讀你的代碼時將費時費力。故例3-01 中的首行#include 包含引用偽指令可以說是 PIC 單片機程序編寫時的標準必備。
list
list 偽指令可以設定程序編譯時的一些信息,例如所選單片機的型號,編譯時選擇的缺省數制等。例如:
list p=16f877a, r=DEC 單片機型號為 PIC16F877A,無特別指明的數字為十進制數
例 3-02
如果程序開發時使用項目管理的模式,則所有 list 偽指令可以描述的參數項都可以在項目的設定選項中通過對話框的形式設定并保存。在此只需對 list 偽指令稍作了解即可。
__config
此偽指令的重要作用是把芯片的配置字設定在源程序中,請參閱 2.5 節的詳細說明。建議大家盡量用此偽指令把芯片的配置字寫在程序中。
__idlocs
PIC 單片機中有一處非常特殊的標記單元。它獨立于任何其它存儲器,唯一的作用就是作為一個標記。此標記值無法用軟件讀到,讀取和寫入的方法只有通過編程器實現。此標記值沒有讀保護,你可以利用它存放程序的版本或日期等信息。如果需要,則可以用偽指令 __idloc 在程序中定義具體的值。
__idloc 0x1234
設定芯片的標記值為 0x1234,注意前面有兩個下劃線符
例 3-03
和__config 偽指令定義的配置字一樣,用__idloc 定義的芯片標記值在最后也會存放在HEX 文件中,這就要求編程器能夠解析它。
errorlevel
errorlevel 的用途是控制編譯信息的輸出顯示。編譯器在編譯你的源程序時會提供很多信息,有些信息是你必須要處理的,例如錯誤信息(Error),只要有錯誤信息存在,你的程序將永遠無法完成編譯;有些可能只需要關注,例如警告信息(Warning);也有一些可能你根本就不感興趣,它們只是一些提示信息(Message)而已。注意出現警告和提示信息時將不會中止編譯器的編譯工作,你的程序將被編譯并最終產生 HEX 文件。圖 3-14 中顯示了一個程序編譯后的各種信息實例,其中既有錯誤信息,也有警告和提示信息。我們可以用errorlevel 偽指令來控制輸出信息的級別,或刻意關閉/打開一些提示信息。
編譯信息的輸出顯示級別有三種,分別是 0、1 和 2。級別 0 代表顯示所有信息,包括各種錯誤、警告和提示信息,如圖 3-14 所示;級別 1 代表顯示錯誤和警告信息,忽略提示信息;級別 3 代表只顯示錯誤信息而忽略警告和提示信息。在任何一個大的級別上還可以對某些信息單獨設定顯示或關閉。每個信息都有一個識別標號,見圖 3-14 中信息項“[]”中的數字,打開或關閉某類信息只需在 errorlevel 偽指令中引用信息識別標號,并在其前面用“+”或“-”號,即代表打開或關閉這一類信息,例如:
errorlevel 0, -302, -305 顯示所有信息,但不需要 302 和 305 這兩類提示信息
errorlevel 1, +305 顯示錯誤和警告信息,但同時還要關注 305 類的提示信息
#define / #undefine 例 3-04
#define 的作用是定義常數符號,即用一個符號變量替換另一個符號串或變量。被替換的可以是任意字母數字組成的符號但替換者本身不能是一個純數字。例如:
#define DELAY_TIME 1000 定義常數符號,即用 DELAY_TIME 符號代替 1000
#define KEY1 PORTB,7 用 KEY1 符號代替端口 PORTB 的第 7 引腳 例 3-05
用#define 偽指令定義符號后,可使程序中的變量或指令變得更具實際意義,也使程序變得更易維護。
指令“btfss PORTB,7”和“btfss KEY1”在事先用了例 3-05 中的#define 后編譯的結果是一樣的,但明顯地后者看起來更容易理解,一看就知道這是在測試編號為KEY1 的一個按鍵。
PIC指令功能分類表
類型 助記符 操作說明 命令說明
傳 送 類 MOVF F,dF→d 將F寄存器的內容傳送到F本身(d=1)或W(d=0)(影響狀態位)Z
MOVWF FW→F 將W寄存器的內容傳送到F,W內容不變-
MOVLW KK→W 將8位立即數傳送到W寄存器-
SWAPF F,dF半字節交換→dF寄存器的高4位和低4位交換位置后,結果存入F本身(d=1)或W(d=0)中-
算 術 運 算 類 ADDWF F,dF+W→dW寄存器的內容和F寄存器的內容相加,結果存入F(d=1)或W(d=0)中C,DC,Z
ADDLW F,dK+W→WW寄存器的內容和8位立即數相加,結果存入WC,DC,Z
INCF F,dF+1→dF寄存器的內容加1后,結果存入W(d=0)或F(d=1)中Z
SUBWF F,dF-W→dF寄存器的內容減去W寄存器的內容,結果存入W(d=0)或F(d=1)中C,DC,Z
SUBLW KK-W→W8位立即數減掉W寄存器的內容,結果存入WC,DC,Z
DECF F,dF-1→dF寄存器的內容減1后,結果存入W(d=0)或F(d=1)中Z
邏 輯 運 算 類 ANDWF F,dF∧W→dW寄存器的內容和F寄存器的內容相與,結果存入F(d=1)或W(d=0)中Z
ANDLW KK∧W→WW寄存器的內容和8位立即數相與,結果存入WZ
IORWF F,dF∨W→dW寄存器的內容和F寄存器的內容相或,結果存入F(d=1)或W(d=0)中Z
IORLW KK∨W→WW寄存器的內容和8位立即數相或,結果存入WZ
XORWF F,dF⊕W→dW寄存器的內容和F寄存器的內容相異或,結果存入F(d=1)或W(d=0)中Z
XORLW KK⊕W→WW寄存器的內容和8位立即數相異或,結果存入WZ
COMF F,dF取反→dF寄存器的內容取反后,結果存入F(d=1)或W(d=0)中Z
CLRF F0→F,寄存器復位F寄存器的內容被清為全0Z
CLRW -0→W,寄存器復位W寄存器的內容被清為全0Z
RLF F,dF帶C循環左移→d將F寄存器帶C循環左移,結果存入F本身(d=1)或W(d=0)。C
RRF F,dF帶C循環右移→d將F寄存器帶C循環右移,結果存入F本身(d=1)或W(d=0)。C
BCF F,B將F中第B位清0將寄存器的第B位清為0-
BSF F,B將F中第B位置1將寄存器的第B位置1-
程 序 跳 轉 類 INCFSZ F,dF+1→d,結果若為0則跳一步F寄存器的內容加1后,結果存入F本身(d=1)或W(d=0)。如結果為0則跳過下一條指令,否則順序執行-
DECFSZ F,dF-1→d,結果若為0則跳一步F寄存器的內容減1后,結果存入F本身(d=1)或W(d=0)。如結果為0則跳過下一條指令,否則順序執行-
BTFSC F,BF中第B位為0,則跳一步測試F寄存器的第B位。若F(B)=0,則跳過下一條指令,否則順序執行-
BTFSS F,BF中第B位為1,則跳一步測試F寄存器的第B位。若F(B)=1,則跳過下一條指令,否則順序執行-
CALL K調用子程序首先將PC+1推入堆棧,然后將11位常數K送入PC(10~0),同時將PCLATH(4,3)→PC(12,11),從而使PC=子程序入口地址-
GOTO K 無條件跳轉將11位常數K送入PC(10~0),同時將PCLATH(4,3)→PC(12,11),從而使PC=新地址-
RETURN -從子程序返回將堆棧頂端單元的內容彈出并送入PC,從而返回主程序斷點處-
RETLW KW帶參數子程序返回將堆棧頂端單元的內容彈出并送入PC,同時8位常數K→W,從而帶著參數返回主程序斷點處-
RETFIE -從中斷服務子程序返回將堆棧頂端單元的內容彈出并送入PC,從而返回主程序斷點處,同時將全局中斷使能位GIE置1,從新開放中斷-
控 制 類SLEEP -進入睡眠方式該指令執行后,單片機進入低功耗睡眠模式,時基電路停振TO,PD
CLRWDT -0→WDT將WDT寄存器和分配給它的預分頻器同時清為全0TO,PD
NOP -空操作空操作