从卫星接收机到组合导航【十】(编码器里程计采集)

里程计

里程计一般用于车载、采煤机、掘进机等无卫星的场景,大部分里程计内部为增量式编码器。
增量式编码器一般有A、B、Z三相,这里只使用A和B相,如果不需要分辨正转或者反转,单接A相或者单接B相即可。

接收硬件

接收编码器主要为TLP2160双路光耦芯片,其中原理图如下:
在这里插入图片描述
DI1+和DI1-分别为第一路的发光二极管正和负,DI2+、DI2-为第二路的。其中推荐使用电流如下:
在这里插入图片描述
再结合串联806欧姆电阻可得,输入电压范围为3.627V~12.09V(这里没算发光二极管电阻),这里我们这里使用的是5V差分电压,是在范围内的。

FPGA代码

直接贴代码

module encoder_dec
	(
    input sys_clk,
    input rst_n,
	
    input quad_a,
    input quad_b,
	
	output reg[31:0] encoder_a
	);

reg [4:0] delay_a;	//消抖
reg [4:0] delay_b;	//消抖

reg [1:0] div_a;	//消抖后a
reg div_update_a;

reg div_b;			//消抖后b

always @(posedge sys_clk) delay_a <= {delay_a[4-1:0], quad_a}; 
always @(posedge sys_clk) delay_b <= {delay_b[4-1:0], quad_b};

always@(posedge sys_clk or negedge rst_n) begin
	if(!rst_n) begin
		encoder_a <= 32'd0;

		div_a <= 2'd0;
		div_update_a <= 1'd0;
		div_b <= 1'd0;
	end
	else begin
		div_update_a <= 1'd0;
		
		if(delay_a == 5'b00000)begin
			div_a <= {div_a[0],1'b0};
			//div_update_a <= 1'd1;
		end
		else if(delay_a == 5'b11111)begin
			div_a <= {div_a[0],1'b1};
			div_update_a <= 1'd1;
		end
		
		if(delay_b == 5'b00000)begin
			div_b <= 1'b0;
		end
		else if(delay_b == 5'b11111)begin
			div_b <= 1'b1;
		end
		
		if(div_update_a == 1'd1)begin
			//产生上升沿了
			if(div_a == 2'b01) begin
				if(div_b == 1'b0) begin
					encoder_a <= encoder_a + 1'b1;
				end
				else begin
					encoder_a <= encoder_a - 1'b1;
				end
			end
		end
	end
end
endmodule

信号名称说明
sys_clk时钟
rst_n复位
quad_a编码器A相
quad_b编码器B相
encoder_a编码器计数值

其中流程为等待A相上升沿,再判断B相是高电平还是低电平,如果是高电平计数值加1,否则数值减1

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值