|
|
|
|
В предверии Нового года есть задумка сделать автомат световых эффектов на AVR Tiny15L. Понадобился программный 3-х канальный 8-ми битный ШИМ с независимой регулировкой по каналам. Поскольку в программировании МК я себя отношу к "немного продвинутым начинающим", нужна "помощь зала". Подскажите алгоритм решения задачи. Примеры приветствуются. Проще конечно найти камень с 3-мя аппаратными ШИМами, но выбор МК определен наличием небольшой партии Tiny15. |
|
|
Первый способ - в лоб: Прерывание от таймера, три счётчика, три переменных для яркости. В прерывании от таймера счётчик увеличивается от 0 до, скажем, 100. Каждый счётчик сравнивается с яркостью. Если меньше - ножка вкл, если больше - выкл. И телемаркет counter1++; if (counter1 > 100) counter1 = 0; if (counter1 < brightness1) pin1 = 1; else pin1 = 0;
И так по всем трём (или больше) каналам. |
|
|
В каком-то топике этот вопрос разбирался. Коротко суть: 1. Заводите шесть байт памяти (6 регистров). В три из них пишете желаемую длительность импульса, три будут счетчиками. 2. На один из таймеров вешаете обработчик прерываний, который на каждом тике прерывания инкрементирует байты счетчиков. После инкремента выполняете сравнение каждого счетчика с величиной желаемой длительности. Если она больше - на выход "ШИМа" выдаете лог.0, иначе - лог.1. Все. Длительность импульса измеряется в "штуках" тиков таймера. Ее можете динамически изменять, просто записав в байт длительности нужное значение. Никаких блокировок при этом делать не надо. Основная программа, разумеется, должна при этом выполняться с разрешенными прерываниями PS. АНТОХА опередил |
|
|
AHTOXA: counter1++;... На С не смогу написать по двум причинам: 1. Плохо разбираюсь. 2. У 15 тиньки нет озу, компиляторы С её не поддерживают. Мне проще на АСМе, т.к. свои поделки пишу на Algorithm Builder. В любом случае, спасибо за инфу. |
|
|
smg123: свои поделки пишу на Algorithm Builder. Что-то типа того |
|
|
Alexey: Что-то типа того Нет. Работать как шим не будет. Если получится - выложу проект. (Если это кого-то заинтересует). Заложил в алгоритм еще таблицу яркостей под глаз (нелинейный ШИМ). Что-то начинает уже проясняться. Не могу понять только где? |
|
|
smg123: Нет. Работать как шим не будет. С какого перепугу? Естесно, это не все . |
|
|
Alexey: С какого перепугу? Естесно, это не все МК никого не боится, он делает то, что ему поручили. И если это не все, то зачем мне догадываться о Ваших невысказанных идеях? Я вот по вышеупомянутому chav1961 алгоритму набросал - работает.
|
|
|
smg123: И если это не все, то зачем мне догадываться о Ваших невысказанных идеях? Что бы "догадывалка" развивалась! Мои идеи, как и Марксизм, не догма, а руководство к действию! |
|
|
smg123: Я вот по вышеупомянутому chav1961 алгоритму набросал - работает. 256 градаций яркости - не многовато? Если да, то добавьте запись нуля в счётчик, если он больше заданного числа. Просто частота ШИМа будет равна частоте таймерного прерывания делённой на макс. значение счётчика (в вашем случае - 256). При трёх каналах и приемлемой частоте ШИМ банально может не хватить скорости контроллера. Прикинем максимально возможную частоту ШИМ: 8МГц рабочая частота контроллера; Процедура прерывания выполняется, скажем, за 40 тактов, значит максимальная частота таймерного прерывания будет 200КГц. Делим это на 256, получается, что частота ШИМ = 780Гц. При ширине ШИМ 100 частота ШИМ будет уже 2 КГц. |
|
|
|
|