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

vladimir52

Участник
  • Публикаций

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Цитата(RobFPGA @ Nov 27 2017, 19:53) При этом clok на который будет привязан это импульс может быть любым - естественно как минимум в 4 ( больше лучше) раза выше чем макс частота на входе энкодера. Так что сначала энкодер синхронизируйте на Ваши 20 MHz (заодно и подфильтровать можно) а потом по классике ... Спасибо. Кстати, раз уж зашла речь про энкодер, вернее выделение сиrнала из квадратуры энкодера. Есть простая и заезженная схема, например:отсюда: Которая, как ни странно в ПЛИС работает неважно, на stackoverflow видел много вопросов, почему энкодер "убегает". Хотя в дискретном варианте, на логике, вполне нормально работает. Поэтому рекомендуют использовать граф состояний, или state-machine (конечно с предварительной фильтрацией). Примерно вот так: [attachment=109951:state.jpg] А есть какой-то устоявшийся и проверенный вариант?
  2. А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой?
  3. Цитата(Abo @ Nov 27 2017, 13:29) Кадый такт к счетчику прибавляете M и сравниваете резльтат с N. Если значение в счетчике больше или равно N, то формируете импульс на шаг и разность счетчика и N пишете в счетчик. Обнулять счетчик при смене N и M не нужно. Ясно, спасибо! Нашел еще одну тему, где вроде вывели универсальный делитель. Принцип тот же- "фазовый накопитель". Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).
  4. Цитата(RobFPGA @ Nov 25 2017, 23:41) Выделаете фронт импульса энкодера, По этому импульсу суммируете в регистре разрядностью N+1 константу которая вычисляется как (2^N)/K При изменении разряда (N+1) формируете импульс на шаг двигателя. Спасибо! Из прошлогодне темы нашел, что "Старший бит регистра будет выходом деленной частоты F2=F1*K/2^N." Как получить коэффициент деления 1/1000? И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение.
  5. Добрый день! Первый пост на форуме и сразу просьба: нужна помощь в том, что бы разобраться, как реализовать делитель. Исходные условия такие: Входной сигнал - последовательность импульсов с квадратурной схемы энкодера, частота Fin которых меняется от 0 до 1 МГц. Причем меняется она обычно довольно плавно, но с 0 может стартануть резко (крутнули энкодер), и так же резко остановиться. Коэффициент деления K лежит в диапазоне от 1 до 1000. К сожалению, без дроби не получается, поэтому K = N/M, где N=[1,1000], M=[1,100]. K всегда >=1, может оперативно меняться юзером, при этои все счетчики конечно сбрасываются. Ни один входной импульс "потерять" нелья, т.к. это не генератор частоты, а счетчик импульсов для управления движением (конвертация импульсов энкодера в шаги двигателя). Поэтому схема на PLL, как мне кажется, не стработает - не будет "схватывать" на переходных стадиях поступления импульсов, да и частота маловата. Требования к фазе импусльсов не жесткие - "дрожание" вполне допускается, лишь бы не более половины периода выходной частоты Fout. (Разработку ПЛИС делал когда-то на AHDL, поэтому проще понять структуру делителя на уровне базовой логики. Но писать буду на Verilog'e для Altera Cyclone IV) Спасибо.