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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Генерация пачки импульсов, Нужны идеи
KSN
сообщение Aug 18 2008, 01:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Надо сгенерить N(10-1000000) импульсов частотой f(20-1000 кГц) на контроллере meag128. Какие есть решения?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 18 2008, 03:15
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(KSN @ Aug 18 2008, 10:54) *
Надо сгенерить N(10-1000000) импульсов частотой f(20-1000 кГц) на контроллере meag128. Какие есть решения?

Как мне кажется, в этой теме осуждалось нечто подобное.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 18 2008, 03:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



добавлю: генерировать надо прямоугольные импульсы.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Aug 18 2008, 03:26
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



Цитата(KSN @ Aug 18 2008, 05:18) *
добавлю: генерировать надо прямоугольные импульсы.

Я позаимствовал у Темерева сдвиговый регистр на 8 бит

loop3: ror temp ; вывод 9-го байта
brcs h_l1
cbi PORTE, DAT
rjmp sync1
h_l1:sbi PORTE, DAT
sync1: rcall pulse // тактовые
dec loop
brne loop3
rcall wait_10us
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 18 2008, 04:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Цитата(Павлик @ Aug 18 2008, 10:26) *
Я позаимствовал у Темерева сдвиговый регистр на 8 бит

loop3: ror temp ; вывод 9-го байта
brcs h_l1
cbi PORTE, DAT
rjmp sync1
h_l1:sbi PORTE, DAT
sync1: rcall pulse // тактовые
dec loop
brne loop3
rcall wait_10us


Реализовать с помощью простой функции - это понятно. Я вообще-то думаю использовать ШИМ для генерации. Вся трудность состоит в том, чтобы сгенерировать определенное количество импульсов. На частоте 1Мгц можно без проблем сгенерировать более 1000 импульсов, а вот 100 импульсов?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 18 2008, 05:09
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(KSN @ Aug 18 2008, 07:54) *
Надо сгенерить N(10-1000000) импульсов частотой f(20-1000 кГц) на контроллере meag128. Какие есть решения?

Это -- дипломная/курсовая работа?

Ответ не возможен -- мало данных. Ниже привожу небольшую часть вопросов:

0. Какое основное назначение устройства? (Здесь люди не глупые и могут "додумать" некоторые параметры, которые Вы не указали в своем вопросе).
1. Какие требования к джиттеру (дрожжание фронтов), к стабильности частоты?
2. Какая величина дискретности (шаг) изменения частоты?
3. Какое событие запускает пачку импульсов, и какая скорость реакции на запуск?
4. Не указана скважность имульсов.
5. Чем объясняется выбор столь мощного МК (mega128)?
6. Какие задачи еще будут "навешены" на МК? Какую вычислительную мощность они потребуют?

Сообщение отредактировал zhevak - Aug 18 2008, 05:10


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 18 2008, 05:27
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Цитата(zhevak @ Aug 18 2008, 12:09) *
Это -- дипломная/курсовая работа?

Ответ не возможен -- мало данных. Ниже привожу небольшую часть вопросов:

0. Какое основное назначение устройства? (Здесь люди не глупые и могут "додумать" некоторые параметры, которые Вы не указали в своем вопросе).
1. Какие требования к джиттеру (дрожжание фронтов), к стабильности частоты?
2. Какая величина дискретности (шаг) изменения частоты?
3. Какое событие запускает пачку импульсов, и какая скорость реакции на запуск?
4. Не указана скважность имульсов.
5. Чем объясняется выбор столь мощного МК (mega128)?
6. Какие задачи еще будут "навешены" на МК? Какую вычислительную мощность они потребуют?


Нет, это не дипломная работа. Просто оцениваю возможность реализации управления двигателем.
Вообщем, есть драйвер двигателя, на него надо подать только импульсы шага и сигнал направления, а уж он все отработает дальше сам. Мой девайс должен вырабатывать эти импульсы, соответсвенно: один импусльс = перемещение двигателя на шаг. Обратной связи по энкодеру - нет. Скорость движения, а значит и частота сигнала может быть разная.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 18 2008, 05:48
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(KSN @ Aug 18 2008, 11:27) *
Нет, это не дипломная работа. Просто оцениваю возможность реализации управления двигателем.
Вообщем, есть драйвер двигателя, на него надо подать только импульсы шага и сигнал направления, а уж он все отработает дальше сам. Мой девайс должен вырабатывать эти импульсы, соответсвенно: один импусльс = перемещение двигателя на шаг. Обратной связи по энкодеру - нет. Скорость движения, а значит и частота сигнала может быть разная.

Ага. Я понял, Сергей.

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

Извините, если для Вас это прописные истины. Постарайтесь не сердится. Форум читают также молодые инженеры-разработчики. Я по себе знаю, что иной раз боишься задать вопрос, что бы не показаться глупым, не попасть под водопад насмешек или не ввязаться в бесполезный спор.

Скажите, что Вам мешает формировать импульсы программно? Грубо говоря, в программе имеется два счетчика -- один отсчитывает количество импульсов, второй -- определяет время импульса/паузы. Вы указали максимальную частоту импульсов 1 кГц. Учитывая, что мега скорее всего будет работать на частоте 8-10 Мгц, то программно сформировать пачку импульсов вполне возможно. А учитывая, что Вы делаете не на заказ, а для собственных нужд (для исследований), то скорее всего так и нужно делать программно формировать длительности и количество импульсов. По крайней мере я бы так и делал.

Сообщение отредактировал zhevak - Aug 18 2008, 05:54


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 18 2008, 06:26
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Динамику разгона/торможения исследовать конечно придется.
На малых частотах я делал подсчет импульсов (таймер в режиме ШИМ, прерывание по сравнению) - все работало. Но здесь предполагаемая частота не 1000Гц, а 1000 кГц, поэтому такой фокус не пройдет. Может как вариант: один таймер ШИМ выдвет, далее этот сигнал заводится на второй таймер, который
считает импульсы(понятно, что разрядности таймера может не хватить, тогда введем 32разрядный программный счетчик). По прерыванию переполнения таймера 2 судить о том: все импульсы посланы или нет.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 18 2008, 07:17
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(KSN @ Aug 18 2008, 12:26) *
Динамику разгона/торможения исследовать конечно придется.
На малых частотах я делал подсчет импульсов (таймер в режиме ШИМ, прерывание по сравнению) - все работало. Но здесь предполагаемая частота не 1000Гц, а 1000 кГц, поэтому такой фокус не пройдет. Может как вариант: один таймер ШИМ выдвет, далее этот сигнал заводится на второй таймер, который
считает импульсы(понятно, что разрядности таймера может не хватить, тогда введем 32разрядный программный счетчик). По прерыванию переполнения таймера 2 судить о том: все импульсы посланы или нет.


Опаньки! Мои извинения! Я даже как-то и не подумал, что на движек будут поступать мегагерцовые импульсы. Вах! Это действительно -- очень серьезно. Просто любопытно становится, как Вы собираетесь затолкать в обмотку двигателя 1 МГц? На сколько я понимаю, что бы получить достаточный (для толкания нагрузки) ток в обмотке двигателя, нужно будет поднять напряжение до ... хрен знает какой величины (dI ~ dU/dt).

Поскольку частота очень высокая, все мои предложения по программному формированию импульсов надо пересмотреть заново.

Давайте попробуем начать со счетчика количества импульсов. Как было сказано ранее, максимальное количество импульсов -- один миллион. Значит, для организации счетчика понадобится как минимум три байта. (Двух байт не хватит. Два байта это -- 65536, а нам надо один миллион.) А это значит, что при переполнении младшего байта, нужно будет выполнять операции по инкрементированию среднего байта, при переполнении среднего -- инкрементировать старший. Иначе говоря, при формировании двух смежных импульсов мы должны успевать в самом худшем случае оценивать переполнение двух байт, инкрементировать три байта и успевать сравнивать три байта с заданным значением (заданным количеством импульсов).

Давайте попробуем прикинуть, формирование фронтов импульсов должно происходить каждые 500 нс. Если предположить, что АВР-ка будет работать на частоте 16 МГц, т.е. один такт равет 62.5 нс, то мы за 500 / 62.5 = 8 тактов должны выполнить описанные чуть выше действия. Вердикт однозначный -- программно это сделать невозможно.

Что касается использования аппаратных таймеров, то тут те же самые проблемы -- исчерпание (или переполнение) двухбайтового таймера (TIMER1) должно приводить к прерыванию, которое должно перезапустить таймер на очередную порцию 65536 импульсов. Так или иначе, при формировании длинной пачки мегагерцовых импульсов будут возникать гапы (gap), т.е. кратковременные паузы.

Боюсь, что на Меге это задачу не решить. Вы не рассматривали идею использовать LPC2103 на максимальной частоте? Там аппаратные 32-х разрядные таймеры. Мне кажется, Вы там сможете быстрее создать свой генератор импульсов. На 8-ми разрядных МК нужно пройти через уж слишком большое количество ненужных извращений. Причем реализация задуманного девайса не гарантируется.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 18 2008, 07:53
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Я начал с малого - с AVR. Также в зоне внимания: ARM-based контроллер (AT91SAM7A3) или CPLD.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 18 2008, 09:25
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(KSN @ Aug 18 2008, 10:53) *
Я начал с малого - с AVR. Также в зоне внимания: ARM-based контроллер (AT91SAM7A3) или CPLD.

А может сразу PC с двухядерным? smile.gif

С самой задачей справится и AVR. Причём столько движков - сколько ног хватит. Шим там не нужен. Я так понимаю, что там свой контроллер? Мощный проц потребуется только в случае какой-то серьёзной обработки кроме движка. А так те несколько строчек проги вам накидали. Разгон тормажение делается по таблице. Увяжите текущую скорость с промежутками м/у импульсами. Используйте таймер на максимальной скорости.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 18 2008, 12:55
Сообщение #13


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(zhevak @ Aug 18 2008, 06:17) *
Поскольку частота очень высокая...Если АВР-ка работает на частоте 16 МГц, то за 8 тактов должны выполнить описанные чуть выше действия. Вердикт однозначный -- программно это сделать невозможно.

Что касается использования аппаратных таймеров, то тут те же самые проблемы -- исчерпание (или переполнение) двухбайтового таймера (TIMER1) должно приводить к прерыванию, которое должно перезапустить таймер на очередную порцию 65536 импульсов. Так или иначе, при формировании длинной пачки мегагерцовых импульсов будут возникать гапы (gap), т.е. кратковременные паузы.

Боюсь, что на Меге это задачу не решить

Частота на самом деле высокая, но задача легко решаема на меге.

Цитата(KSN @ Aug 18 2008, 05:26) *
Может как вариант: один таймер ШИМ выдвет, далее этот сигнал заводится на второй таймер, который считает импульсы (понятно, что разрядности таймера может не хватить, тогда введем 32разрядный программный счетчик)

Именно так и можно сделать. Берёте таймер1 (16-бит) и к нему один программный байт, поскольку вам нужен 3-х байтный счётчик, а не 4-х байтный.

Теперь внимание, записываете в свой счётчик инверсное число, до которого надо досчитать. По переполнению счётчика увеличиваете значение в 3-ем байте, и проверяете его на 0, это две команды на ассемблере, 3 такта. Как только его содержимое окажется равным 0, останавливаете процесс выдачи шагов. Вот такая простая идея.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 18 2008, 13:07
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А нельзя применить в качестве 3го байта 8битный счетчик с внешним тактированием? Здорово было бы применить его в качестве предделителя для второго 16титного счетчика, да боюсь не сдюжит по частоте, все же он на 32,768кГц заточен, но в качестве пост-делителя, т.е. 3го байта, вполне, остается придумать как половчее обработку сделать.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 18 2008, 13:51
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



если закрыть глаза, что при герерации пачки мпульсов будут возникать пауза или не точно выдерживаться количество имульсов, то
Цитата(=GM= @ Aug 18 2008, 18:55) *
Частота на самом деле высокая, но задача легко решаема на меге.

только автор вопроса может сказать, что допустимо, а что нет. Поскольку он ничего не говорит про гапы, то я предполагаю, что их быть не должно.

И в самом деле, ротор двигателя -- достаточно инерционная шткуа, а еще если нагружена, то можно представить себе какая будет инерционность. А теперь представьте, что следует команда передвинуть чего-то там на 987654 шагов. Двигатель начинает шагать, разгоняетя, и вдруг в это время возникает пауза... По инерции двигатель проскакивает полюс. Импульсы вновь появляются. Частота уменьшается, двигатель тормозится и останавливается. Каков результат? Мы считем, что двигатель совершил 987654 шага, на само деле они ушел на 987655 шагов.

Я не знаю, на сколько это трагично. Но вижу одно -- очень большая частота импульсов. Если сразу "влупить" ее на неподвижный ротор, то двигатель будет работать не правильно. Определить положение двигателя будет сложно -- энкодер отсутствует (см. пояснения автора вопроса).

Давайте попробуем смоделировать процесс отсчета 500000 шагов. Для начала проигнорируем, инерционность двигателя, т.е. проигнорируем то обстоятельство, что его нужно разгонять и тормозить, Как я говорил -- срузу "влупим" ему 1 МГц.

Аппаратный счетчик способен считать до 65536. Значит, для реализации идеи нам понадобится совершить 500000 / 65536 = 7 полных цикла и один (последний) до значения 41248.

(проверка того, что не ошибаемся в подсчете: 65536 * 7 + 41248 = 500000.)

Я предполагаю, что TIMER1 будет работать в режиме normal и считать по циклу. Каждый раз при переполнении будет возникать прерывание. Мы программно считаем эти переполнения. Это есть наши полные циклы, их должно быть семь. Пока мы их просто считаем, в работу таймера не вмешиваемся, следовательно, перерывов в генерации импульсов возникать не должно.

Последний цикл не полный. Значит мы должны среагировать на прерывание от регистра сравнения. Т.е. перед тем как войти в последний цикл отсчета, мы должны изменить режим работы таймера. Мы сможем очень быстро, иначе гововоря, -- не заметно для выходной последовательности импульсов
поменять режим? Я не уверен.

Ладно, есть еще одни грабли: окончание счета. По достижении конца счета на последнем цикле (41248) возникает соответствующее прерывание. Что мы должны сделать? Нам нужно быстро остановить генерацию импульсов. Сможем это сделать? Или пока мы входим в прерывание, пока мы исполняем первую команду в нем, схема нам успеет нагенерить еще "этих мягких французских булочек"?

Я не говорю, что я прав. Скорее, я даже где-то ошибаюсь. Но мне самому стало интересно, как автор сможет разгонять движек до мегагерца и точно исполнять заданное количество шагов? Задача-то, отнюдь, не тривиальная.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

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

 


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


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