|
|
![]() ![]() |
|
|
![]() ![]() ![]() ![]() |
|
Опции темы | Поиск в этой теме |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]()
хорошо, когда ШИМ 16-ти битный и скоростной.
но что делать, если мы имеем всего 8-м бит? действительно, на низких значениях разница между соседними ступеньками очень велика, к примеру, 1:255 дает ~0.4%, 2:255 уже ~0.8%. т.е. соседние значения отличаются в два раза... а что делать, если нам надо, чтоб следующее значение было, скажем 0.5%? есть несколько решений, каждый со своими достоинствами и недостатками: метод 1: "двойная модуляция". мы программно делаем так, чтоб на три 1:255 цикла приходился один 2:255 получаем ~0.5%, шаг 0.1%, плюс дрожание выходного сигнала, плюс сложность программной реализации данного решения на фоне выполнения других задач... метод 2: двигать не только уровень ШИМ, но и значения уровня перезагрузки счетчика. к примеру, если первое значение- 1:255, а второе- 1:254 дадут шаг ~0.0016% ! таким образом, подбирая пары PWMLEV и PWMTOP(давайте так их обзовем), мы можем существенно улучшить дискретность. у метода тоже есть недостатки: частота будет немного плавать это раз, и непонятный способ поиска нужных(и адекватных) пар для получения нужного выходного уровня. простое решение всегда есть! простейший алгоритм: сначала расчитываем значение PWM, затем под него значение PWMTOP ![]() как это будет выглядеть на си для авр: #define PWMST 1000 // сколько шагов надо unsigned int outPWM; // требуемый выходной уровень, от 0 до PWMST unsigned char PWMLEV,PWMTOP; PWMLEV=((unsigned long)outPWM*255)/PWMST; PWMTOP=((unsigned long)PWMLEV*PWMST)/outPWM;// по хорошему нужна проверка, что PWMLEV !=0 !!! OCR1A=PWMLEV; OCR1C=PWMTOP; у приведенного алгоритма расчета тоже есть свои недостатки, это применение 32-битной математики и некоторое ухучшение точности подбора при высоких значениях. что получаем, для примера: outPWM OCR1A OCR1C что будет по выходу 35 8 228 35 36 9 250 36 37 9 243 37 38 9 236 38 39 9 230 39 40 10 250 40 41 10 243 41 42 10 238 42 43 10 232 43 44 11 250 44 45 11 244 45 46 11 239 46 47 11 234 47 48 12 250 48 300 76 253 300 301 76 252 301 302 77 254 303 303 77 254 303 304 77 253 304 305 77 252 305 306 78 254 307 307 78 254 307 308 78 253 308 309 78 252 309 310 79 254 311 311 79 254 311 312 79 253 312 видно, что при значениях больше 30.1% реальные выходные значения начинают немного гулять, при сохранении общей монотонности. но, с другой стороны, при больших значениях дискретность уже не так влияет... |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Нубас
Регистрация: 29.06.2011 Последняя активность: 19.02.2022 20:35
Сообщений: 784
Сказал(а) спасибо: 73
Поблагодарили: 219 раз(а) в 102 сообщениях
|
![]()
ОС по току на светодиоде я сделал на микроконтроллере. Так вот у меня тоже были дикие "ступеньки" там где он должен был светить ровно.
Применил как раз первый метод, вовсе он много не отнимает времени у проца, нет там и 32-битной математики. Я там сделал 256 "градаций" между реальными "ступеньками". У меня тупо генерились 256 прерываний во время одногого цикла ШИМ, входя в кажное я смотрю сколько у меня дробная часть (0 - 255), если ещё не дотикали до 100 (к примеру) то в OCR1A, OCR1CВ без изменений иначе (OCR1A, OCR1CВ) + 1, таким образом без затрат проц. времени имею суперплавный ШИМ. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
|
Консультант
![]() Регистрация: 15.11.2010 Последняя активность: 16.03.2025 10:51
Сообщений: 7980
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях
|
![]() Цитата:
А вот интересно, в той-же 85й тиньке есть два канала ВЧ ШИМ. По идее с помощью двух выходов, и соответствующих делителей, можно сделать полноценный 16-ти битный ЦАП... Или я туплю ![]() |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Консультант
![]() Регистрация: 15.11.2010 Последняя активность: 16.03.2025 10:51
Сообщений: 7980
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях
|
![]() Цитата:
250кГц/256=976,5625Гц - это пульсации которые пролезут через выходной фильтр на светодиод. И прерывания на частоте 250кГц скушают почти все процессорное время. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Опаньки
Регистрация: 23.10.2011 Последняя активность: 29.08.2024 20:30
Сообщений: 1058
Сказал(а) спасибо: 110
Поблагодарили: 271 раз(а) в 108 сообщениях
|
![]()
оформить и на хабр )
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
|
Нубас
Регистрация: 29.06.2011 Последняя активность: 19.02.2022 20:35
Сообщений: 784
Сказал(а) спасибо: 73
Поблагодарили: 219 раз(а) в 102 сообщениях
|
![]()
AVSel,чтот заврался я совсем, у меня каждое шимовское прерывание идёт коррекция шима, 256 коррекций в зависимости от того какая цифра "после запятой", либо шим без изменений, либо шим+1. Получается 62500 прерываний в секунду... по 256 тактов эту коррекцию, ну ещё проц другими делами занят, по этому посмотрим сколько у меня .., а у меня выходит 8 тактов на короткий вариант и 11 на самый длинный.
Цитата:
а использовать деление на СИ это вот уже стрёмно, думаю там не один десяток команд в одной операци задействован, да ещё и в цикле... [Исправлено: putmannn, 12.01.2012 в 20:11] |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.04.2011 Последняя активность: 24.01.2025 00:06
Сообщений: 113
Сказал(а) спасибо: 4
Поблагодарили: 5 раз(а) в 5 сообщениях
|
![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
|
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]() Цитата:
![]() [Исправлено: ka-pex, 13.01.2012 в 08:21] |
|
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]() Цитата:
при задействовании плл(250кГц шим) и работе проца на 1МГц(энергии жалко ![]() а по поводу деления- все не так плохо, да еще и цикл там не такой частый нужен. по второму методу: там есть еще один интересный нюанс, можно ограничить PWMTOP меньшим числом, скажем в первой формуле заменить 255 на 160. при максимальных значениях шим ступенька увеличится немного, но шим у нас будет уже 400кГц ![]() |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
|
Консультант
![]() Регистрация: 15.11.2010 Последняя активность: 16.03.2025 10:51
Сообщений: 7980
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях
|
![]() Цитата:
![]() А можно наверное и двухканальный импульсник сделать, на младшем канале поставить индуктивность в 256 раз больше. Точность индуктивностей конечно совсем никакая... [Исправлено: AVSel, 13.01.2012 в 11:29] |
|
![]() |
![]() ![]() |
Поблагодарили: 1 раз |
DooMmen (16.03.2014)
|
![]() |
![]() ![]() |
Нубас
Регистрация: 29.06.2011 Последняя активность: 19.02.2022 20:35
Сообщений: 784
Сказал(а) спасибо: 73
Поблагодарили: 219 раз(а) в 102 сообщениях
|
![]()
ka-pex,Думаю для восприятия яркости светодиода глазом не критичным будет как 1-й, так и 2-й метод. И не могу не согласиться .. если у Вас тактовая 1 мегагерц + 250 КГц ШИМ, то это да, жалко времени проца.. =)
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Консультант
![]() Регистрация: 15.11.2010 Последняя активность: 16.03.2025 10:51
Сообщений: 7980
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях
|
![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
|
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]() Цитата:
![]() |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8159 раз(а) в 2385 сообщениях
|
![]()
Дабы не обозвали меня некропостером - заранее оправдываюсь: Я тут недавно, случайно набрёл на тему, и мне действительно есть что тут написать...
С данной проблемой тоже столкнулся давным давно, но капитально взяться за решение пришлось, как ни странно, не в преобразователе, а в RGB индикаторе, где необходимо иметь одновременно и хорошее разрешение, и хорошую частоту. Чтоб картинка не разваливалась в движении, и не дребезжала на минимальных значениях яркости компонент. При этом модуляция там программная, т.к. у 8-ми лапой тиньки не напасёшься ни выводов, ни каналов ШИМ. А программа сами понимаете - быстро дёргать лапками не умеет и есть просит. Решение оказалось простым - Сигма Дельта Модуляция, она же Плотностно-Импульсная. У неё есть чудесное свойство вытеснять шум квантования в ВЧ область, что очень хорошо согласуется с нашими задачами. К примеру у нас есть 8 бит ШИМ с частотой 250кГц. Достаточно потратить всего несколько тактов на период и выделить один регистр под переменную, чтоб программа реализовала ПИМ последнего бита аппаратного ШИМ: Код:
clr R20 add R15, R18 rol R20 add R20, R19 out OCR0A, R20 Что касается RGB индикации - такой алгоритм хорошо работает уже на 10кГц, это без использования аппаратного ШИМ и съедая около 9-ти тактов на все 3 канала. Поэтому наверное и юзают СДМ в звуковых применениях, т.к. он даёт прекрасные результаты. Только там система сложнее. СДМ принято рассматривать как БИХ фильтр, у которого как и у всех фильтров есть свой порядок и апроксимация. Так вот я привёл пример фильтра первого порядка с критическим затуханием (если проще - эквивалент RC-фильтра), а люди строят более крутые фильтры, как правило второго порядка и с апроксимацией Баттерврта или Чебышева... Надеюсь чем-нибудь пригодился ![]() [Исправлено: INFERION, 07.04.2013 в 18:18] |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]()
а метод 1, описанный в топике не он и есть, просто другими словами?
![]() к сожалению к аппаратному 250кГц(64мгц тактовая) его не прикрутить ![]() ну а про оверсемлинг АЦП вопрос интересный, но спорный ![]() хм, в указанном коде при значении больше 0хFF00 будут иметь место пропуски целых периодов... [Исправлено: ka-pex, 17.04.2013 в 01:06] |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8159 раз(а) в 2385 сообщениях
|
![]()
Метод 1, описанный в топике, похож. Вообще всё оно похоже, разница только в реализации и характеристиках. А идея в основе похожая.
Метод 2 описанный в топике - смесь ШИМ с ЧИМ. Если его результат разложить в спектр и изучить - что получится? Будет аккуратный голубой шум, или что-то похожее на скрип не смазанной калитки? А как синхронизировать ШИМ со всей остальной требухой, если у него частота гуляет? С таким механизмом вполне может получится, что и оверсемплинг АЦП не заработает. Это про указанный мною код? В прерывании он сжирает 11 тактов (40% ресурсов), но это стерпеть можно - оно того ещё как стоит... Работает он прекрасно, важно только найти хороший источник шума и достаточное количество семплов, и получить можно сколько угодно бит... Цитата:
Кстати, код тут на 1 инструкцию больше, чем требуется. Я у себя откопал и такую реализацию: Код:
in R9, SREG ;Over1 clr R10 ;Сигма-дельта модулятор PWM add R15, R7 adc R10, R8 out OCR1A, R10 out SREG, R9 reti [Исправлено: INFERION, 19.09.2013 в 22:52] |
|
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]()
для начала надо было сразу указать на данный момент начинающим, чтоб не отбить у них охоту
![]() далее- я дал только намек на несовершенство кода, странно, что после этого не был произведен его анализ... намекну по другому: какова будет разница по выходу при входных значениях 0b10000000 и 0b11000000(в битовом представлении, имеется ввиду младший байт PWM). |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]()
а про оверсейплинг вообще тема отдельная. метод дает некое повышение разрядности, но, применительно к данному чипу и схеме это профанация, ибо там гуляет все в зависимости от времени года и его настроения
![]() |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
||||
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8159 раз(а) в 2385 сообщениях
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
[Исправлено: INFERION, 20.09.2013 в 02:23] |
||||
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Увлеченный
Регистрация: 24.12.2011 Последняя активность: 29.10.2020 10:49
Сообщений: 186
Сказал(а) спасибо: 2
Поблагодарили: 26 раз(а) в 10 сообщениях
|
![]()
хм, как вижу из кода, дополнение(переполнение) будет происходить каждый второй проход в обоих случаях, т.е. по выходу будет одно и тоже, нет?
|
![]() |
![]() ![]() |