Свежие обсуждения
Микроконтроллеры

3 канальный ШИМ на Tiny15L?

1 2 5

А зачем ШИМ?
Если "скоро Новый год", то, скорее всего, управлять будем лампами накаливания ...
может лучше фазовый метод управления яркостью прицепить? (синусоиду резать)

256 градаций ШИМ не много, ибо Заложил в алгоритм еще таблицу яркостей под глаз (нелинейный ШИМ).

 

Alexey: Что бы "догадывалка" развивалась!
Да поздновато мне её уже развивать. Спасибо, что откликнулись.

AHTOXA: 256 градаций яркости - не многовато?
Не думаю. При использовании табличной функции остается около 200.

AHTOXA: Прикинем максимально возможную частоту ШИМ:
у меня при тактовой 1,6МГц получилась ~ 200Гц. (Таймер тактируется 8*1,6=9,6МГц) - меня устраивает.

AndryG: Если "скоро Новый год", то, скорее всего, управлять будем лампами
Собираюсь управлять трёхцветными светодиодами.
Шим работает как задумано. Яркость меняется по таблице. Осталось грамотно прицепить на второй таймер обработку алгоритма изменения цветов.
Тяжеловато в этом отношении с Tiny15(без озу). Чуть что не так - переполнение программного счетчика. А может я еще не всё понимаю.

 

Как вам такой вариант 3-канального шима?


;Процедура обработки прерывания таймер1 по сравнению (10МЦ)
pwmisr: ld temp,z+ ;обновление
out portb,temp ;порта
ld temp,z+ ;новая уставка
out OCR1,temp ;для сравнения
reti ;сделано

;Процедура обработки прерывания таймер1 по переполнению (10МЦ)
eopwm: ldi temp,0 ;обнуление
out portb,temp ;порта
ldi zl,0x10 ;адрес текущего регистра уставок
ld temp,z+ ;первая уставка
out OCR1,temp ;нового периода шим
reti ;сделано

 

Хорошо, только есть два нюанса - в Tiny15 нет режимов Z+, и коэффициент заполнения ШИМа получится втрое ниже (по два холостых цикла на каждый ШИМ).

 

Вообще-то есть, вот цитата, с.6 документа 1187.

Registers 30 and 31 form a 16-bit pointer (the Z-pointer) which is used for indirect Flash memory and Register File access. When the Register File is accessed, the contents of R31 is discarded by the CPU.

Вторую часть фразы не понял. Что такое холостые циклы и откуда они взялись?

Как тут предотвратить форматирование фрагмента кода, [ pre ] чёто не работают, и как выбрать шрифт?

 

Речь не о том, что с помощью регистра Z можно получить доступ к регистрам, речь о том, что в системе команд именно ATTiny15 НЕТ команды ld rNN,Z+, есть только ld rNN,Z. Про холостые циклы цитирую даташит на Tiny15:

The Output Compare Register 1A is an 8-bit read/write register.
The Timer/Counter Output Compare Register 1A contains the data to be continuously compared with Timer/Counter1.
Actions on compare matches are specified in TCCR1. A compare match occurs only if Timer/Counter1 counts to the
OCR1A value. A software write that sets TCNT1 and OCR1A to the same value does not generate a compare match.
A compare match will set (one) the compare interrupt flag in the CPU clock cycle following the compare event.

В переводе на русский - операция сравнения TCNT1 и OCR1A выполнится только тогда, когда TCNT1 САМ досчитал до OCR1A, а не тогда, когда мы ему в ЭТОМ ЖЕ ЦИКЛЕ счета таймера подсунули в OCR1A новое значение. Проще говоря, нет никакой надежды, что между прерываниями по переполнению таймера мы получим по 3 прерывания по сравнению, мы их получим ровно ОДНО. Вот откуда берутся два холостых цикла. Впрочем, тут ситуация будет еще хуже - просто из трех ШИМов будет работать только один.

PS. Кстати, в программе молчаливо предполагается, что задержка ШИМ1 < задержка ШИМ2 < задержка ШИМ3. Мягко говоря, это - далеко не факт

 

chav1961: ...в системе команд именно ATTiny15 НЕТ команды ld rNN,Z+, есть только ld rNN,Z.

Ну вот, век живи, век учись. Придётся добавить пару INC R30 в прерывание.

chav1961: В переводе на русский - операция сравнения TCNT1 и OCR1A выполнится только тогда, когда TCNT1 САМ досчитал до OCR1A, а не тогда, когда мы ему в ЭТОМ ЖЕ ЦИКЛЕ счета таймера подсунули в OCR1A новое значение. Проще говоря, нет никакой надежды, что между прерываниями по переполнению таймера мы получим по 3 прерывания по сравнению, мы их получим ровно ОДНО. Вот откуда берутся два холостых цикла.

Ну это вы, мне кажется, погорячились. Вот мой вольный перевод

The Timer/Counter Output Compare Register 1A contains the data to be continuously compared with Timer/Counter1
Содержимое регистра OCR1A непрерывно сравнивается с содержимым Timer/Counter1.

A compare match occurs only if Timer/Counter1 counts to the OCR1A value.
Совпадение случится только тогда, когда значение таймера доходит до значения OCR1A.
(неважно, от нуля или от записанного мною значения. Кстати вот, вспомнил, в одном проекте на авр8515 на каждом периоде шим я переписывал на ходу значение OCR1A, чтобы получить сдвинутый сигнал)

A software write that sets TCNT1 and OCR1A to the same value does not generate a compare match.
Запись в TCNT1 и в OCR1A одного и того же значения не выработает сигнала совпадения.
(так никто и не записывает одного и того же значения)

Всё, труба зовёт, убегаю домой.

 

chav1961:операция сравнения TCNT1 и OCR1A выполнится только тогда, когда TCNT1 САМ досчитал до OCR1A, а не тогда, когда мы ему в ЭТОМ ЖЕ ЦИКЛЕ счета таймера подсунули в OCR1A новое значение.

По-моему, Вы неправильно поняли. Если записать в TCNT значение OCR1A, то прерывание не возникнет,да. А если записать в OCR1A значение TCNT+x, то оно естественно возникнет. Ибо таймер досчитает до этого значения.

chav1961:Проще говоря, нет никакой надежды, что между прерываниями по переполнению таймера мы получим по 3 прерывания по сравнению, мы их получим ровно ОДНО.

Соответственно, и этот вывод неверен.

В остальном - присоединяюсь

 

А я только читаю и вникаю.

 

Смысл предложения GM в том, чтобы не обрабатывать каждый тик таймера, а грузить регистр OCR1A по очереди тремя значениями величины ШИМ. Т.е. вместо 256 прерываний обрабатывать 3+1 = 4. Я считал, что менять "на лету" OCR1A к нужному эффекту не приведет, но двумя голосами "против" оказался повержен Единственная проблема - задержки ШИМ перед загрузкой в OCR1A должны быть отсортированы по возрастанию, а в паре с ними должна храниться информация о том, с какой именно ногой (или несколькими ногами, если у двух или трех каналов значения ШИМа одинаковые) эта задержка связана. Если есть желание, попробуйте реализацию таким способом