Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Беспорядочное включение светодиодов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
at90
Появилась такая проблемка:
Есть 13 8 битных шим каналов. На каждом шиме висит по светодиоду.
Ндадо их беспорядочно включать. На проблема состоит в том что
зажигание должно происходть плавно плавно зажечь и плавно потушить.
Шимы 8 битные.
Есть ли какие нибудь решения, кроме как расписать таблицу. У больно сдоровая она получается. wacko.gif
arttab
Обработчик плавного включения напиши. А хаос можно по разному создать. Помниться у Хоровица и Хила в "исскуство схемотехники", по цифре, был аппаратный генератор на сдвиговом регистре с обратными связями.
at90
Цитата(arttab @ Aug 19 2005, 08:34)
Обработчик плавного включения напиши. А хаос можно по разному создать. Помниться у Хоровица и Хила в "исскуство схемотехники", по цифре, был аппаратный генератор на сдвиговом регистре с обратными связями.
*


Обработчик плавного включения написан. Я могу зажечь любой светодиод
меняя значения шима от 0 до255 и обратно.

Мне нужно сделать чтобы светодиоды работали как бы назависимо. Они быстро загорались другие медленно. Воббщем чтобы создавался эффект
ХАОСА. biggrin.gif
nml
Цитата(at90 @ Aug 19 2005, 08:58)
Мне нужно сделать чтобы светодиоды работали как бы назависимо. Они быстро загорались другие медленно. Воббщем чтобы создавался эффект
ХАОСА. biggrin.gif
*

Генератор случайных чисел - вот выход... Соответственно должен быть массив требуемых яркостей и массив текущих. При генерации какого-то числа (чисел) требуемая яркость устанавливается в 0 или максимум, в прерывании тимера - текущая +-1 едет к требуемой. Получается нечто типа заставки "звездное небо" Нортона.

Во всяком случае, именно так я делал когда-то когда решил освоить PIC (правда, на этом девайса все и закончилось - но каждый Новый год оно висит на окне и исправно моргает светодиодами... много там было режимов) :-)
lolikandr
Когда я придумывал такой алгоритм, то делал следующее. Прописывал для каждого канала период повторения, длительность, скорость нарастания, спада. Можно добавить случайную флуктуацию периода повторения или чего-то еще. То есть хранить в ПЗУ надо не более двух-шести параметров для одного канала. А уж в программе отсчитывать время и генерировать непосредственные значения для ШИМ. Правда при этом нужно столько счетчиков времени в ОЗУ, сколько есть каналов.
lolikandr
А по поводу гирлянды на Новый Год - я поступил проще. Собрал несколько медленных генераторов на логических микросхемах и повесил их на транзисторные ключи через RC цепочки, получилось много каналов с плавным включением-выключением и разной частотой cool.gif .
at90
Цитата(nml @ Aug 19 2005, 09:13)
Цитата(at90 @ Aug 19 2005, 08:58)
Мне нужно сделать чтобы светодиоды работали как бы назависимо. Они быстро загорались другие медленно. Воббщем чтобы создавался эффект
ХАОСА. biggrin.gif
*

Генератор случайных чисел - вот выход... Соответственно должен быть массив требуемых яркостей и массив текущих. При генерации какого-то числа (чисел) требуемая яркость устанавливается в 0 или максимум, в прерывании тимера - текущая +-1 едет к требуемой. Получается нечто типа заставки "звездное небо" Нортона.

Во всяком случае, именно так я делал когда-то когда решил освоить PIC (правда, на этом девайса все и закончилось - но каждый Новый год оно висит на окне и исправно моргает светодиодами... много там было режимов) :-)
*



Надо попробовать такой алгоритм. только в таймере у меня шим сидит.
CDT
Простейшая таблица хаоса - программный код, если его достаточно много и читать его сдвигаясь и повторяясь по ряду простых чисел. По мере обращения можно еще инвертировать, переворачивать и пр.
Когда-то мы так быстро и успешно память тестировали.
at90
Цитата(CDT @ Aug 19 2005, 12:45)
Простейшая таблица хаоса - программный код, если его достаточно много и читать его сдвигаясь и повторяясь по ряду простых чисел. По мере обращения можно еще инвертировать, переворачивать и пр.
Когда-то мы так быстро и успешно память тестировали.
*


Так тогда светодиоды будут просто мигать. А мне нада плавные переходы
BVU
Цитата(CDT @ Aug 19 2005, 15:05)
Так тогда светодиоды будут просто мигать. А мне нада плавные переходы .
*


В этом случае необходимо иметь массив значений состояния на каждый светодиод хранящий так информацию об интенсивности(яркости) свечения, так и о "векторе" свечения(увеличение свечения или уменьшения).
Я думаю это не займет слишком много ОЗУ, тем более, что массив можно организовать оптимально, так же можно использовать битовую структуру а это даст еще большую экономию оперетивной памяти.
at90
Цитата(BVU @ Aug 19 2005, 14:42)
Цитата(CDT @ Aug 19 2005, 15:05)
Так тогда светодиоды будут просто мигать. А мне нада плавные переходы .
*


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



Решил данную проблему таким образом:
Расписал вручную таблицу синуса, т.е. значения от 0 до255 255..0.
приэтом проститав плавное загорание и тушение светодиода. Так как данная зависимость не линейная.
На каждый канал завёл по три байта: первый байт смешение в таблице,
второй байт делитель частоты таймера, третий байт счётчие какнала.
Работает так:
устанавливаем счетчики канала равным делителям канала.
По каждому тику таймера декрементируем счётчики. как только счетчик равен 0 инрементируем смешение в таблице. Приравниваем счётчику значения делителя.
Заносим в шим значание из таблицы синуса.
pwm[i]=sin_table[смещение];
Таким образом происходит рассинхронизация шимов.
Перемещая делители по кругу или по случано мы получим хаотичное зажигание светодиодв smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif
andrei0404
Чет я не понял зачем таблица синусов?
Oleg_IT
Ниже код rand() из С++ Visual Studio. Переписать её под asm не сложно. Вся суть после return.

int __cdecl rand (
void
)
{
#ifdef _MT

_ptiddata ptd = _getptd();

return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );

#else /* _MT */
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif /* _MT */
}
at90
Цитата(Oleg_IT @ Nov 12 2005, 13:43) *
Ниже код rand() из С++ Visual Studio. Переписать её под asm не сложно. Вся суть после return.

int __cdecl rand (
void
)
{
#ifdef _MT

_ptiddata ptd = _getptd();

return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );

#else /* _MT */
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif /* _MT */
}


Таблица синусов это распианная таблица яркостей светодиодов вручную. от 0 да255 и от 255 до 0.
Типа один полупуриод. Каждый шим канал с определённой скороти проходит по этой таблице и мы тогда получаем разное изменения скорости яркости на всех каналах. Изменяя скорости покугу для всех каналов получаем беспорядочное изменение яркостей.(хаос). И ненада никаких случайных генераторов. С генеоатором плавно не получится. Еслиб мне нада были беспорядочные вспышки-тогда генератор подходит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.