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

 
 
> Генерация пачки импульсов, Нужны идеи
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
 
Start new topic
Ответов
KSN
сообщение Aug 18 2008, 06:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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
=GM=
сообщение Aug 18 2008, 12:55
Сообщение #4


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
zhevak
сообщение Aug 18 2008, 13:51
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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
Maik-vs
сообщение Aug 18 2008, 14:20
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(zhevak @ Aug 18 2008, 17:51) *
только автор вопроса может сказать, что допустимо, а что нет. Поскольку он ничего не говорит про гапы, то я предполагаю, что их быть не должно.

Он говорит, что "есть драйвер двигателя, на него надо подать только импульсы шага и сигнал направления, а уж он все отработает дальше сам". То есть "драйвер двигателя" - это контроллер, который и занимается ускорением/замедлением etc. Тогда вопрос сводится к генерации пачки N импульсов с любой скважностью.

Цитата(zhevak @ Aug 18 2008, 17:51) *
И в самом деле, ротор двигателя -- достаточно инерционная шткуа, а еще если нагружена, то можно представить себе какая будет инерционность. ... Но мне самому стало интересно, как автор сможет разгонять движек до мегагерца и точно исполнять заданное количество шагов?

Это вот всем интересно! ИМХО, мегагерц на обмотках шаговика - многовато smile.gif. Скорее, "драйвер двигателя" может получить импульсы на этой скорости, а потом потратит секунды на исполнение.

Реализация собственно задачи простая. Таймер генерит ШИМ (на частоте 1МГц), по прерыванию его переполнения (через 256мкс или 65.536 мс) вычитается программный счётчик. Как только он стал 0, загружаем в регистр(ы) таймера (TCNT, ага) заранее вычисленный "хвостик". В следующем прерывании (переход программного счётчика в ff или ffff) останавливаем генерацию битами WGM. Поскольку загрузка TCNT происходит в прерывании, "пролёт" количества импульсов будет всегда одинаковый, его нужно скорректировать при вычислении "хвостика".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- KSN   Генерация пачки импульсов   Aug 18 2008, 01:54
- - haker_fox   Цитата(KSN @ Aug 18 2008, 10:54) Надо сге...   Aug 18 2008, 03:15
- - KSN   добавлю: генерировать надо прямоугольные импульсы.   Aug 18 2008, 03:18
|- - Павлик   Цитата(KSN @ Aug 18 2008, 05:18) добавлю:...   Aug 18 2008, 03:26
|- - KSN   Цитата(Павлик @ Aug 18 2008, 10:26) Я поз...   Aug 18 2008, 04:47
- - zhevak   Цитата(KSN @ Aug 18 2008, 07:54) Надо сге...   Aug 18 2008, 05:09
|- - KSN   Цитата(zhevak @ Aug 18 2008, 12:09) Это -...   Aug 18 2008, 05:27
|- - zhevak   Цитата(KSN @ Aug 18 2008, 11:27) Нет, это...   Aug 18 2008, 05:48
|- - domowoj   Цитата(KSN @ Aug 18 2008, 12:27) Нет, это...   Aug 18 2008, 16:19
||- - zhevak   Цитата(Maik-vs @ Aug 18 2008, 20:20)...   Aug 18 2008, 14:42
|- - =GM=   Цитата(zhevak @ Aug 18 2008, 12:51) если ...   Aug 18 2008, 14:38
- - KSN   Я начал с малого - с AVR. Также в зоне внимания: ...   Aug 18 2008, 07:53
|- - SasaVitebsk   Цитата(KSN @ Aug 18 2008, 10:53) Я начал ...   Aug 18 2008, 09:25
- - GDI   А нельзя применить в качестве 3го байта 8битный сч...   Aug 18 2008, 13:07
|- - =GM=   Цитата(GDI @ Aug 18 2008, 12:07) А нельзя...   Aug 18 2008, 14:25
- - GDI   ЦитатаБыло бы хорошо, если бы у таймеров был выход...   Aug 18 2008, 14:36
|- - =GM=   Цитата(GDI @ Aug 18 2008, 13:36) OCR чем ...   Aug 18 2008, 14:51
- - KSN   Коллеги, вношу ясность 1МГц - это МАКСИМАЛЬНАЯ вхо...   Aug 19 2008, 02:53
- - Maik-vs   Цитата(KSN @ Aug 19 2008, 06:53) Коллеги,...   Aug 20 2008, 06:25


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:44
Рейтинг@Mail.ru


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