基于STEP FPGA的旋轉(zhuǎn)編碼器電路驅(qū)動

 行業(yè)動態(tài)     |      2023-11-27 14:40:05    |      作者

硬件說明

旋轉(zhuǎn)編碼器是用來測量轉(zhuǎn)速的裝置,因其人性化的操作被用于越來越多的電子設(shè)備中,旋轉(zhuǎn)編碼器有多種分類:

  • 以編碼器工作原理可分為:光電式、磁電式和觸點電刷式。
  • 以碼盤刻孔方式不同分為:增量式和絕對式兩類。

關(guān)于以上各類編碼器的區(qū)別,大家自行查閱資料,這里就不多做介紹了。我們STEP-BaseBoard底板上集成的EC11的旋轉(zhuǎn)編碼器就屬于增量式觸電電刷編碼器,其工作原理如下:

如上圖所示,當(dāng)順時針旋轉(zhuǎn)時A信號提前B信號90度相位,當(dāng)逆時針旋轉(zhuǎn)時B信號提前A信號90度相位,FPGA接收到旋轉(zhuǎn)編碼器的A、B信號時,可以根據(jù)A、B的狀態(tài)組合判定編碼器的旋轉(zhuǎn)方向。程序設(shè)計中我們可以對A、B信號檢測,檢測A信號的邊沿及B信號的狀態(tài),

  • 當(dāng)A信號上升沿時B信號為低電平,或當(dāng)A信號下降沿時B信號為高電平,證明當(dāng)前編碼器為順時針轉(zhuǎn)動
  • 當(dāng)A信號上升沿時B信號為高電平,或當(dāng)A信號下降沿時B信號為低電平,證明當(dāng)前編碼器為逆時針轉(zhuǎn)動

本設(shè)計實際電路連接如下:


Verilog代碼

//-------------------------------------------------------------------- //>>>>>>>>>>>>>>>>>>>>>>>>>COPYRIGHTNOTICE<<<<<<<<<<<<<<<<<<<<<<<<< //-------------------------------------------------------------------- //Module:Encoder // //Author:Step // //Description:Driverforrotaryencoder //-------------------------------------------------------------------- //CodeRevisionHistory: //-------------------------------------------------------------------- //Version:|Mod.Date:|ChangesMade: //V1.0|2016/04/20|Initialver //-------------------------------------------------------------------- moduleEncoder ( input clk_in, //系統(tǒng)時鐘 input rst_n_in, //系統(tǒng)復(fù)位,低有效 input key_a, //旋轉(zhuǎn)編碼器A管腳 input key_b, //旋轉(zhuǎn)編碼器B管腳 input key_ok, //旋轉(zhuǎn)編碼器D管腳 output reg Left_pulse, //左旋轉(zhuǎn)脈沖輸出 output reg Right_pulse, //右旋轉(zhuǎn)脈沖輸出 output OK_pulse //按動脈沖輸出 ); localparam NUM_500US = 6_000; reg [12:0] cnt;//計數(shù)器周期為500us,控制鍵值采樣頻率 always@(posedgeclk_inornegedgerst_n_in)begin if(!rst_n_in)cnt<=0; elseif(cnt>=NUM_500US-1)cnt<=1'b0; elsecnt<=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管腳分別做簡單去抖操作, //如果對旋轉(zhuǎn)編碼器的要求比較高,建議現(xiàn)對旋轉(zhuǎn)編碼器的輸出做嚴(yán)格的消抖處理后再來做旋轉(zhuǎn)編碼器的驅(qū)動 //對旋轉(zhuǎn)編碼器的輸入緩存,消除亞穩(wěn)態(tài)同時延時鎖存 always@(posedgeclk_inornegedgerst_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; endelseif(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; endelsebegin cnt_20ms<=cnt_20ms+1'b1; key_ok_r<= key_ok_r; end end end reg key_ok_r1;//對按鍵D信號進行延時鎖存 always@(posedgeclk_inornegedgerst_n_in)begin if(!rst_n_in)key_ok_r1<=1'b1; elsekey_ok_r1<=key_ok_r; end wire A_state =key_a_r1&&key_a_r&&key_a; //旋轉(zhuǎn)編碼器A信號高電平狀態(tài)檢測 wire B_state =key_b_r1&&key_b_r&&key_b; //旋轉(zhuǎn)編碼器B信號高電平狀態(tài)檢測 assign OK_pulse =key_ok_r1&&(!key_ok_r); //旋轉(zhuǎn)編碼器D信號下降沿檢測 reg A_state_reg;//延時鎖存 always@(posedgeclk_inornegedgerst_n_in)begin if(!rst_n_in)A_state_reg<=1'b1; elseA_state_reg<=A_state; end //旋轉(zhuǎn)編碼器A信號的上升沿和下降沿檢測 wire A_pos =(!A_state_reg)&&A_state; wire A_neg =A_state_reg&&(!A_state); //通過旋轉(zhuǎn)編碼器A信號的邊沿和B信號的電平狀態(tài)的組合判斷旋轉(zhuǎn)編碼器的操作,并輸出對應(yīng)的脈沖信號 always@(posedgeclk_inornegedgerst_n_in)begin if(!rst_n_in)begin Right_pulse<=1'b0; Left_pulse<=1'b0; endelsebegin if(A_pos&&B_state)Left_pulse<=1'b1; elseif(A_neg&&B_state)Right_pulse<=1'b1; elsebegin Right_pulse<=1'b0; Left_pulse<=1'b0; end end end endmodule


小結(jié)

本節(jié)主要為大家講解了旋轉(zhuǎn)編碼器的工作原理及軟件設(shè)計,需要大家掌握的同時自己創(chuàng)建工程,通過整個設(shè)計流程,生成FPGA配置文件加載測試。