程式碼下載
版本 1.0:quadrature_decoder.vhd (6.9 KB)
特點
- 正交解碼器元件的 VHDL 原始碼
- 輸出正交編碼器訊號的方向和位置計數
- 可選擇清除位置計數器以設定「原點」或索引
- 可配置位置計數器的大小
- 可配置解彈跳時間以確保輸入穩定性並消除毛刺
介紹
本文詳細介紹了一個用於 CPLD 和 FPGA 的正交解碼器電路,該電路以 VHDL 編寫。此元件讀取來自正交編碼器的訊號,確定其方向,追蹤其累積位置,並將結果輸出到使用者邏輯。此電路使用 Quartus II 13.1.0 版本設計。資源需求取決於具體實現。圖 1 展示了整合到系統中的正交解碼器的典型範例。
圖 1. 範例實現
背景
正交編碼器使用兩個通道來感測可移動設備的位置,通常是旋轉的磁碟/軸(旋轉編碼器)或線性條(線性編碼器)。磁碟或線條上有兩個編碼軌道,相位差 90 度,如圖 2 所示。當編碼軌道相對於固定感測器移動時,感測器輸出訊號與它們所看到的軌道部分相對應。
圖 2. 編碼軌和輸出訊號
正交解碼器負責解讀這些輸出訊號。透過計數兩個通道上的轉接,解碼器可以確定設備移動了多遠,並根據轉接的序列評估移動方向。如果設定了原點,解碼器上的計數會追蹤裝置相對於該原點的位置。一些旋轉正交編碼器包含另一個輸出通道,該通道每轉產生一個脈衝,稱為索引,通常用於此目的。
工作原理
同步與解彈跳
正交解碼器的第一層用於同步和解彈跳編碼器的輸入訊號。它基於另一文章「解彈跳邏輯電路(VHDL)」解釋和記錄的解彈跳邏輯電路,並進行了一些細微的修改(允許更精確的解彈跳時間,但需要額外的邏輯)。圖 3 描述了該電路。當輸入發生變化時,其對應的「互斥或(XOR)」閘的輸出將清除計數器。當輸入保持不變時,計數器開始計數。如果輸入保持穩定足夠長的時間,使計數達到 debounce_time 值,則新的值將儲存在最終暫存器中,並且計數器將停用,直到其中一個輸入再次變更。 a 和 b 輸入之間定義的關係允許它們共用一個解彈跳計數器,並且使用相同的時間週期來對兩者進行解彈跳。set_origin_n 輸入具有一個基於相同原理的獨立解彈跳電路。
圖 3. 同步與解彈跳電路
確定方向和位置
表 1 列出了可能的 a 和 b 輸入轉換,以及對應的方向和位置解碼值。
表 1. 真值表
如真值表所示,方向由下列公式決定:
direction = a_new XOR b_prev
位置的增量和減量根據相同的標準。只有當 a 和 b 的新值被驗證後,這些值才會被記錄下來。這種情況發生在達到解彈跳時間且 a 或 b 的值改變時。
set_origin_n 輸入同步清除位置計數器(設定參考位置),並停用方向輸出。
圖 4 顯示了邏輯電路。
圖 4. 解碼器電路
配置正交解碼器
正交解碼器的配置是透過設定 ENTITY 中的 GENERIC 參數來實現的。表 2 列出了這些參數。
表 2. 通用參數說明
設定位置計數器的大小
通用 positions 函數用於設定位置計數器的大小。計數器的輸出 position 值範圍為 0 到 positions - 1。如果計數器在任意方向上超出其範圍,則計數器將迴繞。(如果計數器從位置 0 開始遞減,則新值為 positions - 1。如果從 positions - 1 開始遞增,則新值為 0。)
設定 a 和 b 輸入的解彈跳時間
a 和 b 輸入的解彈跳時間由 debounce_time 通用參數設定。實際解彈跳時間為 (debounce_time + 2) * 系統時脈週期。該時間高度依賴具體應用。此參數的設定應使其短於編碼器訊號保持相同編碼的預期最短時間(由運動系統的速度和幾何形狀決定),並且足夠長以消除編碼轉換期間的毛刺或彈跳。預設值為 50,000,相當於 50MHz 時脈頻率下的 1ms。對於許多系統而言,解彈跳時間必須短得多。
設定 set_origin_n 輸入的解彈跳時間
set_origin_n 輸入具有獨立的解彈跳電路。由於此輸入可能來自按鈕或其他來源,因此它可能需要比 a 和 b 輸入更長的解彈跳時間。其解彈跳時間由 set_origin_debounce_time 通用函數設定。解彈跳時間為 (set_origin_debounce_time + 2) * 系統時脈週期。此通用函數的預設值為 500,000,對應於 50MHz 時脈的 10ms。
連接埠描述
表 3 描述了正交解碼器的連接埠。
表 3. 連接埠描述
範例波形
圖 5 展示了一個範例波形,用於說明正交解碼器的工作原理。在此範例中,positions 數配置為 16。當 a 和 b 輸入 (ab_tb) 沿正方向前進時,direction 輸出宣告及 positions 輸出遞增。當 set_origin_n 輸入解除宣告時,positions 輸出清除。一旦 set_origin_n 重新宣告,隨著輸入繼續沿著正方向前進,positions 輸出將從新的參考點開始繼續遞增。一旦切換到負方向,direction 輸出解除宣告,position 輸出遞減。當 position 輸出從 0 遞減時,它會迴繞到其最大值 15(positions -1)。

圖 5. 範例波形
結論
此正交解碼器是一個可編程式邏輯元件,用於追蹤正交編碼器訊號的方向和位置計數。位置計數器的大小和輸入的解彈跳時間均可設定。它還包含一個同步清零功能,允許使用者使用正交編碼器的索引功能設定參考位置或清除位置計數器。






