РадиоКот :: Шим для начинающих – программный шим, практическое применение на примере Tiny13a. Часть 2.
Например TDA7294

РадиоКот >Статьи >

Теги статьи: Добавить тег

Шим для начинающих – программный шим, практическое применение на примере Tiny13a. Часть 2.

Автор: asw
Опубликовано 21.12.2011
Создано при помощи КотоРед.

Данная статья есть продолжение ранее выложенной статьи о аппаратном шим. В ней будет рассмотрен один из способов формирования шим программным путём. Это целесообразно например в случаях, когда не хватает каналов аппаратного шим. Но при этом есть и минусы, например если выставить программно максимальную частоту шима, то контроллер не будет успевать сделать что-то ещё.

В чём заключается практическое применение в данной статье – будет сделано регулирование яркости 3х цветного светодиода (мощный, 3вт) и получение оттенков цветов. В Tiny13a аппаратных всего 2 канала, потому вариант программно формировать 3 канала регулировки вполне приемлем (хотя можно было и программно-аппаратный сделать).

Итак, как многие догадываются (наверно), девайс будет представлять из себя лампу настроения (можно ознакомиться в интернете что это, если кто не знает). Возникает вопрос, каким же образом получить цвета?  Для этого открываем любую программу для обработки изображений (у меня это Paint.Net) и открываем цветовую палитру. В ней есть ползунки изменения доли каждого цвета, прокручивая которые получаем нужный.  



Меняем доли цвета и смотрим на цветовой круг, нам нужно чтобы наши цвета изменялись по кругу, соответственно так получится полная палитра (кроме белого) с чистыми красным, зелёным и синим цветами.

Из сказанного выше следует такой алгоритм – зажигаем красный, зажигаем зелёный, тушим красный, зажигаем синий, тушим зелёный, зажигаем красный, тушим синий (всё это естественно плавно, кстати для изменения плавно цветов «таблиц совместимости в восприятием глазами» городить не нужно, т.е. значения скважности меняем линейно)

Собственно сам шим (а может сама, модуляция же). Идея состоит в том, чтобы с определённой частотой вызывать прерывание (в данном случае TIM0_COMPA ; совпадение таймера/счётчика 0. Канал A) и в нём сверять условие   - если достигнут текущий уровень яркости (скважности), то выводим всё остальное время в порт логический ноль, до наступления этого условия логическую единицу. Для трёх каналов понадобится 3 переменные (3 регистра). У меня они называются соответственно  brightness_red, brightness_green, brightness_blue.  Текст обработчика:

TIM0_COMPA:

push temp

in temp, sreg

push temp

inc counter_interrupt

inc counter_brightness                  ;инкремент счётчика достижения яркости

cp counter_brightness, brightness_red   ;сравнение с установленным уровнем яркости, пока не достигло выводим в порт 1

brsh cbi_portb0                         ;если достиг, выводим в порт 0

sbi portb, 0

cbi_out0:

cp counter_brightness, brightness_green ;сравнение с установленным уровнем яркости, пока не достигло выводим в порт 1         

brsh cbi_portb4                         ;если достиг, выводим в порт 0

sbi portb, 4

cbi_out1:

cp counter_brightness, brightness_blue  ;сравнение с установленным уровнем яркости, пока не достигло выводим в порт 1         

brsh cbi_portb2                         ;если достиг, выводим в порт 0

sbi portb, 2

cbi_out2:

pop temp

out sreg, temp

pop temp

rjmp out_3

cbi_portb0:

cbi portb, 0

rjmp cbi_out0

 

cbi_portb4:

cbi portb, 4

rjmp cbi_out1

 

cbi_portb2:

cbi portb, 2

rjmp cbi_out2

out_3:

reti

Написано кривовато, но работает (в 1й статье предупреждал и сейчас тоже скажу, что не программист, хотя вообще неизвестно кто).

Следует заметить одну особенность, а именно здесь можно использовать младшие РОН, что весьма приятно, ибо можно сэкономить старшие (вы наверно в курсе, что младшим «обрезаны» по допустимым командам, например нельзя сравнить содержимое такого РОН с числом командой CPI). Собственно как видно, уровни яркости сравниваются со счётчиком достижения оной, зовут его counter_brightness. Далее просто для каждого канала смотрится выполнение условия командой BRSH (перейти если равно или больше) и выбирается исход – вывести в порт 1 или 0. Так собственно и формируется сигнал ШИМ. Не трудно заметить, что, если менять число в переменных brightness_red, brightness_green, brightness_blue, то можно регулировать яркость свечения каждого канала раздельно. На реализации алгоритма управления цветами останавливаться не стану, в исходнике есть комментарии, надеюсь будет более менее понятно. Да, ещё важный момент, переменная counter_interrupt определяет задержку для скорости изменения яркости (в программе в главном цикле в 2х местах она, изменять можно оба числа для сравнения). По сути она считает кол-во прерываний, как дойдёт нужное кол-во, так меняем яркость канала выбранного.

Схема устройства:



Небольшое пояснение к схеме. Сам контроллер питается от стабильных пяти вольт, светодиоды (аноды) подключаются к отдельному источнику (может у кого лента и тп), можно и от того же источника что и контроллер питать., но при этом не стоит забывать о фильтрации (например если бы это была светомузыка, то от скачков тока через мощные диоды контроллер может виснуть, LC фильтр по питанию решит проблему). Если использовать обычный 3вт RGB диод, то целесообразно питать схему от одного источника на 5 вольт (импульсного), тем самым уменьшим потери на резисторах R4, R5, R6 (токозадающие, рассчитываются по закону Ома для светодиодов отдельно, не забываете, что падение напряжения на кристаллах 3х цветного диода разное), соответственно уменьшив их размеры и размеры всего устройства в целом.  Полевые транзисторы любые N канальные, взяты с материнских плат. Фьзы выставить на 9,6 мгц, CKDIV снять галочку (деление отключить), больше ничего трогать не надо. Наблюдение - если зажигать один светодиод, то на очень малой скорости изменения яркости заметно мерцание на самом низком её уровке, не понял с чем связано, если пояснит кто буду рад. Но так как в любой момент времени 1 светодиод горит всегда, то этого мерцания не заметно. Частота ШИМ получилась вроде 280гц (не помню, месяц прошёл уже или больше).

Печатная плата не делалась, собиралось всё на макете только для отладки.  Думаю что изготовить свою не составит труда, т.к. деталей нет почти. Удачных конструкций.


Файлы:
Схема в SPlan 7.0
Схема
Проект в AVR Studio


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

42 2 1
3 1 0