0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||||||||||||
1 | ||||||||||||||||
Оптимизация для повышения частоты ШИМ29.10.2020, 20:37. Показов 2257. Ответов 36
Добрый день. Пишу программу для многоканального ШИМ-контроллера на основе Attiny13. Так как у него всего два аппаратных канала, использую программное управление в прерывании таймера.
Сначала планировалось ШИМить с низкой частотой (10 Гц), но шумовые эффекты все равно значительны. А вот с поднятием частоты до 20 кГц возникли затруднения. Сначала было так (обработчик прерывания). Такой код выполнялся 54 такта и при тактовой 9.6 МГц и разрешении ШИМ 16 уровней давал менее 10 кГц на выходах.
Обработчик уменьшился, теперь 30 тактов, однако оказалось, что из-за накладных расходов едва ли дотянулось до 10 кГц.
Кликните здесь для просмотра всего текста
Я более-менее имею опыт в ассемблере, но переписывать весь код в нём не хочется, остальная часть проги (юарт, проверка настроек, контроль температур) написана и отлажена. Что можно сделать конкретно в этом обработчике, не представляю. Как-то перенести часть операций в медленную часть, что-ли. Есть отчаянные варианты, например забить в OSCCAL максимальное значение, но тогда может пострадать чтение и запись еепром. Или внешний ТГ на 20 МГц, но ножек не хватит. Переделать аппаратную часть, вроде фильтра на выход, это самое сложное решение, как обычно. Аппарат... немножко неразборный, и проще сделать новый с нуля. Буду благодарен за любые намёки, наводки и прочее.
0
|
29.10.2020, 20:37 | |
Ответы с готовыми решениями:
36
регулирование частоты шим Реализация плавного повышения частоты пьезоизлучателя. Изменение частоты/скважности ШИМ Измерение частоты и скважности ШИМ (Infineon XC2000) Программа для понижения/повышения частоты работы процессора? |
29.10.2020, 21:43 | 2 |
Других контроллеров нет и нет возможности купить?
Почему не выбрать подходящий с нужным числом аппаратных каналов ШИМ? Уровень оптимизации -O0?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
29.10.2020, 21:43 | 3 | |||||
здесь при кажущейся простоте происходит три фазы чтение-модификация-запись
попробуй с временной переменной
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
29.10.2020, 22:57 | 4 |
Увы, придётся. Сесть одновременно на оба всем известных стула, при этом ещё и съев рыбку, не получится.
Конечно же не код всей программы, но именно это прерывание надо написать на асме целиком. Бывал в подобной ситуации уже. Добавлено через 2 минуты Для внешнего именно генератора (а не кварца) достаточно одной ножки.
0
|
Тутошний я
|
||||||||||||||||
30.10.2020, 00:38 | 5 | |||||||||||||||
а это точно ШИМ? зачем эти строчки? зачем её постоянно сбрасывать?
Добавлено через 23 минуты это же не stm. и я надеюсь они проводят к командам andi и ori, которые занимают 1 такт.
0
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
|
30.10.2020, 10:50 [ТС] | 7 |
Хорошее, но неудобное решение. Есть куча attiny13 и atmega8, но даже у меги нет четырех каналов. Из того, что есть, подходит только стм32, но для такой простой задачи морально неудобно её использовать. А еще, тини13 были как раз для этого и закуплены.
Нет, но на любом уровне оптимизации генерируется такой код. Пробовал и так, экономит 5 тактов, но с массивом возможных значений все равно быстрее выходит. Так и думал. Пока не могу придумать, как избежать сохранения шести регистров в стек и извлечения их. Когда писал проги целиком на асме, просто не использовал в основной программе те регистры, которые задействованы в прерывании. Да там все ножки заняты. У него еще подключен термодатчик и вход юарта для записи настроек. Может, одним каналом пожертвую... Точно ШИМ, даже в железе работает) Алгоритм был такой: если счетчик меньше уставки, то поднимаем единицу, а если больше, то опускаем. Проверяем это n раз за период ШИМ. Боюсь, Ваш код будет работать, только если основной цикл выполняется достаточно часто. У меня же он имеет период на три порядка больше, чем прерывание. Там почти килобайт кода. Спасибо всем, пока попробую написать прерывание на ассемблере. Если не выйдет, придется изготовить новый макет устройства, с фильтрами и мощными ключами. Тесты показали, что ШИМ на 10 Гц очень шумный, а вот немного сглаженый сигнал уже практически бесшумен. Нагрузка - обычные 3-pin вентиляторы. Делаю охлаждение для серверов, чьи материнские платы не умеют управлять кулерами, а заказывать цифровой контроллер это большое время и гораздо дороже своей разработки.
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
30.10.2020, 10:54 | 8 |
Переходите на CVAVR, там есть строгие соглашения, какие регистры можно безболезненно тереть.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||
30.10.2020, 12:19 | 9 | |||||
"физика" предусмотрена, в данном случае, в процессоре (команды
ТС, 1) используйте значение самогО таймера, для временнЫх тиков. То есть в Вашем коде cnt = TCNT1 будет вполне оправдано (TCNT1 может бежать синхронно с TCNT0, с известным соотношением). 2) Используйте глобальные переменные со словом "register", что даст Вам возможность хранить их значения в регистре а не памяти. Вы также можете показать весь код, чтобы нам не фантазировать на тему оптимизации. В коде может быть довольно много подводных камней, которые можно убрать (ну, или наставить). Допустим, Вами представленный код может и не кешировать регистры в прерывании, если его правильно собрать (см.п.2, если не достаточно - то inline asm).
1
|
locm
|
30.10.2020, 12:26
#10
|
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
30.10.2020, 13:23 | 12 |
...если ШИМ не переключается часто - в памяти можно генерить паттерн из необходимых состояний и "проигрывать" его в цикле. Вот только в 13й тиньке сколько? 64 байт RAM всего? Маловато, как для красивого ШИМ. Но так сделать получится.
0
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||
30.10.2020, 14:02 [ТС] | 13 | |||||
Идея классная, только в моём МК всего один таймер. Хотя есть варианты, но точного соотношения двух периодических прерываний тут не добиться. Можно попробовать вызывать прерывание каждый тик таймера (при каждом вызове инкрементируя число сравнения), но это добавит 3 такта на этот самый инкремент.
Это еще интереснее, только я не смог объявить глобальную переменную-регистр. В инете пишут, что регистром может быть только локальная переменная, но она ж нужна в прерывании. Да, работаю (пока что) в Атмел Студии. Не по теме: Не спорю, Вы совершенно правы, но работаю с тем, что есть. А то потом, когда мне понадобится 144 МГц, у меня будет 144 тиньки и ни одной стм. Добавлено через 6 минут Так и сделал, вот сейчас задача этот код перебора паттернов написать более-менее быстрым. 16 уровней мне хватит. Нет) Не думаю, что стоит ускорять код, у которого нет никаких временных ограничений. Только если ограничить его аппетиты в регистрах. Скоро покажу его, как только причешу. Добавлено через 30 минут А вот и весь код. Кликните здесь для просмотра всего текста
0
|
Тутошний я
|
|
30.10.2020, 16:09 | 14 |
9600000/(20000*16)=30тактов
не получится шим 20 кГц. он постоянно будет в прерывание уходить. 10 кГц максимум. и uart в прерывание таймера поместить. задержки убрать. Добавлено через 4 минуты и пинов дофига задействовано. я бы взял atmega8. там хоть uart аппаратный есть.
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
30.10.2020, 16:21 | 16 |
pusyakaryagin, ещё вспомните (если не знали), что в AVR можно переключить состояние ноги-выхода за 1 такт, подав единицу в PIN.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
30.10.2020, 19:39 | 17 |
ниче разбросы или 10 Герц или 20 килоГерц(сиречь 20000 Гц)
делается все на паре операциоников, на одном генератор пилы на другом сравнение для 6 каналов хватит двух LM324
0
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||
30.10.2020, 22:16 [ТС] | 18 | |||||
Я с этим компилятором двинусь.
Оставил в обработчике прерывания один лишь NOP, а скомпилировалось вот такое:
Вот как сделать так, чтобы я сам мог полностью написать обработчик на асме? Уже набросал код на листочке, тактов 13-14 выходит, с учетом сохранения SREG, что так упорно пытается делать компилятор. Добавлено через 6 минут Помню такую штуку, но тут проще из памяти, где лежит таблица, вынуть байт и загрузить его в порт. Ну да. Всё для бесшумности. Не у всех есть серверная для сервера) Люблю универсальные решения, и наверно время рассыпухи уже отходит. Там схема-то вышла - 4 ключа (можно два сдвоенных), счетверенный резистор, МК, притяжка сброса и 7805 с обвязкой. При желании можно развести на плате с 5р монетку. Главное-то - настройка температурных порогов и уставок каналов через графическую утилиту с компа. Никакую логику так не настроишь.
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
30.10.2020, 22:50 | 20 |
С AVRstudio двинуться может кто угодно.
Я вам уже советовал портироваться на CVAVR. Там это дело реализуется директивой #pragma savereg off перед шапкой прерывания. В итоге все прологи/эпилоги из листинга удаляются и вы спокойно можете сделать "чистую" asm-вставку. В хелпе всё подробно расписано (включая регистры, которые можно/нельзя тереть). Как реализовать такое в АВР-студии (и возможно ли вообще) - не имею понятия, т.к. работаю в ней чрезвычайно редко.
2
|
30.10.2020, 22:50 | |
30.10.2020, 22:50 | |
Помогаю со студенческими работами здесь
20
Оптимизация кода для повышения скорости выполнения? Оптимизация частоты ШИМа для управления приводами робота. Для повышения Тиц и Pr Определить частоты частости, накопленные частоты и частости для данных статистических данны Фреймворк для повышения навыков PHP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |