реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Счетчик-делитель с дробным коэффициентом
vladimir52
сообщение Nov 25 2017, 22:13
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 25 2017, 22:41
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 934
Регистрация: 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.
Go to the top of the page
 
+Quote Post
vladimir52
сообщение Nov 26 2017, 09:06
Сообщение #3





Группа: Участник
Сообщений: 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?
И еще вопрос. Делитель с фиксированным дробным коэффициентом деления получить можно, а для всех возможноых вариантов деления генерить каждому по делителю? Хочется найти параметризованное решение.
Go to the top of the page
 
+Quote Post
Abo
сообщение Nov 27 2017, 12:29
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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 не нужно.
Go to the top of the page
 
+Quote Post
vladimir52
сообщение Nov 27 2017, 12:44
Сообщение #5





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 27 2017, 13:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 934
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

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

Удачи! Rob.

Go to the top of the page
 
+Quote Post
vladimir52
сообщение Nov 27 2017, 16:24
Сообщение #7





Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356



А еще тупой вопрос. В этой "классической" схеме счетчик тактируется импульсами входного сигнала. Т.е. по отношению ко всей схеме, где есть внешняя тактовая частота (20 МГц) он как-бы асинхронный. Имеет смысл так и отавить, и только поставить на выходе триггер-защелку для синхронизации с общей тактовой частотой?
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 27 2017, 18:53
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 934
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

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

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

Удачи! Rob.

Go to the top of the page
 
+Quote Post
vladimir52
сообщение Nov 27 2017, 19:21
Сообщение #9





Группа: Участник
Сообщений: 5
Регистрация: 25-11-17
Пользователь №: 100 356



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


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



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

Прикрепленное изображение


А есть какой-то устоявшийся и проверенный вариант?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th December 2017 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0132 секунд с 7
ELECTRONIX ©2004-2016