<abbr id="kc8ii"><menu id="kc8ii"></menu></abbr>
  • <input id="kc8ii"><tbody id="kc8ii"></tbody></input><table id="kc8ii"><source id="kc8ii"></source></table><kbd id="kc8ii"></kbd>
    <center id="kc8ii"><table id="kc8ii"></table></center>
  • <input id="kc8ii"></input>
    <abbr id="kc8ii"></abbr>
  • <abbr id="kc8ii"></abbr>
  • <center id="kc8ii"><table id="kc8ii"></table></center>
    <abbr id="kc8ii"></abbr>
    你的位置:首頁 > 電路保護 > 正文

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

    發(fā)布時間:2023-11-29 責(zé)任編輯:lina

    【導(dǎo)讀】旋轉(zhuǎn)編碼器是用來測量轉(zhuǎn)速的裝置,因其人性化的操作被用于越來越多的電子設(shè)備中,旋轉(zhuǎn)編碼器有多種分類:以編碼器工作原理可分為:光電式、磁電式和觸點電刷式。以碼盤刻孔方式不同分為:增量式和絕對式兩類。


    硬件說明

    旋轉(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代碼


    // --------------------------------------------------------------------
    // >>>>>>>>>>>>>>>>>>>>>>>>> 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)時鐘
    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@(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管腳分別做簡單去抖操作,
    	//如果對旋轉(zhuǎn)編碼器的要求比較高,建議現(xiàn)對旋轉(zhuǎn)編碼器的輸出做嚴(yán)格的消抖處理后再來做旋轉(zhuǎn)編碼器的驅(qū)動
    	//對旋轉(zhuǎn)編碼器的輸入緩存,消除亞穩(wěn)態(tài)同時延時鎖存
    	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;	//旋轉(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@(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信號的上升沿和下降沿檢測
    	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@(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è)計,需要大家掌握的同時自己創(chuàng)建工程,通過整個設(shè)計流程,生成FPGA配置文件加載測試。



    免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進行處理。


    推薦閱讀:

    有關(guān)Matter的十個關(guān)鍵問題,你知道正確的答案嗎?

    炬芯科技周正宇博士:存內(nèi)計算是突破AI芯片算力和功耗矛盾的關(guān)鍵

    如何設(shè)計電池充電速度快4倍的安全可穿戴設(shè)備

    電池冷卻系統(tǒng)對電動汽車如何重要?

    如何為ADAS 域控制器構(gòu)建多攝像頭視覺感知系統(tǒng)?


    特別推薦
    技術(shù)文章更多>>
    技術(shù)白皮書下載更多>>
    熱門搜索
    ?

    關(guān)閉

    ?

    關(guān)閉

    国产成人无码一二三区视频| 亚洲国产精品无码久久久不卡| 久久中文字幕视频、最近更新| 伊人久久无码中文字幕| 国产成人无码一区二区三区| 亚洲成a人在线看天堂无码| 最近中文字幕2019视频1| 久久久久无码精品国产| 7777久久亚洲中文字幕| 无码人妻久久一区二区三区| 人妻无码αv中文字幕久久琪琪布| 最新国产AV无码专区亚洲| 最近高清中文字幕无吗免费看| 野花在线无码视频在线播放 | 亚洲欧洲无码AV电影在线观看 | 精品人妻V?出轨中文字幕| 久久亚洲精品成人av无码网站| 亚洲一区中文字幕久久| 国产v亚洲v天堂无码网站| 高清无码中文字幕在线观看视频| 久久午夜无码鲁丝片午夜精品 | 88久久精品无码一区二区毛片| 中文字幕不卡高清视频在线| 日韩视频无码日韩视频又2021| 精品无码国产自产在线观看水浒传 | 亚洲精品无码久久久久久| 中文字幕久久久久人妻| 日韩免费无码一区二区三区| 日韩精品一区二区三区中文字幕| 免费无码婬片aaa直播表情| 一本一道AV无码中文字幕| 亚洲欧美日韩一区高清中文字幕| 波多野结衣亚洲AV无码无在线观看| 人妻无码人妻有码中文字幕| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 最新国产精品无码| 国产亚洲美日韩AV中文字幕无码成人| 无码精品一区二区三区在线| 老子午夜精品无码| 中文字幕在线观看亚洲日韩| 中文字幕7777|