你的位置:首頁 > 電路保護(hù) > 正文

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

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

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


硬件說明

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


以編碼器工作原理可分為:光電式、磁電式和觸點(diǎn)電刷式。

以碼盤刻孔方式不同分為:增量式和絕對(duì)式兩類。


關(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),


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

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


本設(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)格的消抖處理后再來做旋轉(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); 
	//通過旋轉(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)建工程,通過整個(gè)設(shè)計(jì)流程,生成FPGA配置文件加載測(cè)試。



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


推薦閱讀:

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

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

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

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

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


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

關(guān)閉

?

關(guān)閉