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

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> ШИМ, сделать три канала?
SasaVitebsk
сообщение Oct 12 2007, 13:29
Сообщение #31


Гуру
******

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



Цитата(Rst7 @ Oct 12 2007, 16:01) *
Конечно, алгоритм генерации будет хитрый. Но в худшем случае будет всего N прерываний, где N - количество шимов. А чтобы не было ошибок, надо чтобы частота шима была меньше чем Fcpu/(Ni*256), где Ni - количество тактов на обработку прерывания.

Совершенно в дырочку. Правда прерывание будет чуть чуть длиннее чем у GM. Кроме того, нет никаких проблем с реализацией такого алгоритма на Си. По крайней мере под IARом. Прерывание пишется на АСМе, а всё остальное на Си.


Чуть-чуть доуточню. Прерываний N+1, где N- число шимов. А частота, будет чуть выше, чем ожидает RST, при правильном написании. Потому, что можно разрешить прерывание ранее чем произойдёт выход из прерывания. Надо внимательно анализировать. В общем случае вложенность не имеет принципиального значения, так как общая занятость процессора в прерываниях будет значительно меньше периода ШИМ. А длительность прерывания определяет только минимальный размер ступеньки.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 12 2007, 14:21
Сообщение #32


Ambidexter
*****

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



Цитата(Rst7 @ Oct 12 2007, 10:45) *
Чето я не понял. Пусть будет 13 тактов. И еще надо добавить 4 - на вычитывание вектора и т.д. - внутренние операции. Итого 17.
Теперь с другой стороны. За 166мкс*20МГц=3320 тактов надо выполнить 256 прерываний. На прерывание 12.97 тактов. Меньше 17. Значит свободного времени у процессора нет совсем. И есть недобор. Почти в 1.5 раза. Непонятно, где-же время на генерацию колбаски? Надо бы рыбку уменьшить smile.gif

Ну так, прерываний-то всего 24 (по совпадению) + 1 (по переполнению таймера). За период 166 мкс (период шим) потратится в лучшем случае 25*0.05*17=21.25 мкс. Остальное время 166-22=144 мкс, вагон и маленькая тележка времени, 86% всего времени процессора, между прочим, можно пустить на расчёт "колбаски" по вашей терминологии.

Цитата(add @ Oct 12 2007, 10:35) *
Ну в Вашем случае вы подготавливаете "колбаску" вне прерывания.. adnega делает это внутри прерывания.. Есть ли в Вашем способе (скажу что способ вообщем то один и тотже) смысл выносить подготовку "колбаски за прерывание"?В таком случае для экономии времени в прерывании прийдется работать с флагами (события по окончанию обновления "колбаски").. и возможен пропуск момента смены значений? в чем выигрыш? может полагаясь на то что данные выводимые в шим обновляются не так часто? тогда какой смысл так "задирать"частоту"шима?

Способ не один и тот же. Уже ответил, повторюсь. У меня всего максимум 24+1 прерывание на период шима, и только одно прерывание может возникнуть в течение одного кванта. На периоде шима умещается 256 квантов. Хотите увеличить частоту шима, не меняя количество квантов (или "ступеней" по-простому), уменьшайте длительность кванта.

Смена значений происходит во время прерывания от таймера (квант 255). Скажу больше, пока прерывания работают с одной "колбаской" в течение текущего периода шима, фоновая программа готовит другую "колбаску" для следующего периода шима, так они поочерёдно и меняются, всё по-честному.

Подчеркну ещё раз, при данном подходе есть принципиальная возможность менять уставки ВСЕХ шимов для КАЖДОГО периода шим. Другой вопрос (и не такой простой), откуда возьмутся новые 48 байт уставок (2 байта на один канал) за период шима (166 мкс).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
add
сообщение Oct 12 2007, 14:28
Сообщение #33


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Цитата(SasaVitebsk @ Oct 12 2007, 16:53) *
Вы, кстати, зря смеётесь. Те характеристики, что указывает GM я берусь реализовать и времени на расчёт останется вагон. Могу продемонстрировать....

Если Вас не затруднит, пожалуйста продемонстрируйте. (не обязательно кодом), можно и даже наверное лучше алгоритмом. А главное хотелось бы увидеть количество МЦ отводимых на каждый шаг.
зы: исх. данные вроде были такие: Такт-20МГц , прерывания 1.5МГц, Шим 6КГц 256 шагов. Ну еще в довесок 24 канала. Жду с нетерпением(это не сарказм). :-)


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 12 2007, 14:45
Сообщение #34


Ambidexter
*****

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



Цитата(adnega @ Oct 12 2007, 07:00) *
18-канальный ШИМ на Мега8 (18.432МГц) для управлениея 6-тью полноцветными светодиодами

У вас, кстати, есть логическая ошибка в алгоритме, вследствие чего могут возникнуть глитчи переменной длительности. Возможно для светодиодов это и пройдёт, но для всяких тиристорных коммутаторов думаю вряд ли, не говоря уж об электроприводах.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 12 2007, 15:29
Сообщение #35


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Oct 12 2007, 17:21) *
Ну так, прерываний-то всего 24 (по совпадению) + 1 (по переполнению таймера).

В таком случае почему вы меняете TCR0, а не OCR0?
И почему не модифицируется X? 24 * 4 = 90 байт, на авто переполнение расчитывать здесь не получится.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 12 2007, 16:15
Сообщение #36


Ambidexter
*****

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



Цитата(defunct @ Oct 12 2007, 14:29) *
В таком случае почему вы меняете TCR0, а не OCR0? И почему не модифицируется X? 24 * 4 = 90 байт, на авто переполнение расчитывать здесь не получится

Здесь описка, конечно OCR0, вроде регистра TCR0 нет в авроровской природе. В течение периода шим возникает до 24 прерываний по совпадению, В конце периода шим возникает последнее прерывание, по переполнению, там происходит обнуление портов и с помощью команды lds xl,pwmtable заносится адрес другого буфера. И всё по-новой! И вновь продолжается бой!(:-)

Да вот фрагмент, собственно
Код
;Процедура обработки прерывания таймер0 по переполнению (15МЦ)
eopwm:    ldi      temp,0            ;обнуление
          out      porta,temp        ;порта 1
          out      portb,temp        ;порта 2
          out      portc,temp        ;порта 3
          mov      r3,temp           ;начало шим
          lds      XL,pwmtable       ;адрес текущего буфера уставок
          ld       temp,X+           ;первая уставка
          out      OCR0,temp         ;нового периода шим
          reti                       ;сделано

Первый раз я выложил функцию просто для демонстрации SasaVitebsk, как я организовывал шим. ни в одну из описанных им схем я не вошёл. Да собственно, так, как показано, я не делаю, слишком медленно(:-). Теперь, надеюсь, на все ваши нынешние и предыдущие вопросы ответил?
Цитата(defunct @ Oct 12 2007, 07:59) *
1. теряем ценный регистр X.
2. не понятно где осуществляется сброс X в начальное состояние.
3. почему ОCR0 меняется самым последним?
4. Зачем он вообще меняется (25-й канал)?

Функция по тактам возможно и оптимальна, но с т. з. функциональности то, что вы привели - это разрозненные колбасные обрезки

Функция по тактам практически оптимальна, с учетом выбранного алгоритма. И с точки зрения функциональности тут всё нормально, повторюсь, она была выложена просто для демонстрации одной из реализаций шим, ничего более, не как законченная программа, которую взял, прошил и пользуйся.

Насчёт ценного регистра. А куда их девать, солить что ли(:-)?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 12 2007, 21:04
Сообщение #37


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Oct 12 2007, 19:15) *
Функция по тактам практически оптимальна, с учетом выбранного алгоритма. И с точки зрения функциональности тут всё нормально, повторюсь, она была выложена просто для демонстрации одной из реализаций шим, ничего более, не как законченная программа, которую взял, прошил и пользуйся.

Согласен, красивый способ как для чисто вывода многоканалного ШИМа,
остается вопрос смены данных? Получается нетривиальная задача сформировать (фактически упаковать) 24 канала. При изменении значения любого одного канала весь массив придется перестроить. С какой частотой дискретизации у вас обновляется массив?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 12 2007, 21:54
Сообщение #38


Ambidexter
*****

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



Цитата(defunct @ Oct 12 2007, 21:04) *
Согласен, красивый способ как для чисто вывода многоканалного ШИМа, остается вопрос смены данных? Получается нетривиальная задача сформировать (фактически упаковать) 24 канала. При изменении значения любого одного канала весь массив придется перестроить. С какой частотой дискретизации у вас обновляется массив?

Не совсем уверен, что такое "частота дискретизации" обновления массива(:-).

В течение каждого периода шим, т.е. за 166 мкс (поскольку частота шим 6 кГц), формируется упорядоченная таблица для вывода с помощью приведённой выше программы обработки прерываний по совпадению.

Задача была непростая в реализации, поскольку я никогда не занимался сортировкой. Пришлось освоить, был выбран модифицированный пузырьковый метод. Программа даже в неоптимальном виде полностью выполняется в течение периода шим. Далее адрес начала упорядоченной таблицы записывается в ячейку памяти, откуда её берёт программа обработки прерываний по переполнению и засылает в тот самый пресловутый регистр Х, который по-вашему очень "ценный". Вроде всё.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 12 2007, 22:08
Сообщение #39


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Oct 13 2007, 00:54) *
Не совсем уверен, что такое "частота дискретизации" обновления массива(:-).

имел в виду частоту с которой можно менять значения каналов. т.к. мне почему-то показалась, что она будет ниже частоты ШИМ.

Цитата
В течение каждого периода шим, т.е. за 166 мкс (поскольку частота шим 6 кГц), формируется упорядоченная таблица для вывода с помощью приведённой выше программы обработки прерываний по совпадению.

хм.. и 166us хватает на сортировку "пузырьком"?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 12 2007, 23:56
Сообщение #40


Ambidexter
*****

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



Цитата(defunct @ Oct 12 2007, 22:08) *
имел в виду частоту с которой можно менять значения каналов. т.к. мне почему-то показалась, что она будет ниже частоты ШИМ.
хм.. и 166us хватает на сортировку "пузырьком"?

Ну да, а что тут такого? Щас вот посмотрел метод сортировка-слияние, сортируется 12 и еще 12, потом списки сливаются, так на сортировку 12 уставок уходит 618 МЦ. Ну еще на создание текущих записей 664 МЦ. На круг получается где-то 2200 Мц, т.е. 110 мкс. И всё.

Что касается частоты смены значений каналов, то на практике требуется одна смена на 10+ периодов шим, редко меньше.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 13 2007, 10:02
Сообщение #41


Гуру
******

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



Цитата(=GM= @ Oct 12 2007, 19:15) *
Первый раз я выложил функцию просто для демонстрации SasaVitebsk, как я организовывал шим. ни в одну из описанных им схем я не вошёл. Да собственно, так, как показано, я не делаю, слишком медленно(:-). Теперь, надеюсь, на все ваши нынешние и предыдущие вопросы ответил?


В смысле не вошёл - это первый из описанных мной способов. Именно так я реализовывал ШИМ в 89 году. Только регистра OCR в 48 не было, но это тоже не проблема.

Алгоритм прост.
Создаётся структура связанная. Значения портов(порта) и следующее время переключения. Для каждого из прерываний. Одна структура действующая, вторая в это время подготавливается. Так же как это делается при работе с изображением.

При подготовке структуры сначала формируются структура, потом переупорядываются значения по возрастанию значений таймера, потом вычитаются значения из предыдущего интегрального. В смысле высчитывается сколько времени должно пройти от предыдущего прерывания OCR. Здесь же учитывается ошибка выставления времени (для проги приведённой GM у меня и defunct её не будет) и учитывается возможность совпадения двух прерываний(об чём я писал выше). В этом случае одно значение убирается а портам делается OR ну или AND в зависимости от полярности ШИМа. По переполнению меняется структура и взводятся все порты.
Если OCR регистра нет, то всё делается на OCF, правда программа прерывания получается чуть больше потому, что контролируется ещё и колличество прерываний (расчитывается где формировать начало ШИМ).



Принципиально таким способом можно выводить более высокую частоту ШИМа чем расчитанная Rst7. Замечу правильно расчитанная. Ну например вдвое выше. Правда при этом будет искажаться значения бизкие к 1. То есть если величина ШИМ для каналов 1 и 2 отличается на 1, то при выводе значение для канала 2 будет искажено на 1 (то есть они будут отличаться на двойку это зацепит и последующие каналы), но существуют задачи, где это не принципиально или где такая ситуация невозможна (как у меня в варианте с ШД). Именно об это я и спрашивал GM, но он не понял.

Существуют модификации такого алгоритма. Если число каналов не так высоко или они взаимно связаны, то можно убрать расчёты а использовать несколько OCR регистров. В том числе на разных таймерах.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 13 2007, 11:26
Сообщение #42


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



После размышлений, я пришел к выводу, что самый быстрый вывод без ошибок для каналов с разностью 1 будет выглядеть так
Код
; Это исключительно сохранение контекста (для использования с компилятором)
    MOVW    R13:R12, R31:R30
    MOVW    R31:R30, R11:R10


    REPT    24
    LD      R15, Z+
    OUT     PORT1, R15
    LD      R15, Z+
    OUT     PORT2, R15
    LD      R15, Z+
    OUT     PORT3, R15
    LD      R15, Z+
    SBRS    R15,7
    RJMP    ENDPWM
    ENDM

                          


ENDPWM
    OUT    OCRx,R15

; Это исключительно восстановление контекста (для использования с компилятором)
    MOVW    R11:R10, R31:R30
    MOVW    R31:R30, R13:R12
    RETI


Таймер устанавливается с максимумом 128 (должно быть два OCR в таймере), и старший бит в новом значении для таймера говорит, склеивать ли прерывания в одно.

Только чуть-чуть ширина может меняться, но ее тоже можно скомпенсировать.

Вот в таком варианте ровно 13 тактов, значит макс. частота будет 6.01 кГц (при тактовой 20МГц).

А, и еще должен быть костылек для длительности больше 128 между переключениями.

ЗЫ: а если 23 шима, то заметно быстрее можно. Однако, с жертвой одного бита порта.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 13 2007, 13:48
Сообщение #43


Ambidexter
*****

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



Цитата(Rst7 @ Oct 13 2007, 11:26) *
После размышлений, я пришел к выводу, что самый быстрый вывод без ошибок для каналов с разностью 1 будет выглядеть ... Таймер устанавливается с максимумом 128 (должно быть два OCR в таймере), и старший бит в новом значении для таймера говорит, склеивать ли прерывания в одно.

В принципе я так и делаю в своей программе. В вашем варианте вы забыли про чтение из буфера и запись в OCR0 следующей уставки.

Кроме того, вы уже пожертвовали старшим битом порта 3, так что у вас будет уже 23 канала, лучше всё же 24, чтобы три порта были использованы под завязку.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 13 2007, 13:54
Сообщение #44


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(=GM= @ Oct 13 2007, 16:48) *
В принципе я так и делаю в своей программе. В вашем варианте вы забыли про чтение из буфера и запись в OCR0 следующей уставки.


Ничего я не забыл. Я сразу обрабатываю следующее значение порта, не выходя из обработчика.

REPT 24 изготавливает 24 повторяющихся куска, на самый плохой случай, если все уставки отличаются на 1 и из прерывания не нужно выходить.


Цитата
Кроме того, вы уже пожертвовали старшим битом порта 3, так что у вас будет уже 23 канала, лучше всё же 24, чтобы три порта были использованы под завязку.


Пожертвовал я старшим битом уставки таймера. Так что шимов - 24


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 13 2007, 14:22
Сообщение #45


Гуру
******

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



Как правило обработчик прерывания по OCF получается более громоздким, поэтому вблизи 0 при таком варианте происходят искажения. У меня, к примеру были. Хотя я несколько по другому делал. В принципе у GM будут незначительные искажения. Там у него только вывод портов одним значением, переинициализация таймера, переключение "колбасы". В принципе, наверное близкое значение в пересчёте на такты.

Правда требуется синхронизация работы головы с переключением. В АСМе это осуществляется разрешением прерывания и прямым переходом на обработчик - оттуда RET. Здесь если пользоваться подходом Rst7 тоже можно так сделать. А уже обработчик написать на СИ в виде подпрограммы.
Go to the top of the page
 
+Quote Post

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

 


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


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