基于STEP FPGA的旋轉(zhuǎn)編碼器電路驅(qū)動(dòng)
硬件說(shuō)明
旋轉(zhuǎn)編碼器是用來(lái)測(cè)量轉(zhuǎn)速的裝置,因其人性化的操作被用于越來(lái)越多的電子設(shè)備中,旋轉(zhuǎn)編碼器有多種分類:
本文引用地址:http://2s4d.com/article/202311/453261.htm關(guān)于以上各類編碼器的區(qū)別,大家自行查閱資料,這里就不多做介紹了。
我們STEP-BaseBoard底板上集成的EC11的旋轉(zhuǎn)編碼器就屬于增量式觸電電刷編碼器,其工作原理如下:
如上圖所示,當(dāng)順時(shí)針旋轉(zhuǎn)時(shí)A信號(hào)提前B信號(hào)90度相位,當(dāng)逆時(shí)針旋轉(zhuǎn)時(shí)B信號(hào)提前A信號(hào)90度相位,FPGA接收到旋轉(zhuǎn)編碼器的A、B信號(hào)時(shí),可以根據(jù)A、B的狀態(tài)組合判定編碼器的旋轉(zhuǎn)方向。
程序設(shè)計(jì)中我們可以對(duì)A、B信號(hào)檢測(cè),檢測(cè)A信號(hào)的邊沿及B信號(hào)的狀態(tài),
本設(shè)計(jì)實(shí)際電路連接如下:
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, //系統(tǒng)時(shí)鐘 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 //按動(dòng)脈沖輸出 ); localparam NUM_500US = 6_000; reg [12:0] cnt;//計(jì)數(shù)器周期為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; //針對(duì)A、B、D管腳分別做簡(jiǎn)單去抖操作, //如果對(duì)旋轉(zhuǎn)編碼器的要求比較高,建議現(xiàn)對(duì)旋轉(zhuǎn)編碼器的輸出做嚴(yán)格的消抖處理后再來(lái)做旋轉(zhuǎn)編碼器的驅(qū)動(dòng) //對(duì)旋轉(zhuǎn)編碼器的輸入緩存,消除亞穩(wěn)態(tài)同時(shí)延時(shí)鎖存 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 //對(duì)于按鍵D信號(hào)還是采用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;//對(duì)按鍵D信號(hào)進(jìn)行延時(shí)鎖存 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; //旋轉(zhuǎn)編碼器A信號(hào)高電平狀態(tài)檢測(cè) wire B_state = key_b_r1 && key_b_r && key_b; //旋轉(zhuǎn)編碼器B信號(hào)高電平狀態(tài)檢測(cè) assign OK_pulse = key_ok_r1 && (!key_ok_r); //旋轉(zhuǎn)編碼器D信號(hào)下降沿檢測(cè) reg A_state_reg;//延時(shí)鎖存 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 //旋轉(zhuǎn)編碼器A信號(hào)的上升沿和下降沿檢測(cè) wire A_pos = (!A_state_reg) && A_state; wire A_neg = A_state_reg && (!A_state); //通過(guò)旋轉(zhuǎn)編碼器A信號(hào)的邊沿和B信號(hào)的電平狀態(tài)的組合判斷旋轉(zhuǎn)編碼器的操作,并輸出對(duì)應(yīng)的脈沖信號(hào) 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
小結(jié)
本節(jié)主要為大家講解了旋轉(zhuǎn)編碼器的工作原理及軟件設(shè)計(jì),需要大家掌握的同時(shí)自己創(chuàng)建工程,通過(guò)整個(gè)設(shè)計(jì)流程,生成FPGA配置文件加載測(cè)試。
評(píng)論