本工程簡報透過控制如圖 1 所示的步進馬達,演示了 PIC16 可配置邏輯區塊(CLB)。CLB 使我們能夠整合並吸收通常圍繞微控制器的閘級(74 系列)緊連邏輯。其結果是更小的封裝尺寸、更精簡的物料清單和更低的整體成本。
-
CLB 架構獨立於 PIC16 微控制器核心運作。
-
步進馬達採用半步控制。
-
馬達透過方向按鈕和致能按鈕進行控制。
-
馬達以使用者設定的固定速度運轉。
-
數位邏輯使用 Verilog 編寫。沒錯,Verilog 現在已整合到 PIC16 中。
本專案重點介紹 PIC16F13145 的 Verilog 設計功能。點擊此處下載項目:
Stepper.X.zip (596.1 KB)
預備知識
在先前的文章中,我們探討了一個入門項目,幫助我們快速上手 Microchip PIC16 CLB。請在繼續閱讀之前先閱讀該文章,因為它介紹了 I/O 引腳配置以及如何使用 MPLAB MCC 工具連接簡單的邏輯區塊等預備知識。
不要將 Microchip 的 CLB 與 CLC 混為一談
Microchip 的可設定邏輯區塊(CLB)很容易與 PIC 的可設定邏輯單元(CLC)混淆。這很容易理解,因為兩者都提供數位邏輯功能,並且都出現在部分 PIC16 系列微控制器上。
從相對尺寸和功能的角度來理解 PIC16 數位邏輯周邊裝置會很有幫助:
切勿將 3.3V 直流電源與 12V 直流電源交叉連接。
警告:如圖 1 所示,試驗電路板的上軌直接連接到 12V 直流電源。切勿將 PIC 微控制器的接腳連接到此軌。否則,PIC 微控制器將會燒毀。
我曾經親身經歷過,我可以告訴你,這種情況發生得非常快。 PIC 微控制器不僅會爆炸,而且如果電腦的 USB 連接埠也燒毀,情況只會更糟。這是一個你永遠不會忘記的慘痛教訓。
重現實驗所需零件
圖 1 所示的步進馬達示範電路使用了以下組件(核心組件的 DigiKey 連結已提供):
-
Microchip EV06M52A Curious 評估板(PIC16F13145 微控制器)
-
馬達繞組返馳二極體
-
2N3904 三極體
-
每個三極管基極串聯一個 1kohm 電阻
-
LED 和電阻(詳見邏輯探針替代文章)
-
電源去耦電容(例如 1000uF 25VDC)
-
試驗電路板、導線和跳線
-
12VDC 電源供應器(圖中未顯示)
電路搭建
在嘗試搭建電路之前,請務必先閱讀預備文章。這將建立一個基準,簡化建造和故障排除過程。有了這些基礎,您應該能夠順利建立電路。請以圖 3 的原理圖以及圖 1 和圖 2 的圖片為指導。
技術提示:切記在每個馬達繞組上並聯一個返馳二極體。否則,會產生高壓尖峰,損壞 2N3904 電晶體。圖 2 中清晰地顯示了連接到試驗電路板導軌的二極體。
電晶體基極限流電阻在背景中可見。
為什麼這個演示專案使用 Verilog?
選擇 Verilog 的原因是,與閘級表示相比,它速度更快,也更容易進行故障排除。在這個例子中,Verilog 省去了繪製狀態-下一狀態以及輸出邏輯的卡諾圖(Karnaugh maps)的步驟。以前需要花費數小時才能完成的工作,現在只需幾分鐘即可完成。
同時,我也不想剝奪學習者設計門級解決方案的機會。使用 Verilog,我可以快速展示最終結果,然後建議你們花時間從頭開始手動建立狀態機。
就我個人而言:Verilog 確實令人驚艷。大約 25 年前我開始程式設計時,從未想過有一天會用 Verilog 為 PIC16 程式設計。當然,那時候我用的是組合語言。
步進馬達控制邏輯的 Verilog 編程
頂層控制邏輯的描述如圖4所示。它包含兩個部分:
-
狀態模組:此模組接收來自按鈕的致能和方向輸入。它維護一個 3-bit 狀態暫存器,用於控制半步序列。程式碼如清單1所示。我們可以看到,該模組作為一個3-bit加減計數器運作。
-
步進輸出模組:此模組接收 3-bit 狀態,並產生所需的輸出訊號,如圖 5 所示。程式碼如清單 2 所示。該模組作為一個譯碼器運行,其核心操作以查找表的形式實現。
為了簡化故障排除,這些模組是獨立建構的。狀態模組首先建置。它暫時連接到 PIC 的輸出端,並使用 LED 驗證其運作。
請注意,步進馬達專案大約佔用 50% 的數位邏輯資源。
module State(
input CLK, enable, dir,
output step_val_2, step_val_1, step_val_0
);
reg [2:0] step_val;
assign {step_val_2, step_val_1, step_val_0} = step_val;
always @(posedge CLK) begin
if (enable) begin
if (dir == 1'b0) begin
step_val <= step_val + 3'b001; // forward
end else begin
step_val <= step_val - 3'b001; // reverse
end
end
end
endmodule
清單 1:狀態模組的 Verilog 程式碼。
module StepperOutputs(
input CLK,
input step_val_2, step_val_1, step_val_0,
output out_3, out_2, out_1, out_0
);
reg [3:0] step_val;
assign {out_3, out_2, out_1, out_0} = step_val;
always @(posedge CLK) begin
case ({step_val_2, step_val_1, step_val_0})
3'b000: step_val <= 4'b1000;
3'b001: step_val <= 4'b1100;
3'b010: step_val <= 4'b0100;
3'b011: step_val <= 4'b0110;
3'b100: step_val <= 4'b0010;
3'b101: step_val <= 4'b0011;
3'b110: step_val <= 4'b0001;
3'b111: step_val <= 4'b1001;
default: step_val <= 4'b0000;
endcase
end
endmodule
清單 2:步進馬達輸出模組的 Verilog 程式碼
完結前感想
這個步進馬達專案是 PIC16 核心邏輯板 (CLB) 的一個標竿。現在我們了解了 PIC16 在功能、程式設計風格和易用性方面的預期表現。有了這個基準,我們就可以把 PIC16 與經典的 74 系列邏輯以及其他硬體描述語言 (HDL) 工具進行比較。
相關文章
如果您喜歡這篇文章,您可能也會對以下相關文章感興趣:
使用 MCC 工具的技巧: 防止 Microchip 的 MCC Melody 覆蓋您的程式碼
探索 RC 伺服機器人手臂中的結構體: What is a struct?
了解 PIC16 在工業應用中的使用: 光幕拆卸;Banner EZ-Screen LP 的內部




