реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ENCODER, Помогите начинающему!
XILINX
сообщение Jul 21 2009, 06:52
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 12-01-09
Из: ЛИТВА
Пользователь №: 43 233



Всем добрый!

Есть такая штука -
у нее 2 выхода A и B.
В начальный момент оба в состоянии "0".
Задача : если первым импуьс появится на выходе A ,то счетчик должен считать эти импульсы UP,
а если первым импуьс появится на выходе B ,то счетчик должен считать эти импульсы DOWN.

Как это можно реализовать на VHDL ?
Go to the top of the page
 
+Quote Post
VladKot
сообщение Jul 21 2009, 07:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 6-08-06
Из: Tallinn, Estonia
Пользователь №: 19 351



Цитата(XILINX @ Jul 21 2009, 09:52) *
Есть такая штука -
у нее 2 выхода A и B.
В начальный момент оба в состоянии "0".

Вы уверены?
В зависимости от положения оси значения А и В могут принимать любые значения
Go to the top of the page
 
+Quote Post
XILINX
сообщение Jul 21 2009, 07:10
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 12-01-09
Из: ЛИТВА
Пользователь №: 43 233



Цитата(VladKot @ Jul 21 2009, 10:01) *
Вы уверены?
В зависимости от положения оси значения А и В могут принимать любые значения

В моем случае это так.
Механически реализовано, что в момент прекращения вращения ось фиксируется в таком положении.
А на будущее очень интересен вариант, соответствующий вашему вопросу!
Как определить в какую сторону вращается?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 21 2009, 07:13
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(VladKot @ Jul 21 2009, 11:01) *
Вы уверены?
В зависимости от положения оси значения А и В могут принимать любые значения

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

В ВХДЛ не силён, но с т.з. схемотехники - решение очевидное.
XOR-им оба сигнала, получаем клок.
Этим клоком защелкиваем один из сигналов в D-триггере.
На выходе получаем направление. 0 - одно направление, 1 - противоположное.
Его подаём на вход направления реверсивного счётчика.
А по заднему фронту нашего клока можно считать.

Нет, отставить...
Тут на фронтах будут фокусы...
По фронту 1-го сигнала защёлкиваем 2-й.
Получаем однозначное направление.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimoon
сообщение Jul 21 2009, 08:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 21-03-05
Пользователь №: 3 571



А и Б - последовательность импульсов, Б сдвинут на 180 градусов относительно А. Я на контролере делал след. образом- родсчет импульсов по каждому фронту, не важно положит. или отрицат. Направление счета- если А и В "0", приходит фронт полож. по А направление счета на увеличение, если полож. фронт по В то уменьшение счета. Пример кода на С для MC68HC908GP32:
CODE
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"
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2009, 09:19
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

Абсолютно правильно.
D-триггером.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
XILINX
сообщение Jul 21 2009, 12:07
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 12-01-09
Из: ЛИТВА
Пользователь №: 43 233



Цитата(DpInRock @ Jul 21 2009, 12:19) *
Абсолютно правильно.
D-триггером.


Попробовал реализовать на VHDL в железе, все ОК.!!! Но очень много дребезга от этого механического устр-ва, а микросхема очень быстродействующая FPGA (250 MHz), по входу фильтрануть не получается, да и триггер Шмидта поставить не удастся, т.к. работаю на готовом продукте.
Всем спасибо!
Go to the top of the page
 
+Quote Post
izerg
сообщение Jul 21 2009, 12:24
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 531
Регистрация: 1-02-05
Из: Украина, Киев
Пользователь №: 2 342



Как говорять, самостоятельно писали наверное только древне греки - не укого было списать smile.gif
Нам же остается только пользоваться поиском и списывать smile.gif
http://www.fpga4fun.com/QuadratureDecoder.html
Там есть фильтр от дребезга.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2009, 13:50
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

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

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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
vik0
сообщение Jul 21 2009, 18:00
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



DpInRock, читаем внимательно:
Цитата
работаю на готовом продукте.

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

XILINX, иногда еще полезно заглядывать на сайт прародителя вашего ника wink.gif:
http://www.xilinx.com/products/boards/s3es...r_interface.pdf
http://www.xilinx.com/products/boards/s3es...r_interface.zip
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2009, 19:22
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
XILINX
сообщение Jul 22 2009, 05:51
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 12-01-09
Из: ЛИТВА
Пользователь №: 43 233



Цитата(vik0 @ Jul 21 2009, 21:00) *
DpInRock, читаем внимательно:

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

XILINX, иногда еще полезно заглядывать на сайт прародителя вашего ника wink.gif:
http://www.xilinx.com/products/boards/s3es...r_interface.pdf
http://www.xilinx.com/products/boards/s3es...r_interface.zip

Ну ни фига себе! И плата почти моя (у меня для 3AN) и rotary encoder такой же! И для теста результат выводил на те же светодиоды!
Огромное спасибо! Бегу читать!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 22 2009, 07:15
Сообщение #13


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

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

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jul 27 2009, 10:22
Сообщение #14


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



мой фильтр



CODE
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;
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
muravei
сообщение Aug 1 2009, 06:31
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(DpInRock @ Jul 21 2009, 17:50) *
Самый простой путь - RС цепочка.

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

Начал все с алгоритма мистера Чана (первая функция), но чего-то она тоже дребезжит. sad.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 06:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016