Найти в Дзене
Электроник ОПГЭ

Помигаем светодиодами на PIC24 используя ШИМ и таймеры. продолжение 2 (soft)

ссылка на -> предыдущую часть

Каналы ШИМ настроены. Теперь займусь светоэффектами.

Сначала просто "бегущие огни". Для этого я предварительно подготовил Tmr3. Займусь обработкой прерывания этого таймера. Прописываю функцию прерывания до главной функции.

Прерывание Т3 начальный вариант
Прерывание Т3 начальный вариант

Здесь я сначала сбрасываю флаг прерывания. Потом меняю скважность каналов записывая значение скважности минимальные или максимальные. "Зажигаются" те каналы , где соответствующий бит переменной "sdvig" равен "1" . В условии использую логическое побитовое "И" с расчетом, что в последствии можно было "зажигать" одновременно больше одного канала. В последней строке сдвигаю биты влево (бегущие огни) , обнуляю старшие ненужные биты и закольцовываю первых три бита.

В настройках Tmr3 не забываю разрешить прерывание IEC0bits.T3IE = 1. Генерирую исполняемый файл, запускаю симуляцию, получаю картинку на "осциллографе":

Бегущие огни
Бегущие огни

Скачок на видео - это потому что GIF-ка. Реально все нормально.

Далее настрою обработку прерывания Tmr4. Он у меня отвечает за псевдоаналоговый сигнал. Решил использовать функцию синус. :

Прерывание Т4 начальный вариант
Прерывание Т4 начальный вариант

Сбрасываю флаг. Период функции sin делю на 20. Получится ступенчатое изменение яркости. При 20 будет на вид достаточно плавно. Значение функции sin меняется от -1 до +1. Нам надо что бы от нуля до +1. Для этого прибавлю 1 - это перенесет значение в диапазон от 0 до +2. Затем делю на 2. Чтобы был эффект "бегущей волны" , сдвину аргумент sin для каждого канала по фазе на треть окружности (аргумент в радианах ). Полученные коэффициенты умножаю на длительность периода ШИМ. Получаю скважности для каналов. Контролирую границы. Присваиваю значения регистрам скважности.

Иду в настройки таймеров. Разрешаю прерывание IEC0bits.T4IE = 1 и отключаю прерывание IEC0bits.T3IE = 0 . Генерирую исполняемый файл, запускаю симуляцию, получаю картинку на "осциллографе":

Бегущая волна.
Бегущая волна.

Видно, что виртуально работает.

Пока достаточно. В следующий раз планирую сделать управление режимами.