在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于STEP FPGA的旋轉(zhuǎn)編碼器電路驅(qū)動

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

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

            硬件說明

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

            本文引用地址:http://www.biyoush.com/article/202311/453261.htm
            • 以編碼器工作原理可分為:光電式、磁電式和觸點(diǎ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è)計實(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信號進(jìn)行延時鎖存
            	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配置文件加載測試。



            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉