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

 
 
> генератор переменной частоты на ПЛИС, xilinx spartan3
Anton_NN
сообщение Jul 28 2009, 07:59
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Передо мной поставлена задача, на базе плис SPARTAN3 организовать
генератор переменной частоты, с шагом 1Гц в частотном диапазоне от 1Гц до
15кГц, скважность 2.
Как это сделать?
Пытался сделать ничего не вышло.
Для примера собрал в софте webpackise 8.2i схему на счетчике с паралельной загрузкой и аккумуляторе.
С выхода счетчика частота меняется, но не линейно, а изменяется в 2 раза (примерно так в 1-2-4-8-16-32-64 и.д. что мне не подходит), линейно меняется только период.
Проект во вложенном файле.
Заранее благодарю!
Прикрепленные файлы
Прикрепленный файл  ACC_SCHET.rar ( 360.86 килобайт ) Кол-во скачиваний: 44
 
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
Boris_TS
сообщение Jul 28 2009, 08:12
Сообщение #2


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 28 2009, 11:59) *
Передо мной поставлена задача, на базе плис SPARTAN3 организовать генератор переменной частоты, с шагом 1Гц в частотном диапазоне от 1Гц до 15кГц, скважность 2.
Как это сделать?

Для любой скважности задача решается одинаково:
1. Строится управляемый делитель частоты, выходом которого является выходной перенос (COut) загружаемого счетчика.
2. COut подается на схему, формирующую импульсы заданной (или даже измиеняемой) скважности.
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 28 2009, 08:24
Сообщение #3





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 28 2009, 12:12) *
Для любой скважности задача решается одинаково:
1. Строится управляемый делитель частоты, выходом которого является выходной перенос (COut) загружаемого счетчика.
2. COut подается на схему, формирующую импульсы заданной (или даже измиеняемой) скважности.


Если посмотреть мой проект, то там есть счетчик с паралельной загрузкой! Проблема в том, что на выходе этого счетчика линейно меняется период (Т), а мне нужна линейно изменяющаяся частота (f). f=1/T!
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 28 2009, 08:46
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



занятно, раз в 2/3 месяца возникает на этом форуме вопрос "как сделать DDS". Пора уже выносить в FAQ smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 28 2009, 09:00
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Anton_NN @ Jul 28 2009, 11:24) *
Если посмотреть мой проект, то там есть счетчик с паралельной загрузкой! Проблема в том, что на выходе этого счетчика линейно меняется период (Т), а мне нужна линейно изменяющаяся частота (f). f=1/T!

Совет: начните изучать языки описания (VHDL/Verilog)!


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 28 2009, 09:40
Сообщение #6





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(des00 @ Jul 28 2009, 12:46) *
занятно, раз в 2/3 месяца возникает на этом форуме вопрос "как сделать DDS". Пора уже выносить в FAQ smile.gif


Если это уже решенная задача, может подскажете что нибудь дельное.

Цитата(Maverick @ Jul 28 2009, 13:00) *
Совет: начните изучать языки описания (VHDL/Verilog)!


А в схематике разьве нельзя эту задачу решить. В VHDL ничего не понимаю - литературы нет.
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Jul 28 2009, 09:57
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(Anton_NN @ Jul 28 2009, 13:40) *
Если это уже решенная задача, может подскажете что нибудь дельное...


Вам уже подсказали:
Цитата(des00 @ Jul 28 2009, 12:46) *
занятно, раз в 2/3 месяца возникает на этом форуме вопрос "как сделать DDS". Пора уже выносить в FAQ smile.gif


Смотрите в сторону DDS (Direct Digital Synthesis). В ISE Core Generator есть готовое ядро DDS. Оно выдаёт синус произвольной частоты с шагом до 0.001Гц. Для преобразования в прямоугольник нужно просто после него компаратор цифровой поставить.

В VHDL проще работать (особенно в ISE - там очень кривой Schematic-редактор). Ну и вообще для сложных проектов схемотехнический ввод годится разве что для top_levela.

Кроме того модули на VHDL легко переносить из одного САПРа в другой и использовать для различных ПЛИС и моделировать в различных средах. А при схемотехническомм вводе возникают большие проблемы с переносимостью даже в одном САПРе разных версий: например при смене версии ISE ваш проект может уже не открыться.
Go to the top of the page
 
+Quote Post
petrov
сообщение Jul 28 2009, 10:10
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(Anton_NN @ Jul 28 2009, 13:40) *
Если это уже решенная задача, может подскажете что нибудь дельное.

А в схематике разьве нельзя эту задачу решить. В VHDL ничего не понимаю - литературы нет.


Можно и в схематике, вы ведь в квартусе работаете? Берёте библиотечный компонент накпливающий сумматор разрядности N, выход обратно на один из его входов подаёте. На другой вход константу K котрая и будет задавать частоту. В качестве выходного сигнала используйте старший разряд с выхода накапливающего сумматора. На регистр накпливающего сумматора подаёте вашу тактовую частоту fclk. Выходная частота f=fclk*K/2^N Чем больше N тем более мелкий шаг частоты генератора можно получить df=fclk/2^N, и соответственно точнее получить нужную частоту. K= round(f*2^N/fclk) Ессно в общем случае будет джиттер определяемый fclk, без джиттера полностью в цифре сделать не получится.
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 28 2009, 10:17
Сообщение #9


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 28 2009, 12:24) *
Если посмотреть мой проект, то там есть счетчик с параллельной загрузкой! Проблема в том, что на выходе этого счетчика линейно меняется период (Т), а мне нужна линейно изменяющаяся частота (f). f=1/T!

Ну так какая проблема (?!!) - создайте таблицу соответствия: такая-то частота = такому-то коэффициенту, и запишите её в Block RAM.
В Вашу систему подавайте задание в виде кода желаемой частоты, из Block RAM по адресу = коду желаемой частоты считывайте коэффициент деления для загружаемого счетчика.

А на досуге посчитайте, какая нужна базовая делимая частота для получения заказанной Вами сетки частот... и сравните её с максимальной частотой работы ПЛИС.

Цитата(petrov @ Jul 28 2009, 14:10) *
Можно и в схематике, вы ведь в квартусе работаете?

Altera Quartus вроде же не поддерживает Xilinx Spartan-3 (см. subj)
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 28 2009, 10:23
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Anton_NN @ Jul 28 2009, 04:40) *
Если это уже решенная задача, может подскажете что нибудь дельное.


поиском по форуму пройдитесь, ключевое слово я вам сказал. Там выкладывались и сорцы и материалы по этой теме.


--------------------
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 28 2009, 10:34
Сообщение #11





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 28 2009, 14:17) *
Ну так какая проблема (?!!) - создайте таблицу соответствия: такая-то частота = такому-то коэффициенту, и запишите её в Block RAM.
В Вашу систему подавайте задание в виде кода желаемой частоты, из Block RAM по адресу = коду желаемой частоты считывайте коэффициент деления для загружаемого счетчика.

А на досуге посчитайте, какая нужна базовая делимая частота для получения заказанной Вами сетки частот... и сравните её с максимальной частотой работы ПЛИС.


Altera Quartus вроде же не поддерживает Xilinx Spartan-3 (см. subj)


Работаю в webpack ise 8.2i.
С Block RAM пробовал, интересно конечно, но кто загружать будет эту сетку - там же значений целая куча!!! Проект получиться негибким - необходимо чтобы пользователь вводил всего 3 величины -1) начальная частота работы в Гц, 2) конечная частота в Гц, 3) шаг частоты в Гц...... и пошло-поехало biggrin.gif
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 28 2009, 12:00
Сообщение #12





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(petrov @ Jul 28 2009, 14:10) *
Можно и в схематике, вы ведь в квартусе работаете? Берёте библиотечный компонент накпливающий сумматор разрядности N, выход обратно на один из его входов подаёте. На другой вход константу K котрая и будет задавать частоту. В качестве выходного сигнала используйте старший разряд с выхода накапливающего сумматора. На регистр накпливающего сумматора подаёте вашу тактовую частоту fclk. Выходная частота f=fclk*K/2^N Чем больше N тем более мелкий шаг частоты генератора можно получить df=fclk/2^N, и соответственно точнее получить нужную частоту. K= round(f*2^N/fclk) Ессно в общем случае будет джиттер определяемый fclk, без джиттера полностью в цифре сделать не получится.


Работаю в webpack ise 8.2i.
"накпливающий сумматор" - это аккумулятор?
"На регистр накпливающего сумматора подаёте вашу тактовую частоту fclk" - это клоковый вход аккумулятора?
"Выходная частота f=fclk*K/2^N" - поясните пожалуйста формулу подробнее, что-то не очень понятно. Почему частота входная делится на K/2^N?
Сразу извиняюсь за, может быть, некорректные вопросы. Я только учусь...
Go to the top of the page
 
+Quote Post
petrov
сообщение Jul 28 2009, 12:41
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(Anton_NN @ Jul 28 2009, 16:00) *
Работаю в webpack ise 8.2i.
"накпливающий сумматор" - это аккумулятор?
"На регистр накпливающего сумматора подаёте вашу тактовую частоту fclk" - это клоковый вход аккумулятора?
"Выходная частота f=fclk*K/2^N" - поясните пожалуйста формулу подробнее, что-то не очень понятно. Почему частота входная делится на K/2^N?
Сразу извиняюсь за, может быть, некорректные вопросы. Я только учусь...


Да аккумулятор, у альтеры есть такой библиотечный компонент, возможно и у ксилинкса есть, да и вручную элементарно нарисовать сумматор с регистром на выходе. fclk - да это клок регистра аккумулятора, ваш глобальный клок на котором всё вычисляется. f=fclk*K/2^N - эта формула показывает зависимость выходной частоты от константы на одном из входов аккумулятора. Аккумулятор генерирует линейно изменяющуюся фазу по модулю 2^N, считайте что 2^N - это 2*pi. Например K=1, на выходе аккумулятора получаем пилообразный сигнал с периодом 2^N/fclk, K=2 период 2^N/(2*fclk),... 2^N/(K*fclk). Так как нам пила не нужна берём старший разряд с регистра и получаем меандр, т к в первой половине периода пила меньше 2^(N-1) и старший разряд равен нулю, во второй половине периода пила больше 2^(N-1) и старший разряд равен 1.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 28 2009, 13:11
Сообщение #14


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(VladimirB @ Jul 28 2009, 12:57) *
В VHDL проще работать (особенно в ISE - там очень кривой Schematic-редактор). Ну и вообще для сложных проектов схемотехнический ввод годится разве что для top_levela.

C Вами полностью согласен!!!


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 28 2009, 18:24
Сообщение #15


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 28 2009, 14:34) *
С Block RAM пробовал, интересно конечно, но кто загружать будет эту сетку - там же значений целая куча!!!

Конечно куча значений, а как Вы хотели... (можно и без кучи значений обойтись, но тогда надо городить вычислитель - с Block RAM обычно попроще выходит).
А у Block RAM, есть атрибут начальной инициализации - INIT (читай: cgd.pdf, lib.pdf, xst.pdf), позволяющий использовать этот BRAM, как BROM. Конечно, заполнять начальными значениями удобнее на VHDL/Verilog,.. но можно и ручками поработать,.. да и были еще mem файлы - надо только поглядеть в сторону IP Core Generator - он достаточно хорошо работает с схемным вводом проекта.

Цитата(Anton_NN @ Jul 28 2009, 14:34) *
Проект получиться негибким - необходимо чтобы пользователь вводил всего 3 величины:
1) начальная частота работы в Гц,
2) конечная частота в Гц,
3) шаг частоты в Гц...... и пошло-поехало

Наверное, Вы - студент... Я угадал ?
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 28 2009, 20:10
Сообщение #16





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 28 2009, 22:24) *
Конечно куча значений, а как Вы хотели... (можно и без кучи значений обойтись, но тогда надо городить вычислитель - с Block RAM обычно попроще выходит).
А у Block RAM, есть атрибут начальной инициализации - INIT (читай: cgd.pdf, lib.pdf, xst.pdf), позволяющий использовать этот BRAM, как BROM. Конечно, заполнять начальными значениями удобнее на VHDL/Verilog,.. но можно и ручками поработать,.. да и были еще mem файлы - надо только поглядеть в сторону IP Core Generator - он достаточно хорошо работает с схемным вводом проекта.


Боюсь, что с той дискретой которая мне требуется мне просто объема памяти не хватит, если я забью все RAMами


Цитата(Boris_TS @ Jul 28 2009, 22:24) *
Наверное, Вы - студент... Я угадал ?


Я не студент - работаю в фирме инж.электрик. Руководство поставило задачу реализовать генератор переменной частоты на плис, с минимальными манипуляциями, о которых я выше говорил. С RAM действительно пробовал до 100 Гц, частота меняется примерно линейно(дискретность в 1Гц все равно не получилась), но необходимо 15000 значений и куча адрессного пространства в софте, чтобы заполнить RAM.

Сообщение отредактировал Anton_NN - Jul 28 2009, 20:17
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Jul 28 2009, 20:49
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(Anton_NN @ Jul 29 2009, 00:10) *
Боюсь, что с той дискретой которая мне требуется мне просто объема памяти не хватит, если я забью все RAMами


Прочитайте про DDS!!!
Не не надо вам ни какой памяти. Вам нужен аккумулятор фазы на накапливающем сумматоре и компаратор на половину максимального значения фазы. Частота задётся кодом приращения фазы по формуле: F = Fd*приращение/2^N.
Где Fd тактовая частота, N - разрядность приращения фазы.
Подавая на вход приращения фазы выход счётика можно легко получиить ЛЧМ.

http://ra3ggi.qrz.ru/UZLY/dds.htm
http://www.ieee.li/pdf/essay/dds.pdf
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 29 2009, 03:26
Сообщение #18


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(VladimirB @ Jul 28 2009, 14:49) *
Не не надо вам ни какой памяти. Вам нужен аккумулятор фазы на накапливающем сумматоре и компаратор на половину максимального значения фазы. Частота задётся кодом приращения фазы по формуле: F = Fd*приращение/2^N.
Где Fd тактовая частота, N - разрядность приращения фазы.
Подавая на вход приращения фазы выход счётика можно легко получиить ЛЧМ.


я бы не был столь категоричен насчет памяти. задачу нужно разделить. Если вам требуется логический сигнал частоты, т.е. однобитный выход частота которого равна требуемой, тогда действительно вам не требуется память. Если же генератор выходит на ЦАП и вам нужен синус тогда действительно потребуется память, в которой нужно будет хранить 1/4 периода синуса. Но можно обойтись и без памяти если считать синус на прямую.

Для справки я делал 32-х битный DDS с центральной частотой 1МГц и 14 ти битным выходом. На это у меня ушло 13 блочков памяти. Код не дам из принципа, делайте сами.

ЗЫ. А не проще ли взять готовый маленький DDS от аналоговых девиц, будет всяко проще чем связываться с плис.

ЗЗЫ. Еще хочу напомнить что скважность DDS с цифровым выходом для большинства частот != 50%

ЗЗЗЫ. есть журнал от аналоговых девиц, на РУССКОМ языке, где хорошо расписано в частности о DDS. Главы этого журнала можно найти как в сети, так и на этом форуме. Но как я понял поиском вам пользоваться лень.


--------------------
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 29 2009, 08:05
Сообщение #19


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 29 2009, 00:10) *
Я не студент - работаю в фирме инж.электрик.

Это хорошо: т.к. Вы не студент, то имеет смысл обсуждать технические вопросы.

Цитата(Anton_NN @ Jul 28 2009, 11:59) *
Передо мной поставлена задача, на базе плис SPARTAN3 организовать генератор переменной частоты.
Цитата(Anton_NN @ Jul 28 2009, 11:59) *
Руководство поставило задачу реализовать генератор переменной частоты на плис, с минимальными манипуляциями, о которых я выше говорил

1. Генератор чего же именно Вам надо сделать ? ПЛИС устройство цифровое и, соответственно, синус ну никак не родит, поэтому под "генератором частоты" можно подразумевать 2 существенно разные вещи:
a] генератор прямоугольных импульсов.
b] генератор кодов для ЦАП, с выхода которого Вы сможете получить что-то очень близкое к синусоидальным колебаниям заданной частоты. (Пресловутый DDS).

Цитата(Anton_NN @ Jul 29 2009, 00:10) *
Боюсь, что с той дискретой которая мне требуется мне просто объема памяти не хватит, если я забью все RAMами

Да. Тут я прокривоглазился - мне показалось, что Вам необходим шаг 1кГк - т.е. получается всего 15 значений (которые хорошо ложились бы и в DistRAM и в BRAM).
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 29 2009, 10:24
Сообщение #20





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 29 2009, 12:05) *
1. Генератор чего же именно Вам надо сделать ? ПЛИС устройство цифровое и, соответственно, синус ну никак не родит, поэтому под "генератором частоты" можно подразумевать 2 существенно разные вещи:
a] генератор прямоугольных импульсов.
b] генератор кодов для ЦАП, с выхода которого Вы сможете получить что-то очень близкое к синусоидальным колебаниям заданной частоты. (Пресловутый DDS).


2. Да. Тут я прокривоглазился - мне показалось, что Вам необходим шаг 1кГк - т.е. получается всего 15 значений (которые хорошо ложились бы и в DistRAM и в BRAM).


Необходимо организовать генератор прямоугольных импульсов с переменной частотой(1Гц....15кГц, с минимальным шагом в 1Гц), которым из софта, написанного мною на СИ, пользователь будет вводить всего 3 значения:1) начальная частота 2) шаг частоты (ускорение) 3) конечная частота.все. поэтому RAM исключается. по-всякому пробовал результат один - нелинейность изменения частоты!

Сообщение отредактировал Anton_NN - Jul 29 2009, 10:31
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 29 2009, 10:38
Сообщение #21


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 29 2009, 14:24) *
Необходимо организовать генератор прямоугольных импульсов с переменной частотой(1Гц....15кГц, с минимальным шагом в 1Гц)

Без погрешностей, это реализовать невозможно. Поэтому поясните, какие именно виды ошибок генерируемых импульсов допустимы:
1. В случае, если после задания частоты импульсы генерируются одинаковыми (от периода к периоду), Какая максимальная допустима погрешность периода импульсов ?
2. Если по какой-то причине нельзя допускать долговременную ошибку частоты, то какая погрешность допустима на "дрожание" фронтов ?
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 29 2009, 11:10
Сообщение #22





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 29 2009, 14:38) *
Без погрешностей, это реализовать невозможно. Поэтому поясните, какие именно виды ошибок генерируемых импульсов допустимы:
1. В случае, если после задания частоты импульсы генерируются одинаковыми (от периода к периоду), Какая максимальная допустима погрешность периода импульсов ?
2. Если по какой-то причине нельзя допускать долговременную ошибку частоты, то какая погрешность допустима на "дрожание" фронтов ?


Я понимаю что без погрешностей не реализовать. ТЗ составлено таким образом, что виды допустимых ошибок генерируемых импульсов не указаны, работа идет на результат, на первом этапе допускается и дрожание фронтов и погрешность периода, но чем меньше они будут тем лучше.
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 29 2009, 12:02
Сообщение #23


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 29 2009, 14:24) *
Необходимо организовать генератор прямоугольных импульсов с переменной частотой(1Гц....15кГц, с минимальным шагом в 1Гц), которым из софта, написанного мною на СИ, пользователь будет вводить всего 3 значения:1) начальная частота 2) шаг частоты (ускорение) 3) конечная частота.все. поэтому RAM исключается. по-всякому пробовал результат один - нелинейность изменения частоты!

Есть версия, что этот "генератор" должен быть использован в системе создания импульсов для управления силовыми ключами некоего двигателя. Так ?
Если оно так, то есть ли предельное значение погрешности ускорения, и нормировано ли отклонение реального ускорения от заданного ?
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Jul 29 2009, 12:06
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(Anton_NN @ Jul 29 2009, 15:10) *
Я понимаю что без погрешностей не реализовать. ТЗ составлено таким образом, что виды допустимых ошибок генерируемых импульсов не указаны, работа идет на результат, на первом этапе допускается и дрожание фронтов и погрешность периода, но чем меньше они будут тем лучше.

Если у вас не получается в ПЛИС сделать DDS с компаратором, то можно воспользоватся
готовым решение от АналоговыхДевиц:

http://www.analog.com/en/rfif-components/d...ts/product.html

там есть встроенный компаратор и в даташите на Figure 2. приведена схема включения для генерации прямоугольных импульсов.

Если скорость перестройки частоты небольшая то для управления достаточно будет прикрутить какой нибудь простенький микроконтроллер с USB и не нужно ни какой ПЛИС.
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 29 2009, 14:04
Сообщение #25





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 29 2009, 16:02) *
Есть версия, что этот "генератор" должен быть использован в системе создания импульсов для управления силовыми ключами некоего двигателя. Так ?
Если оно так, то есть ли предельное значение погрешности ускорения, и нормировано ли отклонение реального ускорения от заданного ?


В принципе так. Что означает "погрешность ускорения" ? Ведь в софте задается двоичный код, а не значение скорости или ускорения в м/с. Я в самом начале вложил файл в версии сапр webpack ise8.2i, если посмотреть. В нем проект реализации генератора как на ускорение так и на замедление частоты импульсов, но есть проблема-в нем линейно меняется не частота а период! теоретически я понимаю как должно быть но вот в схематике никак не получается, может что то не так делаю? может просто поправить немного надо? не знаю....всю голову сломал....

Цитата(VladimirB @ Jul 29 2009, 16:06) *
Если у вас не получается в ПЛИС сделать DDS с компаратором, то можно воспользоватся
готовым решение от АналоговыхДевиц:

http://www.analog.com/en/rfif-components/d...ts/product.html

там есть встроенный компаратор и в даташите на Figure 2. приведена схема включения для генерации прямоугольных импульсов.

Если скорость перестройки частоты небольшая то для управления достаточно будет прикрутить какой нибудь простенький микроконтроллер с USB и не нужно ни какой ПЛИС.


генератор импульсов используется во многих платах на плис как у альтеры так и у ксалинкса без всяких внешних дивайсов, по этому должно получиться. Может это уже кто то делал и сам?
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 29 2009, 15:19
Сообщение #26


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 29 2009, 18:04) *
В принципе так. Что означает "погрешность ускорения" ? Ведь в софте задается двоичный код, а не значение скорости или ускорения в м/с.

Soft - это вторично сначала физическая задача. Т.е. если Вы можете игнорировать динамические свойства двигателя и динамические свойства нагрузки на этот двигатель (т.е. работать с объектом управления без обратных связей !), то задача существенно упрощается. (пока что я встречался только с такими система управления, в которых игнорирование динамических свойств приводов/нагрузки - преступно). Ну если Вы можете позволить себе это проигнорировать, тогда пожалуйста, вот Вам несложное решение:

1. Делаете машину состояния, которая имеет всего 2 основных состояния: поддержание постоянной скорости и ускорение.
2. В состоянии "поддержание постоянной скорости" Вы либо ничего не делаете (записываете в управляемый делитель из раза в раз один и тот же код), либо как-то по измеренному иглу поворота компенсируете неточности задания скорости (как например работают ФАПЧ: подстраивают частоту измеряя фазу).
3. Для работы с состоянии "ускорение", Вам понадобится задавать 3 величины: период изменения коэффициентов для делителя частоты, "шаг изменения скорости" и количество периодов изменения коэффициентов для делителя частоты.
4. Работа в состоянии "ускорение":
a] записать в регистр DIV_K_LOAD коэффициент, который будет некоторое время загружаться, как стартовой для управляемого делителя частоты.
b] начать отсчет периода изменения скорости.
c] пока идет периода изменения скорости, Вам необходимо подготовить новое значение коэффициента для регистра DIV_K_LOAD.
d] по прошествии заданного количества периодов изменения коэффициентов для делителя частоты (периодов ускорения), перейти в состояние поддержание постоянной скорости (возможно с записью не вычисленного, а заранее заданного коэффициента для делителя частоты - так, возможно, будет точнее).

Теперь поподробнее о вычислении коэффициента для делителя:
У Вас система ооочень медленная, как и большинство систем управления - предельная частота всего-то 15кГц... Даже если учесть, что Ваш делитель управляемый частоты должен давать частоту в 3-6 раз большую, чем выходные 3 фазные импульсы, то всё равно получается очень большой период (по меркам ПЛИС), за который Вам необходимо вычислить новый коэффициент. Поэтому можно пользоваться компактным барабанным делителем.

Ваш искомый коэффициент (назовём его DIV_K, разрядности n), можно достаточно просто найти:

DIV_K = (2^n) - Alfa / (Cur_Freq + Delta_Freq)

Delta_Freq - "щаг изменения скорости".
Cur_Freq - текушая "скорость".
Alfa - конструктивная константа Вашей системы.

Если Ваш загружаемый счетчик во время загрузки не инкрементирует входные данные, то: DIV_K = (2^n - 1) - Alfa / (Cur_Freq + Delta_Freq)

Это если Вам надо быстро и в первом приближении заставить двигатель шевелиться. А если всё делать надежно, то необходимо работать с обратными связями и использовать наработки Теории Автоматического Управления, для создания регуляторов. Можно воспользоваться и синергетической теорией управления – тогда результаты могут получиться лучше.
Go to the top of the page
 
+Quote Post
murmel1
сообщение Jul 29 2009, 17:15
Сообщение #27


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

Группа: Свой
Сообщений: 166
Регистрация: 2-11-08
Из: Ростов-на-Дону
Пользователь №: 41 331



Кхм-хм.
Извините, коли не в тему, но имею одно предложение.
Так как, для пользователя окончание вашей системы - ваша программа, то почему бы функцию пересчета частоты в коэффициент счета не переложить на нее ? Пользователь никакой разницы не заметит.
Go to the top of the page
 
+Quote Post
Anton_NN
сообщение Jul 30 2009, 05:01
Сообщение #28





Группа: Новичок
Сообщений: 12
Регистрация: 21-05-09
Пользователь №: 49 331



Цитата(Boris_TS @ Jul 29 2009, 19:19) *
1. Делаете машину состояния, которая имеет всего 2 основных состояния: поддержание постоянной скорости и ускорение.
2. В состоянии "поддержание постоянной скорости" Вы либо ничего не делаете (записываете в управляемый делитель из раза в раз один и тот же код), либо как-то по измеренному иглу поворота компенсируете неточности задания скорости (как например работают ФАПЧ: подстраивают частоту измеряя фазу).
3. Для работы с состоянии "ускорение", Вам понадобится задавать 3 величины: период изменения коэффициентов для делителя частоты, "шаг изменения скорости" и количество периодов изменения коэффициентов для делителя частоты.
4. Работа в состоянии "ускорение":
a] записать в регистр DIV_K_LOAD коэффициент, который будет некоторое время загружаться, как стартовой для управляемого делителя частоты.
b] начать отсчет периода изменения скорости.
c] пока идет периода изменения скорости, Вам необходимо подготовить новое значение коэффициента для регистра DIV_K_LOAD.
d] по прошествии заданного количества периодов изменения коэффициентов для делителя частоты (периодов ускорения), перейти в состояние поддержание постоянной скорости (возможно с записью не вычисленного, а заранее заданного коэффициента для делителя частоты - так, возможно, будет точнее).


В принципе у меня это и организовано было в проекте: есть аккумулятор один аргумент которого - код начальной частоты, второй аргумент - код приращения("шаг изменения скорости"), выход аккумулятора идет на один из входов компаратора и на вход счетчик с паралельной загрузки. Компаратор сравнивает текущий код частоты с максимально заданным и когда эти значения сравниваются поступает запрет в аккумулятор на разрешение счета. В счетчик с паралеьной загрузкой при его переполнении поступает новое значение с аккумулятора.==> всего 3 значения из софта. Вроде все работает, частоту const держит, движок бегает, НО скорость в двигателе нарастает не линейно.
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Jul 30 2009, 06:23
Сообщение #29


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(Anton_NN @ Jul 30 2009, 09:01) *
...НО скорость в двигателе нарастает не линейно.

Так это потому, что необходимо подругому считать коэфициенты в состоянии "ускорения" (например, как я и указал Ваше - при помощи делителя).

Но лучше сделайте нормальный регулятор, который будет работать с обратными связями - тогда Вы получите минимальные погрешности и максимальную надежность работы системы. Если Вы воспользуетесь регуляторами полученными при использовании процедуры АКАР, то сможете задавать ряд желаемых аттракторов/репеллеров в системе, что придаст Вашей системе необходимые именно Вам свойства. Единственное с чем надо быть очень аккуратным, так это с параметрической чувствительностью регуляторов (любых регуляторов: и старых «классических», и свеженьких – полученных с помощью АКАР).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 14:21
Рейтинг@Mail.ru


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