|
ENCODER, Помогите начинающему! |
|
|
|
Jul 21 2009, 06:52
|
Участник

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

|
Всем добрый!
Есть такая штука - у нее 2 выхода A и B. В начальный момент оба в состоянии "0". Задача : если первым импуьс появится на выходе A ,то счетчик должен считать эти импульсы UP, а если первым импуьс появится на выходе B ,то счетчик должен считать эти импульсы DOWN.
Как это можно реализовать на VHDL ?
|
|
|
|
|
Jul 21 2009, 07:01
|
Местный
  
Группа: Свой
Сообщений: 293
Регистрация: 6-08-06
Из: Tallinn, Estonia
Пользователь №: 19 351

|
Цитата(XILINX @ Jul 21 2009, 09:52)  Есть такая штука - у нее 2 выхода A и B. В начальный момент оба в состоянии "0". Вы уверены? В зависимости от положения оси значения А и В могут принимать любые значения
|
|
|
|
|
Jul 21 2009, 07:10
|
Участник

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

|
Цитата(VladKot @ Jul 21 2009, 10:01)  Вы уверены? В зависимости от положения оси значения А и В могут принимать любые значения В моем случае это так. Механически реализовано, что в момент прекращения вращения ось фиксируется в таком положении. А на будущее очень интересен вариант, соответствующий вашему вопросу! Как определить в какую сторону вращается?
|
|
|
|
|
Jul 21 2009, 07:13
|

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

|
Цитата(VladKot @ Jul 21 2009, 11:01)  Вы уверены? В зависимости от положения оси значения А и В могут принимать любые значения Это вы наверно путаете с квадратурным энкодером. А в данном случае - типа как в старинных мышах. В ВХДЛ не силён, но с т.з. схемотехники - решение очевидное. XOR-им оба сигнала, получаем клок. Этим клоком защелкиваем один из сигналов в D-триггере. На выходе получаем направление. 0 - одно направление, 1 - противоположное. Его подаём на вход направления реверсивного счётчика. А по заднему фронту нашего клока можно считать. Нет, отставить... Тут на фронтах будут фокусы... По фронту 1-го сигнала защёлкиваем 2-й. Получаем однозначное направление.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 21 2009, 08:42
|
Участник

Группа: Участник
Сообщений: 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"
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Jul 21 2009, 12:07
|
Участник

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

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

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

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