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

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

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

 

Исходные условия такие:

Входной сигнал - последовательность импульсов с квадратурной схемы энкодера, частота 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

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


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

Приветствую!

 

...

Коэффициент деления K лежит в диапазоне от 1 до 1000. К сожалению, без дроби не получается, поэтому K = N/M, где N=[1,1000], M=[1,100]. K всегда >=1, может оперативно меняться юзером, при этои все счетчики конечно сбрасываются.

 

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

...

Классика -

Выделаете фронт импульса энкодера,

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

При изменении разряда (N+1) формируете импульс на шаг двигателя.

 

Успехов! Rob.

 

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


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

Выделаете фронт импульса энкодера,

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

При изменении разряда (N+1) формируете импульс на шаг двигателя.

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

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

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


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

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

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

 

 

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

Обнулять счетчик при смене N и M не нужно.

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


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

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

Обнулять счетчик при смене N и M не нужно.

 

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

Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).

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

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


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

Приветствую!

 

...

Правда я пока еще не разобрался, можно ли M сделать переменной, т.е. задавать налету (а не при инстанциировании модуля).

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

 

Удачи! Rob.

 

 

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


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

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

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


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

Приветствую!

 

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

Нее - в "классической" схеме все по канонам -

...

Выделяете фронт импульса энкодера,

...

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

 

Удачи! Rob.

 

 

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


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

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

 

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

 

QuadratureDecoder2.gif

 

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

 

post-100356-1511810293_thumb.jpg

 

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

 

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


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

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

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

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

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

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

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

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

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

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