基於STEP FPGA的旋轉編碼器電路驅動
發布時間:2023-11-29 責任編輯:lina
【導讀】旋轉編碼器是用來測量轉速的裝置,因其人性化的操作被用於越來越多的電子設備中,旋轉編碼器有多種分類:以編碼器工作原理可分為:光電式、磁電式和觸點電刷式。以碼盤刻孔方式不同分為:增量式和絕對式兩類。
硬件說明
旋轉編碼器是用來測量轉速的裝置,因其人性化的操作被用於越來越多的電子設備中,旋轉編碼器有多種分類:
以編碼器工作原理可分為:光電式、磁電式和觸點電刷式。
以碼盤刻孔方式不同分為:增量式和絕對式兩類。
關於以上各類編碼器的區別,大家自行查閱資料,這裏就不多做介紹了。
我們STEP-BaseBoard底板上集成的EC11的旋轉編碼器就屬於增量式觸電電刷編碼器,其工作原理如下:
如上圖所示,當順時針旋轉時A信號提前B信號90度相位,當逆時針旋轉時B信號提前A信號90度相位,FPGA接收到旋轉編碼器的A、B信號時,可以根據A、B的狀態組合判定編碼器的旋轉方向。
程序設計中我們可以對A、B信號檢測,檢測A信號的邊沿及B信號的狀態,
當A信號上升沿時B信號為低電平,或當A信號下降沿時B信號為高電平,證明當前編碼器為順時針轉動
當A信號上升沿時B信號為高電平,或當A信號下降沿時B信號為低電平,證明當前編碼器為逆時針轉動
本設計實際電路連接如下:
Verilog代碼
// -------------------------------------------------------------------- // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // -------------------------------------------------------------------- // Module: Encoder // // Author: Step // // Description: Driver for rotary encoder // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2016/04/20 |Initial ver // -------------------------------------------------------------------- module Encoder ( input clk_in, //係統時鍾 input rst_n_in, //係統複位,低有效 input key_a, //旋轉編碼器A管腳 input key_b, //旋轉編碼器B管腳 input key_ok, //旋轉編碼器D管腳 output reg Left_pulse, //左旋轉脈衝輸出 output reg Right_pulse, //右旋轉脈衝輸出 output OK_pulse //按動脈衝輸出 ); localparam NUM_500US = 6_000; reg [12:0] cnt;//計數器周期為500us,控製鍵值采樣頻率 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) cnt <= 0; else if(cnt >= NUM_500US-1) cnt <= 1'b0; else cnt <= cnt + 1'b1; end reg [5:0] cnt_20ms; reg key_a_r,key_a_r1; reg key_b_r,key_b_r1; reg key_ok_r; //針對A、B、D管腳分別做簡單去抖操作, //如果對旋轉編碼器的要求比較高,建議現對旋轉編碼器的輸出做嚴格的消抖處理後再來做旋轉編碼器的驅動 //對旋轉編碼器的輸入緩存,消除亞穩態同時延時鎖存 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) begin key_a_r <= 1'b1; key_a_r1 <= 1'b1; key_b_r <= 1'b1; key_b_r1 <= 1'b1; cnt_20ms <= 1'b1; key_ok_r <= 1'b1; end else if(cnt == NUM_500US-1) begin key_a_r <= key_a; key_a_r1 <= key_a_r; key_b_r <= key_b; key_b_r1 <= key_b_r; if(cnt_20ms >= 6'd40) begin //對於按鍵D信號還是采用20ms周期采樣的方法,40*500us = 20ms cnt_20ms <= 6'd0; key_ok_r <= key_ok; end else begin cnt_20ms <= cnt_20ms + 1'b1; key_ok_r <= key_ok_r; end end end reg key_ok_r1;//對按鍵D信號進行延時鎖存 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) key_ok_r1 <= 1'b1; else key_ok_r1 <= key_ok_r; end wire A_state = key_a_r1 && key_a_r && key_a; //旋轉編碼器A信號高電平狀態檢測 wire B_state = key_b_r1 && key_b_r && key_b; //旋轉編碼器B信號高電平狀態檢測 assign OK_pulse = key_ok_r1 && (!key_ok_r); //旋轉編碼器D信號下降沿檢測 reg A_state_reg;//延時鎖存 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) A_state_reg <= 1'b1; else A_state_reg <= A_state; end //旋轉編碼器A信號的上升沿和下降沿檢測 wire A_pos = (!A_state_reg) && A_state; wire A_neg = A_state_reg && (!A_state); //通過旋轉編碼器A信號的邊沿和B信號的電平狀態的組合判斷旋轉編碼器的操作,並輸出對應的脈衝信號 always@(posedge clk_in or negedge rst_n_in)begin if(!rst_n_in)begin Right_pulse <= 1'b0; Left_pulse <= 1'b0; end else begin if(A_pos && B_state) Left_pulse <= 1'b1; else if(A_neg && B_state) Right_pulse <= 1'b1; else begin Right_pulse <= 1'b0; Left_pulse <= 1'b0; end end end endmodule
小結
本節主要為大家講解了旋轉編碼器的工作原理及軟件設計,需要大家掌握的同時自己創建工程,通過整個設計流程,生成FPGA配置文件加載測試。
免責聲明:本文為轉載文章,轉載此文目的在於傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯係小編進行處理。
推薦閱讀:
炬芯科技周正宇博士:存內計算是突破AI芯片算力和功耗矛盾的關鍵
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
- 芯科科技Tech Talks與藍牙亞洲大會聯動,線上線下賦能物聯網創新
- 冬季續航縮水怎麼辦?揭秘熱管理係統背後的芯片力量
- 從HDMI 2.1到UFS 5.0:SmartDV以領先IP矩陣夯實邊緣計算基石
- 小空間也能實現低噪供電!精密測量雙極性電源選型指南,覆蓋小功率到大電流全場景
- 直擊藍牙亞洲大會 2026:Nordic 九大核心場景演繹“萬物互聯”新體驗
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall




