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

Вроде дошло. :)

Попробуйте скачать какую-нибудь терминальную программку(например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать?

Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть.

 

Более подходящая программа. Приятное доп. к вашему осциллографу :)

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


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

'BigCoster'

Я сторонник отладки частями, и чтобы определиться где "хандрит", в железе или в софте, было бы неплохо написать совсем простенькую программку подсчета импульсов, может даже без прерываний.

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


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

Вроде дошло. :)

Попробуйте скачать какую-нибудь терминальную программку(например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать?

Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть.

 

Более подходящая программа. Приятное доп. к вашему осциллографу :)

 

Пасибки пребольшое :a14:

:smile3046: разберёмся...

 

'BigCoster'

Я сторонник отладки частями, и чтобы определиться где "хандрит", в железе или в софте, было бы неплохо написать совсем простенькую программку подсчета импульсов, может даже без прерываний.

Завтра приступим...

Изменено пользователем BigCoster

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


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

:smile3046: разберёмся...

Завтра приступим...

Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли.

Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели.

Короче, успехов! :)

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


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

Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли.

Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели.

Короче, успехов! :)

 

Полностью поддерживаю!

 

Ув. BigCoster, уж если Вы решились на "переделку" своего устройства, то непременно воспользуйтесь приведенными в теме рекомендациями.

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


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

Спасибо всем за ответы, многие из них очень информативные, в часности по поводу реализации

энкодеров

 

При частоте резонатора 12МГц один цикл равен 0,1мкс.

Уменя 6МГц значит 0,2мкс.

Померял LPT анализатором период дребезга около 0,05мкс.

Имеем апаратный фильтр, ошибка в программе.

Если ошибся поправляйте!!!

 

И ещё один такой вот вопрос, выходящий из всего выше сказанного :

Как (где) используется тайиер/счётчик в режиме счётчика ???

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


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

Имею по работе проекты, в которых используются датчики импульсов типа ПДФ-3. Даже оставив датчик

без приёмной цифровой схемы, он самопроизвольно генерирует импульсы, когда берёшся за вал рукой,

при этом я нахожусь на полу из металлических плит. При коммутации какой-либо нагрузки происходит аналогичное явление. Побороть данного вида помехи позволило заземление общей точки питания самого датчика. Поэтому, считаю что Вам необходимо начать поиск в начале с самого энкодера, потом схемы, на которую он работает, а затем уже саму программу.

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


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

Я для себя решил, что без осциллографа схему менять не буду (общая точка датчика на земле, схемы включения я приводил, сказали вроде б нормально).

Не могу понять, как правильно организовать задание расстояния, которое должен проехать моторчик.

у меня просто: пока держишь кнопку счётчик считает, а программа проверяет не отпущена ли кнопка,

бросаем кнопку, нажимаем другую и сохраняем.

после всего этого едем и видим, что не совсем так же проехали, как при настройке, а больше и тем больше проезжаем,

чем больше раз нажимали книпку задания расстояния тем .. :cranky: :cranky: :cranky:

А сейчас вообще не пишет данные в EEPROM, вернее возвращает постоянно одинаковое значение.

И концевой датчик тоже сошел с ума .. :cranky:

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


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

1. Двухканальный энкодер (о чем упоминалось выше), - там максимальная абсолютная неточность в пределах импульса (и сразу защита от всяких любых дребезгов если правильно отрабатывать).

2. В прерывании переполнения таймера-счетчика организовать программный счетчик и

считать каждый импульс (событие 255 прописанных +1 пришедший).

3. Если пункт 1 не устраивает то пункт 2 + антидребезг. Как организовать антидребезг - это насколько хватит фантазии. Триггер Шмидта помогает - стандартное решение для одноканальных энкодеров. Расчитанно именно на ситуацию когда метка в слабо-определенном состоянии.

 

К сожалению трудно четко представить чего там у вас происходит.

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


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

Просмотрел ветку. Мое мнение. Подавить дребезг при подаче импульсов прямо на T1 програмно проблематично, если вообще возможно. Нужно искать причину возниновения.

Ничего не сказано про осветитель. Возможность посторонней засветки.

Для уменьшения влияния дрожания крыльчатки увеличить размер светового пятна у увеличить гистерезис датчика. Осцилограммы мне совсем не нравятся. Лучше всего если со светодиода (перед компаратором) при вращении крыльчатки будет идти треугольник.

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


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

Тема конечно устарела, но сейчас столкнулся с тем же. Посадил выход от энкодера на внешнее прерывание на меге128 (INT2). Сразу побежал дребезг. Сделал напрямую на порт:

m_value = PIND & (1 << PD2);
        if (m_value == 0){
            m_trigger = 1;
        } else {
            if (m_trigger == 1){
                ++m_counter;
            }
            m_trigger = 0;
        }

 

всё хорошо стало. Потому что внешнее прерывание ещё использовать уметь надо.

 

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


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

.

 

Да не в умении даже дело. Прерывание почти каждый дребезг поймает, но и ваша система иногда будет напарываться. Простое решение это запретить прерывание как оно случилось и очистить его флаг на случай если вызвалось снова пока вызывался обработчик, запустить таймер на половину короткого интервала. По прерыванию таймера считать достоверное значение и снова разрешить прерывание от сигнала.

 

Я делал обработчик в более удобной среде там было два смещенных датчика с перекрытием как синус и косинус. Правда надо было етхе регистрировать направление. Итого было четыре области, которые я мог различить. 00, 01, 11 и 10 если бит 0 еыто сигнал одного датчика, а бит 1 второго. Далее я построил машину состояний (автомат) с четырьмя состояниями и разрешил в ней переходы между состояниями, соответствующиими соседним значениям датчиков. То есть если я в состоянии 01, то переход в 11 или 00 возможен, а в 10 нет. Расстояние хемминга 1 инициирует переход. И моя модель крутилась вслед за датчиком.

Изменено пользователем IgorKossak
избыточное цитирование

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


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

Какая скорость прихода импульсов с валкодера? Разрешение? Крутит человек или это колесо на производстве чего-то?

Дребезг давить аппаратно (с опичтеских не требуется), если быстродействие озволяет, оба сигнала завести на прерывания. Обработчик общий на двоих:

 

 

static uint_fast8_t old_val;

void spool_encinterrupt(void)
{
    const uint_fast8_t new_val = hardware_get_encoder_bits();    /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

    // dimensions are:
    // old_bits new_bits
    static const int_fast8_t graydecoder [4][4] =
    {
        {
            +0,        /* 00 -> 00 stopped                */
            -1,        /* 00 -> 01 rotate left            */
            +1,        /* 00 -> 10 rotate right        */
            +0,        /* 00 -> 11 invalid combination */        
        },
        {
            +1,        /* 01 -> 00 rotate right        */
            +0,        /* 01 -> 01 stopped                */
            +0,        /* 01 -> 10 invalid combination */
            -1,        /* 01 -> 11 rotate left            */
        },
        {
            -1,        /* 10 -> 00 rotate left            */
            +0,        /* 10 -> 01 invalid combination */
            +0,        /* 10 -> 10 stopped                */
            +1,        /* 10 -> 11 rotate right        */
        },
        {
            +0,        /* 11 -> 00 invalid combination */
            +1,        /* 11 -> 01 rotate right        */
            -1,        /* 11 -> 10 rotate left            */
            +0,        /* 11 -> 11 stopped                */
        },
    };


#if ENCODER_REVERSE
    position1 -= graydecoder [old_val][new_val];
#else
    position1 += graydecoder [old_val][new_val];
#endif
    old_val = new_val;
}

 

В инициализации не забыть

    old_val = hardware_get_encoder_bits();    /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

чтобы ложные шаги при ресете не проходили на стоящем валкодере.

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


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

.

 

Красиво.

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

Изменено пользователем IgorKossak
бездумное цитирование

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


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

... Далее я построил машину состояний (автомат) с четырьмя состояниями и разрешил в ней переходы между состояниями, соответствующиими соседним значениям датчиков. То есть если я в состоянии 01, то переход в 11 или 00 возможен, а в 10 нет. Расстояние хемминга 1 инициирует переход. И моя модель крутилась вслед за датчиком.

Классная идея. :disco:

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


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

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

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

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

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

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

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

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

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

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