• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STEP FPGA的旋轉編碼器電路驅動

    基于STEP FPGA的旋轉編碼器電路驅動

    作者: 時間:2023-11-24 來源:電子森林 收藏

    硬件說明

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

    本文引用地址:http://www.czjhyjcfj.com/article/202311/453261.htm
    • 以編碼器工作原理可分為:光電式、磁電式和觸點電刷式。
    • 以碼盤刻孔方式不同分為:增量式和絕對式兩類。

    關于以上各類編碼器的區別,大家自行查閱資料,這里就不多做介紹了。
    我們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配置文件加載測試。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 仙游县| 浙江省| 阿克陶县| 丹巴县| 崇左市| 杭锦旗| 保山市| 永寿县| 秦皇岛市| 阿拉善右旗| 洪雅县| 塘沽区| 鹤山市| 克什克腾旗| 正蓝旗| 高要市| 泰顺县| 太白县| 西平县| 县级市| 尤溪县| 遵义市| 建始县| 平顶山市| 金堂县| 万州区| 平武县| 肥城市| 苍溪县| 莱州市| 晋城| 高密市| 台东县| 梁平县| 海口市| 中超| 新闻| 原平市| 枣庄市| 绥芬河市| 临漳县|