使用 Microchip 的 PIC16 可配置邏輯區塊實現步進馬達驅動

本工程簡報透過控制如圖 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 數位邏輯周邊裝置會很有幫助:

  • 小邏輯:CLC 簡介,展示如何將 CLC 配置成經典的 555 定時器。

  • 大邏輯:CLB 簡介,展示一個範例專案。稍後我們將介紹步進馬達範例。


圖 1:示範專案中使用的步進馬達驅動器。

切勿將 3.3V 直流電源與 12V 直流電源交叉連接。

:warning:警告:如圖 1 所示,試驗電路板的上軌直接連接到 12V 直流電源。切勿將 PIC 微控制器的接腳連接到此軌。否則,PIC 微控制器將會燒毀。

我曾經親身經歷過,我可以告訴你,這種情況發生得非常快。 PIC 微控制器不僅會爆炸,而且如果電腦的 USB 連接埠也燒毀,情況只會更糟。這是一個你永遠不會忘記的慘痛教訓。

重現實驗所需零件

圖 1 所示的步進馬達示範電路使用了以下組件(核心組件的 DigiKey 連結已提供):

電路搭建

在嘗試搭建電路之前,請務必先閱讀預備文章。這將建立一個基準,簡化建造和故障排除過程。有了這些基礎,您應該能夠順利建立電路。請以圖 3 的原理圖以及圖 1 和圖 2 的圖片為指導。


圖 2:每個馬達繞組兩端並聯一個返馳二極體。每個電晶體基極串聯一個電阻。

技術提示:切記在每個馬達繞組上並聯一個返馳二極體。否則,會產生高壓尖峰,損壞 2N3904 電晶體。圖 2 中清晰地顯示了連接到試驗電路板導軌的二極體。

電晶體基極限流電阻在背景中可見。


圖 3:步進馬達專案的原理圖,馬達驅動採用分立式 NPN 電晶體。

為什麼這個演示專案使用 Verilog?

選擇 Verilog 的原因是,與閘級表示相比,它速度更快,也更容易進行故障排除。在這個例子中,Verilog 省去了繪製狀態-下一狀態以及輸出邏輯的卡諾圖(Karnaugh maps)的步驟。以前需要花費數小時才能完成的工作,現在只需幾分鐘即可完成。

同時,我也不想剝奪學習者設計門級解決方案的機會。使用 Verilog,我可以快速展示最終結果,然後建議你們花時間從頭開始手動建立狀態機。

就我個人而言:Verilog 確實令人驚艷。大約 25 年前我開始程式設計時,從未想過有一天會用 Verilog 為 PIC16 程式設計。當然,那時候我用的是組合語言。

步進馬達控制邏輯的 Verilog 編程

頂層控制邏輯的描述如圖4所示。它包含兩個部分:

  • 狀態模組:此模組接收來自按鈕的致能和方向輸入。它維護一個 3-bit 狀態暫存器,用於控制半步序列。程式碼如清單1所示。我們可以看到,該模組作為一個3-bit加減計數器運作。

  • 步進輸出模組:此模組接收 3-bit 狀態,並產生所需的輸出訊號,如圖 5 所示。程式碼如清單 2 所示。該模組作為一個譯碼器運行,其核心操作以查找表的形式實現。

為了簡化故障排除,這些模組是獨立建構的。狀態模組首先建置。它暫時連接到 PIC 的輸出端,並使用 LED 驗證其運作。

請注意,步進馬達專案大約佔用 50% 的數位邏輯資源。


圖 4:頂層邏輯描述,顯示兩個 Verilog 模組。

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 程式碼。


圖 5:具有八個離散輸出的步進馬達的半步驅動波形。

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 的內部