TLC5940 плавное затухание светодиодов.
- Войдите на сайт для отправки комментариев
Пнд, 08/04/2013 - 20:40
Суть проблеммы. Понять принцип построения алгоритмов эффектов представленного на данном видео (специально с привязкой ко времени даю ссылку)
Как мы видим на видео светодиоды плавно начинают гаснуть. При этом значение яркости разное для отдельных светодиодов. (поправте если не правильно рассуждаю.)
Пока что я понимаю принцип плавного зажигание и затухания для каждого светодиода в последовательности. Привожу свой код.
#include "Tlc5940.h" //количество int Leds = 16; //маскимальная яркость const int maxLight = 4095; //задержка ШИМ int delPWM = 10; //шаг наращивания яркости int stepPWM, stepPWMP; void setup() { Tlc.init(); } void loop() { for (int i=Leds-1; i>=0; i--) { stepPWMP=1; for (int j=0; j<=maxLight; j=j+stepPWMP) { Tlc.set(i,j); Tlc.update(); delay(delPWM); stepPWMP+=2; } } for (int i=Leds-1; i>=0; i--) { stepPWM=stepPWMP; for (int j=maxLight; j>=0; j=j-stepPWM) { Tlc.set(i,j); Tlc.update(); delay(delPWM); stepPWM-=2; } } }
Да, для каждого led задается своя яркость, тем самым можно делать разные эффекты.
С указанной Вами библиотекой у меня толком ничего не получилось (может, плохо старался) - частота мерцания была видна не вооруженным взглядом и была очень зависима от внешних факторов (температура, наличие рядом других эл. устройств). На каком-то этапе плюнул на эту либу и работал по документу https://sites.google.com/site/artcfox/demystifying-the-tlc5940, плюс, рекомендую посмотреть на http://www.ti.com/lit/an/slva280/slva280.pdf. После этих 2-х документов, проблемы с tlc5940 у меня закончились.
ЗЫ: Вобще, стоит почитать даташит. Хотя бы первую страницу. Функционала в этой микрухе очень много
Можете какой-нибудь свой примерчик кинуть? В даташитах ничего не понимаю.
Могу, но для понимания лучше, все-таки, почитать Demystifying-the-TLC5940.pdf. Там тупо, по шагам, человек все раскладывает по полочкам (лучи добра ему в поддержку). Начинает с самого простого примера и с нарастающей сложностью и новыми фичами двигается по примерам.
Я остановился на 7 примере из 9-ти. Дополнительного функционала мне было уже не нужно. Далее, адаптировал его под код компиляцию в arduino ide. Какой-то из прошлых игрушечных примеров выглядит так:
[tlc5940.ino]
[ch7_1.ino]
Какой именно эффект дает, уже не вспомню :) . Но он не сложно меняется путем изменения алгоритма в методе loop. Основная функция: TLC5940_SetGS(c, cl); Задает в каком канале какая яркость должна быть. В цикле по всем каналам можно задавать любой эффект.
Но, рекомендую смотреть в доку, потому как там и схема подключения tlc обозначена. А ноги для подключения должны быть определенными (детали там же). Ну и CKOUT фьюз надо поставить:
Спасибо за информацию буду пробовать. Заметил уже отличие. В ардуиновской библиотеке пин DCPRG к + подтягивается, а здесь на ножку МК.
Да, зачем-то была комментирована следующая строка: volatile uint8_t gsUpdateFlag;
Если ее открыть, то компилируется нормально
Да, зачем-то была комментирована следующая строка: volatile uint8_t gsUpdateFlag;
Если ее открыть, то компилируется нормально
Да я разобрался с этой ошибкой. Но все равно вопрос остается открытым по поводу эффектов с того видео, который я привел как пример. Как нужно построить цикл для его достижения?
Ну, это можно уже и на домашнее задание оставить :)
А там несколько эффектов, насколько я помню. У меня сделан один - эффект плавного нарастания свечения led. Начинает зажигаться с той стороны, где сработал датчик.
В рабочем проекте код организации зажигания/гашения выглядит так:
Если, конечно, Вам не лень разбирать и адаптировать его под себя. В приведенной функции установкой ledLightMode (значения: 0, 1) контролируется действие - зажигание/гашение. Через ledDirection (0, 1) направление, в котором зажигаются или гасятся led. Если поставить DEBUG_MODE=1, то все начинает крутиться в цикле.
На мой взгляд, проще на какой-нибудь макетке в живую щупать и менять, оценивая результат, начиная с простых примеров
А кварц вы на 20MHz ставили или на 18. Я почитал автор пишет про эти кварцы в readme.
На 16. Его достаточно