|
|
|
Счетчик-делитель с дробным коэффициентом |
|
|
|
Nov 25 2017, 22:13
|
Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356
|
Добрый день! Первый пост на форуме и сразу просьба: нужна помощь в том, что бы разобраться, как реализовать делитель.
Исходные условия такие: Входной сигнал - последовательность импульсов с квадратурной схемы энкодера, частота 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 - Nov 25 2017, 22:16
|
|
|
|
|
Nov 25 2017, 22:41
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(vladimir52 @ Nov 26 2017, 01:13) ... Коэффициент деления K лежит в диапазоне от 1 до 1000. К сожалению, без дроби не получается, поэтому K = N/M, где N=[1,1000], M=[1,100]. K всегда >=1, может оперативно меняться юзером, при этои все счетчики конечно сбрасываются.
Ни один входной импульс "потерять" нелья, т.к. это не генератор частоты, а счетчик импульсов для управления движением (конвертация импульсов энкодера в шаги двигателя). Поэтому схема на PLL, как мне кажется, не стработает - не будет "схватывать" на ... Классика - Выделаете фронт импульса энкодера, По этому импульсу суммируете в регистре разрядностью N+1 константу которая вычисляется как (2^N)/K При изменении разряда (N+1) формируете импульс на шаг двигателя. Успехов! Rob.
|
|
|
|
|
Nov 26 2017, 09:06
|
Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356
|
Цитата(RobFPGA @ Nov 25 2017, 23:41) Выделаете фронт импульса энкодера, По этому импульсу суммируете в регистре разрядностью N+1 константу которая вычисляется как (2^N)/K При изменении разряда (N+1) формируете импульс на шаг двигателя. Спасибо! Из прошлогодне темы нашел, что "Старший бит регистра будет выходом деленной частоты F2=F1*K/2^N." Как получить коэффициент деления 1/1000? И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение.
|
|
|
|
|
Nov 27 2017, 12:29
|
Частый гость
Группа: Свой
Сообщений: 101
Регистрация: 9-01-06
Пользователь №: 12 967
|
Цитата(vladimir52 @ Nov 26 2017, 12:06) Спасибо! Из прошлогодне темы нашел, что "Старший бит регистра будет выходом деленной частоты F2=F1*K/2^N." Как получить коэффициент деления 1/1000? И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение. Кадый такт к счетчику прибавляете M и сравниваете резльтат с N. Если значение в счетчике больше или равно N, то формируете импульс на шаг и разность счетчика и N пишете в счетчик. Обнулять счетчик при смене N и M не нужно.
|
|
|
|
|
Nov 27 2017, 12:44
|
Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356
|
Цитата(Abo @ Nov 27 2017, 13:29) Кадый такт к счетчику прибавляете M и сравниваете резльтат с N. Если значение в счетчике больше или равно N, то формируете импульс на шаг и разность счетчика и N пишете в счетчик. Обнулять счетчик при смене N и M не нужно. Ясно, спасибо! Нашел еще одну тему, где вроде вывели универсальный делитель. Принцип тот же- "фазовый накопитель". Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).
Сообщение отредактировал vladimir52 - Nov 27 2017, 12:46
|
|
|
|
|
Nov 27 2017, 13:05
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(vladimir52 @ Nov 27 2017, 15:44) ... Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля). Можно - хоть на каждый входной импульс новый M. Удачи! Rob.
|
|
|
|
|
Nov 27 2017, 16:24
|
Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356
|
А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой?
|
|
|
|
|
Nov 27 2017, 18:53
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(vladimir52 @ Nov 27 2017, 19:24) А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой? Нее - в "классической" схеме все по канонам - Цитата(RobFPGA @ Nov 26 2017, 01:41) ... Выделяете фронт импульса энкодера, ... При этом clok на который будет привязан это импульс может быть любым - естественно как минимум в 4 ( больше лучше) раза выше чем макс частота на входе энкодера. Так что сначала энкодер синхронизируйте на Ваши 20 MHz (заодно и подфильтровать можно) а потом по классике ... Удачи! Rob.
|
|
|
|
|
Nov 27 2017, 19:21
|
Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356
|
Цитата(RobFPGA @ Nov 27 2017, 19:53) При этом clok на который будет привязан это импульс может быть любым - естественно как минимум в 4 ( больше лучше) раза выше чем макс частота на входе энкодера. Так что сначала энкодер синхронизируйте на Ваши 20 MHz (заодно и подфильтровать можно) а потом по классике ... Спасибо. Кстати, раз уж зашла речь про энкодер, вернее выделение сиrнала из квадратуры энкодера. Есть простая и заезженная схема, например: отсюда: Которая, как ни странно в ПЛИС работает неважно, на stackoverflow видел много вопросов, почему энкодер "убегает". Хотя в дискретном варианте, на логике, вполне нормально работает. Поэтому рекомендуют использовать граф состояний, или state-machine (конечно с предварительной фильтрацией). Примерно вот так:
А есть какой-то устоявшийся и проверенный вариант?
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|