|
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 27
|
||||||||||||||||
Оптимизация для повышения частоты ШИМ29.10.2020, 20:37. Показов 3216. Ответов 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,367
|
|
| 13.12.2020, 14:53 | |
|
Может и не в тему.... делал я аппаратный шим для ругулировки подстветки светодиодной ленты. Тоже кстати на 2313. И был эффект мерцания, то есть так не видно, а когда перефирийным зрением смотришь..... да, типа надо бы частоту поднять. А как ее поднять то? А очень просто - я счетчик сделал не ++, а +2, то есть цикл стал считаться в два раза быстрее. Счетчик тот который у автора cnt.
0
|
|
| 13.12.2020, 14:53 | |
|
Измерение частоты и скважности ШИМ (Infineon XC2000) Программа для понижения/повышения частоты работы процессора? Оптимизация кода для повышения скорости выполнения? Оптимизация частоты ШИМа для управления приводами робота. Для повышения Тиц и Pr Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|