|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||||||||||||
Оптимизация для повышения частоты ШИМ29.10.2020, 20:37. Показов 3243. Ответов 36
Добрый день. Пишу программу для многоканального ШИМ-контроллера на основе Attiny13. Так как у него всего два аппаратных канала, использую программное управление в прерывании таймера.
Сначала планировалось ШИМить с низкой частотой (10 Гц), но шумовые эффекты все равно значительны. А вот с поднятием частоты до 20 кГц возникли затруднения. Сначала было так (обработчик прерывания). Такой код выполнялся 54 такта и при тактовой 9.6 МГц и разрешении ШИМ 16 уровней давал менее 10 кГц на выходах.
Обработчик уменьшился, теперь 30 тактов, однако оказалось, что из-за накладных расходов едва ли дотянулось до 10 кГц.
Кликните здесь для просмотра всего текста
Я более-менее имею опыт в ассемблере, но переписывать весь код в нём не хочется, остальная часть проги (юарт, проверка настроек, контроль температур) написана и отлажена. Что можно сделать конкретно в этом обработчике, не представляю. Как-то перенести часть операций в медленную часть, что-ли. Есть отчаянные варианты, например забить в OSCCAL максимальное значение, но тогда может пострадать чтение и запись еепром. Или внешний ТГ на 20 МГц, но ножек не хватит. Переделать аппаратную часть, вроде фильтра на выход, это самое сложное решение, как обычно. Аппарат... немножко неразборный, и проще сделать новый с нуля. Буду благодарен за любые намёки, наводки и прочее.
0
|
||||||||||||||||
| 29.10.2020, 20:37 | |
|
Ответы с готовыми решениями:
36
регулирование частоты шим Реализация плавного повышения частоты пьезоизлучателя.
|
|
Тутошний я
|
||
| 30.10.2020, 23:16 | ||
|
а 10 Герц или 20 килоГерц за пределами слышимости. тогда только один вариант. переходить на stm.
0
|
||
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||
| 30.10.2020, 23:37 [ТС] | ||||
|
Добавлено через 1 минуту
0
|
||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||||
| 30.10.2020, 23:54 | ||||
|
диапазон слышимости среднестатистического человека 20-20000 Гц, но есть люди которые слышат и 21000 и 16 и боюсь что потери на 20000 Гц в катушке будут достаточно большими КПД упадет Добавлено через 2 минуты
0
|
||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||||
| 31.10.2020, 00:13 | ||||||||
PS: вот только для прерываний я не могу пока понять - зачем это может понадобиться? Ведь хранение переменных в прерываниях - это основа. Иначе просто непонятно, как программа сможет работать с прерываниями, ничего не храня в регистрах.
1
|
||||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|
| 31.10.2020, 07:24 | |
|
Grey, как думаешь, между переменным и импульсным напряжением есть разница?
0
|
|
|
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
||||||
| 31.10.2020, 09:59 | ||||||
|
Kukuxumushu, в разделе документации на AVR LibC указано, как можно сделать "голый" (без пролога и эпилога) обработчик прерывания.
Manually defined ISRs In some circumstances, the compiler-generated prologue and epilogue of the ISR might not be optimal for the job, and a manually defined ISR could be considered particularly to speedup the interrupt handling. One solution to this could be to implement the entire ISR as manual assembly code in a separate (assembly) file. See Combining C and assembly source files for an example of how to implement it that way. Another solution is to still implement the ISR in C language but take over the compiler's job of generating the prologue and epilogue. This can be done using the ISR_NAKED attribute to the ISR() macro. Note that the compiler does not generate anything as prologue or epilogue, so the final reti() must be provided by the actual implementation. SREG must be manually saved if the ISR code modifies it, and the compiler-implied assumption of __zero_reg__ always being 0 could be wrong (e. g. when interrupting right after of a MUL instruction).
2
|
||||||
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||
| 31.10.2020, 10:15 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||
| 31.10.2020, 18:26 [ТС] | ||||||
|
Всем спасибо, особенно за ISR_NAKED и глобальную регистровую переменную.
Написал так, выполняется за 27 тактов, включая RETI и начальный RJMP из таблицы прерываний. При вызове раз в 30 тактов частота вызова, умноженная на 16 отсчетов ШИМ, ровно 20 000 Гц.
Если уговорить компилятор зарезервировать регистры 30 и 31, то прерывание можно освободить от первой и последней инструкции (минус 2 такта). Вероятно, это можно сделать опцией компиляции -ffixed-r30 даже в Атмел студио, но не пробовал. В данном коде расчет на то, что в регистре ZH всегда ноль (должно быть справедливо для МК с маленькой памятью). Если не жалко регистры, можно SREG класть не в стек, а в регистр, заранее зарезервированный. (минус 2 такта) Ну и если во всём коде не используется умножение инструкцией, то таблицу с 16 значениями вариантов выхода можно вообще держать в регистрах (минус, вероятно, еще 3 такта) (возможно, где-то я прав)
0
|
||||||
| 31.10.2020, 20:33 | |
|
0
|
|
| 31.10.2020, 23:56 | |||
|
Не по теме:
но дело не в этом, а в
0
|
|||
|
Тутошний я
|
|||||
| 01.11.2020, 01:33 | |||||
|
Не по теме: в меандре много гармоник. это импульсное. "механическая индуктивность" сглаживает вращение. Добавлено через 2 минуты
0
|
|||||
| 01.11.2020, 09:30 | |
|
0
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||||||||||||||
| 02.11.2020, 11:00 | ||||||||||||||||||
Добавлено через 2 минуты и в коде вы читаете по адресу регистра Z, но не гарантируете правильное значение ZH. Это опасно вообще-то Добавлено через 18 минут ...почитал Ваши комменты к коду - многое Вы и без меня учли . Я бы порекомендовал использовать 16ти битный регистр и глобальную переменную с сохранением адреса. Это даст возможность читать и сравнивать немного (как мне навскидку кажется) быстрее. Вот так примерно:
1
|
||||||||||||||||||
|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
|||||||||
| 02.11.2020, 12:51 [ТС] | |||||||||
|
А еще я беру ассемблерный код после компиляции и просто ищу в нём имена моих регистров, чтобы знать, где они задействованы. Да, -ffixed-rXX в атмел студии работает (помимо блока инициализации). Так вот, в моём алгоритме была неявная ошибка. У меня был массив из 16 байт на 16 временных позиций, или отсчетов, ШИМ. И прерывание вызывалось 16 раз, после чего начинало проходить массив сначала. Такое решение не позволяет достичь 100% открытия канала, в максимуме он будет открыт на 15/16. Решения два: или увеличить массив значений до 17 байт, и заставить программу управления (которая на компе) давать значения ШИМ в диапазоне 0..16, или уменьшить число вызовов прерывания за период, чтобы отсчетов стало 15, и тогда будет доступно все 16 состояний (уровней). Это как 15 сосисок в цепочке, у которой 16 перехватов (включая крайние). Нельзя сделать и 16 сосисок, и 16 перехватов. Сделал по второму, это к тому же подняло частоту до 21.3 кГц. А вот как я получил адрес начала массива, и записал его в регистр:
0
|
|||||||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
|||
| 02.11.2020, 13:44 | |||
поздравляю с хорошей оптимизацией. Для мелких тинек вполне справедливо не учитывать старшие биты вообще, если ДШ не пишет другое. (кто-то здесь писал, что в AVR адреса зацикливаются, то есть старшие биты просто игнорируются).
0
|
|||
|
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,368
|
|
| 13.12.2020, 14:53 | |
|
Может и не в тему.... делал я аппаратный шим для ругулировки подстветки светодиодной ленты. Тоже кстати на 2313. И был эффект мерцания, то есть так не видно, а когда перефирийным зрением смотришь..... да, типа надо бы частоту поднять. А как ее поднять то? А очень просто - я счетчик сделал не ++, а +2, то есть цикл стал считаться в два раза быстрее. Счетчик тот который у автора cnt.
0
|
|
| 13.12.2020, 14:53 | |
|
Измерение частоты и скважности ШИМ (Infineon XC2000) Программа для понижения/повышения частоты работы процессора? Оптимизация кода для повышения скорости выполнения? Оптимизация частоты ШИМа для управления приводами робота. Для повышения Тиц и Pr Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|