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

Счетчик-делитель с дробным коэффициентом

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

Исходные условия такие:
Входной сигнал - последовательность импульсов с квадратурной схемы энкодера, частота 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)
Спасибо.
Изменено пользователем vladimir52

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


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

Цитата(vladimir52 @ Nov 26 2017, 01:13) <{POST_SNAPBACK}>
...
Коэффициент деления K лежит в диапазоне от 1 до 1000. К сожалению, без дроби не получается, поэтому K = N/M, где N=[1,1000], M=[1,100]. K всегда >=1, может оперативно меняться юзером, при этои все счетчики конечно сбрасываются.

Ни один входной импульс "потерять" нелья, т.к. это не генератор частоты, а счетчик импульсов для управления движением (конвертация импульсов энкодера в шаги двигателя). Поэтому схема на PLL, как мне кажется, не стработает - не будет "схватывать" на
...

Классика -
Выделаете фронт импульса энкодера,
По этому импульсу суммируете в регистре разрядностью N+1 константу которая вычисляется как (2^N)/K
При изменении разряда (N+1) формируете импульс на шаг двигателя.

Успехов! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(RobFPGA @ Nov 25 2017, 23:41) <{POST_SNAPBACK}>
Выделаете фронт импульса энкодера,
По этому импульсу суммируете в регистре разрядностью N+1 константу которая вычисляется как (2^N)/K
При изменении разряда (N+1) формируете импульс на шаг двигателя.

Спасибо! Из прошлогодне темы нашел, что "Старший бит регистра будет выходом деленной частоты F2=F1*K/2^N." Как получить коэффициент деления 1/1000?
И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(vladimir52 @ Nov 26 2017, 12:06) <{POST_SNAPBACK}>
Спасибо! Из прошлогодне темы нашел, что "Старший бит регистра будет выходом деленной частоты F2=F1*K/2^N." Как получить коэффициент деления 1/1000?
И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение.



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

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Abo @ Nov 27 2017, 13:29) <{POST_SNAPBACK}>
Кадый такт к счетчику прибавляете M и сравниваете резльтат с N. Если значение в счетчике больше или равно N, то формируете импульс на шаг и разность счетчика и N пишете в счетчик.
Обнулять счетчик при смене N и M не нужно.


Ясно, спасибо! Нашел еще одну тему, где вроде вывели универсальный делитель. Принцип тот же- "фазовый накопитель".
Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).
Изменено пользователем vladimir52

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


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

Цитата(vladimir52 @ Nov 27 2017, 15:44) <{POST_SNAPBACK}>
...
Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).

Можно - хоть на каждый входной импульс новый M.

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой?

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


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

Цитата(vladimir52 @ Nov 27 2017, 19:24) <{POST_SNAPBACK}>
А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой?

Нее - в "классической" схеме все по канонам -
Цитата(RobFPGA @ Nov 26 2017, 01:41) <{POST_SNAPBACK}>
...
Выделяете фронт импульса энкодера,
...

При этом clok на который будет привязан это импульс может быть любым - естественно как минимум в 4 ( больше лучше) раза выше чем макс частота на входе энкодера. Так что сначала энкодер синхронизируйте на Ваши 20 MHz (заодно и подфильтровать можно) а потом по классике ...

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(RobFPGA @ Nov 27 2017, 19:53) <{POST_SNAPBACK}>
При этом clok на который будет привязан это импульс может быть любым - естественно как минимум в 4 ( больше лучше) раза выше чем макс частота на входе энкодера. Так что сначала энкодер синхронизируйте на Ваши 20 MHz (заодно и подфильтровать можно) а потом по классике ...


Спасибо. Кстати, раз уж зашла речь про энкодер, вернее выделение сиrнала из квадратуры энкодера. Есть простая и заезженная схема, например:отсюда:



Которая, как ни странно в ПЛИС работает неважно, на stackoverflow видел много вопросов, почему энкодер "убегает". Хотя в дискретном варианте, на логике, вполне нормально работает. Поэтому рекомендуют использовать граф состояний, или state-machine (конечно с предварительной фильтрацией). Примерно вот так:

[attachment=109951:state.jpg]

А есть какой-то устоявшийся и проверенный вариант?

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация