Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: 2 энкодера. Скорость/положение

2 энкодера. Скорость/положение 12 года 3 нед. назад #1177

  • Zliva
  • Zliva аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 2
  • Спасибо получено: 0
Здравствуйте!
У меня есть следующая задача. Есть 2 инкрементных энкодера 1024 имп/об. Нужно измерять положение и записывать это значение в ЦАПы. Снизу проект, как я это реализовал. Но задача расширилась. Нужно еще измерять и скорость и значение скорости писать в ЦАПы. То есть у меня на макете предусмотрен вход, дип переключатель, которым выбираем измерение скорости или положение.
Помогите разобраться с измерением скорости :(

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Zliva.

Re: 2 энкодера. Скорость/положение 12 года 3 нед. назад #1178

Есть ограничение на максимальный размер прикрепляемого файла, По моему 256к.
Если у вас больше, заархивируйте или разбейте на несколько файлов.
По сущесьву вопроса - скорость, это величина, обратно-пропорциональная времени между изменениями
положения. Поэтому вам нужно задаться 1.минимальным квантом времени(например 1 мс) и 2.разрядностью
результата (например 8 бит), а далее, в момент "изменения положения" начинать считать кванты,
а в следующий момент "изменения положения" результат куда-то фиксировать.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: 2 энкодера. Скорость/положение 12 года 3 нед. назад #1179

  • Zliva
  • Zliva аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 2
  • Спасибо получено: 0
Может у Вас есть простой пример для демонстрации? Посмотрите код реализованный для енкодера. Как реализовать переключение скорость/положение?
module WriteToDAC(Clk, CS, WR);

input Clk;
output reg WR = 1'b1;
output reg CS = 1'b1;

reg [1:0] state = 2'b0;

always @(posedge Clk ) 

	if(state == 2'b00)
		begin
			CS <= 1'b0; 
			WR <= 1'b0;
			state <=  state + 1'b1;
		end
	else 
	
	if(state == 2'b01) 
		begin
			state <=  state + 1'b1;				
		end
	else 
	
	if(state == 2'b10)
		begin
			CS <= ~CS; 
			WR <= ~WR;
			state <=  state + 1'b1;
		end
	else 
	
	if(state == 2'b11)
		begin
			state <= 2'b0;
		end	
	else state <= 2'b0;
	
endmodule 
module x4enc2(
	input clk,    
	input A,
	input B,
	output reg step,
	output reg dir
);

reg [1:0] Ar, Br;  

wire A_posedge = (Ar==2'b01);  // now we can detect A rising edges
wire A_negedge = (Ar==2'b10);  // and falling edges
wire B_posedge = (Br==2'b01);  // now we can detect B rising edges
wire B_negedge = (Br==2'b10);  // and falling edges

always @ (posedge clk)
begin
	Ar <= {Ar[0], A};
	Br <= {Br[0], B};
	if (A_posedge)
	begin
		step <= 1;
		if (~Br[1]) 
			dir<=1; // A leads B
		else 
			dir<=0;
		end
	else 
	if (A_negedge)
	begin
		step <= 1;
		if (Br[1]) 
			dir<=1;
		else 
			dir<=0;
	end
	else 
	if (B_posedge)
	begin
		step <= 1;
		if (Ar[1]) 
			dir<=1;
		else 
			dir<=0;
	end
	else 
	if (B_negedge)
	begin
		step <= 1;
		if (~Ar[1]) 
			dir<=1;
		else 
			dir<=0;
		end
	else 
	step <= 0;
end
endmodule

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Zliva.

Re: 2 энкодера. Скорость/положение 12 года 2 нед. назад #1197

www.fpga4fun.com/QuadratureDecoder.html - отличный сайт
module quadEncoder  
#(
		parameter C_DWIDTH 		= 32,
		parameter C_SPDWIDTH	=	16	
 ) 
 (
 		input																		clk, 
 		input																		clear_n, 
 		input																		sample_clk, 
 		input																		quadA, 
 		input																		quadB, 
 		output	reg signed	[C_DWIDTH - 1:0]		count, 
 		output			signed 	[C_SPDWIDTH - 1:0]	speed
 		
 	);

	reg 	[2:0] 						quadA_delayed, quadB_delayed;	
	reg 	[C_DWIDTH - 1:0] 	last_count;
	wire										count_enable;
	wire										count_direction;
	
	always @(posedge clk) begin : direction_detect
		quadA_delayed <= {quadA_delayed[1:0], quadA};
		quadB_delayed <= {quadB_delayed[1:0], quadB};
	end	

	always @(posedge clk or negedge clear_n)
		if (!clear_n)
			count <= 'd0;
		else if (count_enable)
			count <= (count_direction) ? count + 1'b1 : count - 1'b1;  

	always @(posedge sample_clk)
		last_count <= count;

	assign speed 						= count - last_count;
	assign count_enable			= quadA_delayed[1] ^ quadA_delayed[2] ^ quadB_delayed[1] ^ quadB_delayed[2];
	assign count_direction	= quadA_delayed[1] ^ quadB_delayed[2];

	
endmodule

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alexx188.
  • Страница:
  • 1
Время создания страницы: 0.090 секунд
Работает на Kunena форум