<noscript id="jftie"></noscript>
    <style id="jftie"><mark id="jftie"><dfn id="jftie"></dfn></mark></style>
  1. <span id="jftie"></span>
    • 国产成人精品久久一区二区,韩国精品久久久久久无码,国产精品国产高清国产av,欧美99久久无码一区人妻a片,亚洲高清码在线精品av,午夜人妻久久久久久久久,伊人热热久久原色播放www ,亚洲女教师丝祙在线播放
      你的位置:首頁 > 電路保護 > 正文

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

      發布時間:2023-11-29 責任編輯:lina

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


      硬件說明

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


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

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


      關于以上各類編碼器的區別,大家自行查閱資料,這里就不多做介紹了。


      我們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配置文件加載測試。



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


      推薦閱讀:

      有關Matter的十個關鍵問題,你知道正確的答案嗎?

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

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

      電池冷卻系統對電動汽車如何重要?

      如何為ADAS 域控制器構建多攝像頭視覺感知系統?


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

      關閉

      ?

      關閉

      主站蜘蛛池模板: 亚洲国产成人无码影片在线播放| 一本精品中文字幕在线| 亚洲大乳高潮日本专区| 色诱久久久久综合网ywww| 五月天国产成人av免费观看| 亚洲爆乳精品无码一区二区三区| 无码成人h免费视频在线观看| 欧美精品日韩精品一卡| 亚洲国产精品久久久久久久| 久久久久久曰本av免费免费| 东北女人毛多水多牲交视频| 成 人色 网 站 欧美大片在线观看| 又大又长粗又爽又黄少妇毛片 | 精品日产卡一卡二卡麻豆| 无码专区中文字幕无码野外| 亚洲依依成人综合网址| 在教室伦流澡到高潮hnp视频| 国产亚洲精品久久久久久国| 国产女精品视频网站免费| 亚洲国产成人无码影片在线播放| 丰满人妻熟妇乱又仑精品| 亚洲精品成人片在线观看精品字幕| 伊人蕉久中文字幕无码专区| 伊人久久大香线蕉av仙人| 久久综合婷婷成人网站| 亚洲中文字幕不卡无码| yyyy11111少妇无码影院| 蜜芽tv国产在线精品三区| 女人下边被添全过视频| 国产精品久久久久久熟妇吹潮软件| 人妻 色综合网站| 精品国产精品久久一区免费式| 日欧一片内射va在线影院| 天天狠天天透天干天天| 一本精品中文字幕在线| 插插无码视频大全不卡网站| 久久丫免费无码一区二区| 国产精品丝袜黑色高跟鞋| 国产成人综合日韩精品无码不卡| 欧美最猛性xxxxx大叫| 视频区 国产 图片区 小说区|