Перейти к содержанию
    

Всем добрый!

 

Есть такая штука -

у нее 2 выхода A и B.

В начальный момент оба в состоянии "0".

Задача : если первым импуьс появится на выходе A ,то счетчик должен считать эти импульсы UP,

а если первым импуьс появится на выходе B ,то счетчик должен считать эти импульсы DOWN.

 

Как это можно реализовать на VHDL ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такая штука -

у нее 2 выхода A и B.

В начальный момент оба в состоянии "0".

Вы уверены?

В зависимости от положения оси значения А и В могут принимать любые значения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы уверены?

В зависимости от положения оси значения А и В могут принимать любые значения

В моем случае это так.

Механически реализовано, что в момент прекращения вращения ось фиксируется в таком положении.

А на будущее очень интересен вариант, соответствующий вашему вопросу!

Как определить в какую сторону вращается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы уверены?

В зависимости от положения оси значения А и В могут принимать любые значения

Это вы наверно путаете с квадратурным энкодером.

А в данном случае - типа как в старинных мышах.

 

В ВХДЛ не силён, но с т.з. схемотехники - решение очевидное.

XOR-им оба сигнала, получаем клок.

Этим клоком защелкиваем один из сигналов в D-триггере.

На выходе получаем направление. 0 - одно направление, 1 - противоположное.

Его подаём на вход направления реверсивного счётчика.

А по заднему фронту нашего клока можно считать.

 

Нет, отставить...

Тут на фронтах будут фокусы...

По фронту 1-го сигнала защёлкиваем 2-й.

Получаем однозначное направление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А и Б - последовательность импульсов, Б сдвинут на 180 градусов относительно А. Я на контролере делал след. образом- родсчет импульсов по каждому фронту, не важно положит. или отрицат. Направление счета- если А и В "0", приходит фронт полож. по А направление счета на увеличение, если полож. фронт по В то уменьшение счета. Пример кода на С для MC68HC908GP32:

signed int num;
char KbierTemp, trt;

  //************** Инициализация для работы энкодера ************************
  DIR_PORT_ENC &=~LINE_ENC;              //определяем линии управления энкодера на ввод
  PUL_PORT_ENC |= LINE_ENC;              //включаем подтягивающие резисторы на входах энкодера
  INTSCR_MODE1=OFF;                      //Инициализация прерываний по модулю KBIER. Динамический режим
  INTSCR_IMASK1=ON;                      //Инициализация прерываний по модулю KBIER. Запрет прерываний по модулю KBIR
  delay_10mks(10);
  KBIER=(PORT_ENC & LINE_ENC);           //Разрешить прерывания только для линий, установленных в "1"
  INTSCR_ACK1=ON;                        //Инициализация прерываний по модулю KBIER. Сброс тригера TKBI
  INTSCR_IMASK1=OFF;                     //Инициализация прерываний по модулю KBIER. Разрешение прерываний по модулю KBIR
  //************** end ****************************************************************
void interrupt 15 Isr_KBIER(void)
{
  if (!INA0_ENC && (KBIER & 0x02))
  {
     if (INB0_ENC)  ++num;
     if (!INB0_ENC) --num;
  }
  if (!INA1_ENC && (KBIER & 0x04))
  {
     if (!INB0_ENC) ++num;
     if (INB0_ENC)  --num;
  }
  if (!INB0_ENC && (KBIER & 0x01))
  {
     if (!INA0_ENC) ++num;
     if (INA0_ENC)  --num;
  }
  if (!INB1_ENC && (KBIER & 0x08))
  {
     if (INA0_ENC)  ++num;
     if (!INA0_ENC) --num;
  }
  KBIER=(PORT_ENC & LINE_ENC);
  INTSCR_ACK1=ON;                        //Сброс тригера TKBI
}

//*** Cекция для определения входов енкодера ***************************************
//*** ENCR
#define    	PORT_ENC                    	PTA			   //Порт входов енкодера
#define    	DIR_PORT_ENC                  DDRA			   //Направление линий входов енкодера
#define    	PUL_PORT_ENC                  PTAPUE		   //Направление линий входов енкодера
#define     INA0_ENC                      PTA_PTA1		   //Вход линии  А енкодера
#define     INA1_ENC                      PTA_PTA2		   //Вход линии ~А енкодера
#define   	INB0_ENC                     	PTA_PTA0		   //Вход линии  B енкодера
#define     INB1_ENC                      PTA_PTA3		   //Вход линии ~B енкодера
//#define     LINE_ENC                      0x09    	 //Используемые линии для работы энкодера в "1" не изпользуемые в "0"
#define     LINE_ENC                      0x0F    	//Используемые линии для работы энкодера в "1" не изпользуемые в "0"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По фронту 1-го сигнала защёлкиваем 2-й.

Получаем однозначное направление.

Абсолютно правильно.

D-триггером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютно правильно.

D-триггером.

 

Попробовал реализовать на VHDL в железе, все ОК.!!! Но очень много дребезга от этого механического устр-ва, а микросхема очень быстродействующая FPGA (250 MHz), по входу фильтрануть не получается, да и триггер Шмидта поставить не удастся, т.к. работаю на готовом продукте.

Всем спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как говорять, самостоятельно писали наверное только древне греки - не укого было списать :)

Нам же остается только пользоваться поиском и списывать :)

http://www.fpga4fun.com/QuadratureDecoder.html

Там есть фильтр от дребезга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал реализовать на VHDL в железе, все ОК.!!! Но очень много дребезга от этого механического устр-ва, а микросхема очень быстродействующая FPGA (250 MHz), по входу фильтрануть не получается, да и триггер Шмидта поставить не удастся, т.к. работаю на готовом продукте.

Всем спасибо!

Дребезг при определении направления не должен иметь никакого значения.

 

При определении скорости вращения - будет. Самый простой путь - RС цепочка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DpInRock, читаем внимательно:

работаю на готовом продукте.

О какой RC-цепочке идет речь?

 

XILINX, иногда еще полезно заглядывать на сайт прародителя вашего ника ;):

http://www.xilinx.com/products/boards/s3es...r_interface.pdf

http://www.xilinx.com/products/boards/s3es...r_interface.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О простой RC цепочке. Если у вас энкодер механический (фиговина такая с ручкой - иначе откуда дребезг), то просто припаять на сам энкодер. Либо по входу вашего триггера. Классическая защита от дребезга.

 

Но в любом случае - телепат из меня плохой. А вот энкодеры у меня работают замечательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DpInRock, читаем внимательно:

 

О какой RC-цепочке идет речь?

 

XILINX, иногда еще полезно заглядывать на сайт прародителя вашего ника ;):

http://www.xilinx.com/products/boards/s3es...r_interface.pdf

http://www.xilinx.com/products/boards/s3es...r_interface.zip

Ну ни фига себе! И плата почти моя (у меня для 3AN) и rotary encoder такой же! И для теста результат выводил на те же светодиоды!

Огромное спасибо! Бегу читать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О простой RC цепочке. Если у вас энкодер механический (фиговина такая с ручкой - иначе откуда дребезг), то просто припаять на сам энкодер. Либо по входу вашего триггера. Классическая защита от дребезга.

 

Но в любом случае - телепат из меня плохой. А вот энкодеры у меня работают замечательно.

Гм! Замечал дребезг и на оптическом энкодере. Для подтверждения сего факта, считал импульсы с двух фаз энкодера при его вращении. На одном из каналов появлялось +[1..6] импульсов на 2000000 общих. Обработка шла по прерываниям. Решил не заморачиваться с RC-цепочками, т.к. небыло времени на дополнительные исследования, а решил проблему поллингом. Причем решение о наличие логического уровня на входе решал не одной проверкой за полпериода сигнала, а, допустим, за 3. Если все три выборки содержат одинаковый уровень, то он и принимается действующим. После этого в течение длительного испытания количество импульсов на двух фазах энкодера стало одинаковым.

P.S. Подобным способом (но аппаратно) поллится USART в AVRках...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мой фильтр

 

 

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

library UNISIM;
use UNISIM.VComponents.all;

entity filtr_16t_v_01 is

port (												
f_clk						   : in  std_logic;
 f_en_low_fr_strob			   : in  std_logic;
input_nf						: in  std_logic;	 
output_f						: out  std_logic
);	
end entity filtr_16t_v_01;
------------------------------------------------------------------------------
-- Architecture section
------------------------------------------------------------------------------

architecture IMP of filtr_16t_v_01 is

	 signal  flag :   STD_LOGIC;
	 signal  cnt :   STD_LOGIC_VECTOR (0 to 5);

begin

filtr: process( f_clk) is
 begin
   if (f_clk = '1' and f_clk'event) and f_en_low_fr_strob = '1' then
		  if input_nf = flag then
				 if cnt(0) = '1' 
				  then
				  output_f <= flag;
				  else 
				  cnt <= cnt + 1;
				  end if;
			  else
			  cnt <= (others => '0'); 
			  flag <= input_nf;
			  end if;
	 end if;
 end process filtr;

end IMP;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый простой путь - RС цепочка.

А какие у вас номиналы, ну или пост. времени.

Я попробовал, что-то у меня дребезг не давит, а импульсы , при быстрм вращении валятся в половину.

 

Начал все с алгоритма мистера Чана (первая функция), но чего-то она тоже дребезжит. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...