一 增量式編碼器原理介紹
增量式編碼器是一種將位移信息轉(zhuǎn)換成周期性電信號,再將電信號轉(zhuǎn)換成脈沖計數(shù)的裝置。
通常增量式編碼器的接線輸出為兩根電源線,A,B,Z三個脈沖信號。其中可以通過A,B信號的相位關(guān)系來判斷編碼器的旋轉(zhuǎn)方向,可以人為規(guī)定若A相在前,B相落后90o 則為正方向,反之為負(fù)方向。
旋轉(zhuǎn)角度的計算也很簡單,
順時針:
θ = ( k + 1 ) ? 360 分 辨 率 heta=(k+1)*frac{360}{分辨率} θ=(k+1)?分辨率360
逆時針:
θ = ( 分 辨 率 ? ( k + 1 ) ) ? 360 分 辨 率 heta=(分辨率-(k+1))*frac{360}{分辨率} θ=(分辨率?(k+1))?分辨率360
每旋轉(zhuǎn)過一個單位刻度,A,B相都會產(chǎn)生一個脈沖,Z相信號是每轉(zhuǎn)一圈產(chǎn)生一個周期的高電平。
倍頻: 實際應(yīng)用中往往會采用兩倍頻或者四倍頻的方式來提高精度,一個周期內(nèi) A,B相的信號都會產(chǎn)生四次邊沿跳變,兩倍頻可以在上升沿,下降沿各計數(shù)一次;四倍頻則是每個邊沿變化都計數(shù)。
兩倍頻計數(shù)規(guī)則: 在A或B的上升、下降沿都計數(shù)。
四倍頻計數(shù)規(guī)則: 當(dāng)A為高電平時,B在上升沿則加1,下降沿則減1;A為低電平時,B在下降沿則減1,上升沿則加1;B為高電平時,A在上升沿則減1,下降沿則加1;在B為低電平時,A在上升沿則加1,下降沿則減1。
PUL =(A1 ^ B2) ^ (A2 ^ B1)
二 硬件實現(xiàn)
在查閱資料論文后,發(fā)現(xiàn)大部分都是采用的是三個模塊:頂層模塊;倍頻鑒相模塊,以及計數(shù)模塊。
其實完全可以綜合為一個模塊同時完成倍頻鑒相計數(shù)工作。代碼參考這位大佬
`timescale 1ns / 1ps module bianmaqi2(clk,rst_n ,quadA, quadB, position_out,A,B,DIR,index); input clk,rst_n, quadA, quadB,index; output [15:0] position_out; output A,B,DIR; reg [2:0] quadA_delayed, quadB_delayed; reg A,B,DIR; reg [15:0] position; always @(posedge clk) quadA_delayed <= {quadA_delayed[1:0], quadA}; always @(posedge clk) quadB_delayed <= {quadB_delayed[1:0], quadB}; //輸入緩存打拍 wire count_enable = quadA_delayed[1] ^ quadA_delayed[2] ^ quadB_delayed[1] ^ quadB_delayed[2]; //PUL =(A1^B2)^(A2^B1) wire count_direction = quadA_delayed[1] ^ quadB_delayed[2]; //DIR = C^D C是A1打一拍 D是B1打兩拍 always @(posedge osc or negedge rst_n ) begin if(!rst_n)begin position<=16'd0; A<=0; B<=0; DIR<=0; //復(fù)位信號 必須有復(fù)位信號來賦初值 否則在testbench中輸出為高阻態(tài) end else if(count_enable) begin if(count_direction) position<=position+1'b1; else position<=position-1'b1; A <= quadA_delayed[2]; B <= quadB_delayed[2]; DIR <= count_direction; end else position<=position; end assign position_out = position; endmodule
三 測試平臺
分別測試正轉(zhuǎn)和反轉(zhuǎn);
正轉(zhuǎn)即A比B超前90°;反轉(zhuǎn)即B比A超前90°。
`timescale 1 ps/ 1 ps module bianmaqi2_tb(); // constants // general purpose registers reg eachvec; // test vector input registers reg index; reg rst_n; reg osc; reg quadA; reg quadB; // wires wire A; wire B; wire DIR; wire [15:0] position_out; // assign statements (if any) bianmaqi2 i1 ( // port map - connection between master ports and signals/registers .A(A), .B(B), .rst_n(rst_n), .DIR(DIR), .index(index), .osc(osc), .position_out(position_out), .quadA(quadA), .quadB(quadB) ); initial begin //initialize inputs rst_n=1'b0; osc=1'b0; quadA =1; quadB =0; index =0; #5 rst_n=1'b1; end initial begin repeat(50)begin #20 quadB=1; #20 quadA=0; #20 quadB=0; #20 quadA=1; end $stop; end always #10 osc =~osc; //產(chǎn)生50MHz時鐘源 endmodule
`timescale 1 ps/ 1 ps module bianmaqi2_nishizhen_tb(); // constants // general purpose registers reg eachvec; // test vector input registers reg index; reg rst_n; reg osc; reg quadA; reg quadB; // wires wire A; wire B; wire DIR; wire [15:0] position_out; // assign statements (if any) bianmaqi2 i1 ( // port map - connection between master ports and signals/registers .A(A), .B(B), .rst_n(rst_n), .DIR(DIR), .index(index), .osc(osc), .position_out(position_out), .quadA(quadA), .quadB(quadB) ); initial begin //initialize inputs rst_n=1'b0; osc=1'b0; quadA =0; quadB =1; index =0; #5 rst_n=1'b1; end initial begin repeat(50)begin #20 quadA=1; #20 quadB=0; #20 quadA=0; #20 quadB=1; end $stop; end always #10 osc =~osc; //產(chǎn)生50MHz時鐘源 endmodule
四 總結(jié)
fpga設(shè)計模塊其實實現(xiàn)很簡單,主要還是Quartus和Modelsim的聯(lián)合仿真部分遇到了問題,主要還是testbench的編寫需要強(qiáng)化學(xué)習(xí)。
-
FPGA
+關(guān)注
關(guān)注
1642文章
21918瀏覽量
611981 -
電源線
+關(guān)注
關(guān)注
1文章
376瀏覽量
22367 -
電信號
+關(guān)注
關(guān)注
1文章
842瀏覽量
20929 -
增量式編碼器
+關(guān)注
關(guān)注
2文章
39瀏覽量
12819
原文標(biāo)題:FPGA接口實現(xiàn)----增量式編碼器
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
增量式光電編碼器
基于FPGA增量式編碼器的接口設(shè)計
M30增量式編碼器介紹

STM32-增量式旋轉(zhuǎn)編碼器測量

增量式編碼器有哪些優(yōu)點與缺點?
增量式編碼器和絕對值編碼器選哪個?
增量式編碼器

評論