Плавный поджиг на M5451

VitaliyD
Offline
Зарегистрирован: 10.05.2013

   Доброго времени суток уважаемые форумчане, на кануне сидел со свей ардуино и мк M5451 колдовал на тему плавного поджига диодов, но ничего не вышло, в теории звучит просто, на ногу brightness пока не защелкнут Clock подаем PWM сигнал (предположительно через оператор for), но как оказалось написать на практике это для меня составило трудность (я новичок сильно не пинать)))).

    Ниже скетч взят из соседней темы "Автоматическая подсветка лестинцы но на МК 5450" хотелось бы его допилить как сделал Лукьянов с плавным поджигом. Из скетча убраны срабатывания на датчики и хотелось бы узнать как оставить включенные диоды например на 50%). Контроллер Arduino nano 328 при работе за 8-9 проходов начинают хотично светиться диоды на 2-3 сек потом снова нормально 8-9 проходов.


//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

//Задаем количество светодиодов
#define NUM_LEDS 17

const uint32_t mask = 0b11111111111111111;

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask<<i);
        delay(200);                 // задержка зажигания
      }
      delay(3000);                  // ждем 3 секунды
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask>>i);
        delay(200);                 // задержка затухания
      }
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону
      {
        MM5450(mask>>i);
        delay(200);                 // задержка зажигания
      }
      delay(3000);                  // ждем 3 секунды
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask<<i);
        delay(200);                 // задержка затухания
      }
  delay(20);
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < NUM_LEDS; i++)
  {
    if(data & (1UL<<i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 35-NUM_LEDS; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}
VitaliyD
Offline
Зарегистрирован: 10.05.2013

Неужели никто не сталкивался c PWM на LED драйверах?

sds
Offline
Зарегистрирован: 29.10.2012

Если нет явного и горячего желания сделать это именно на М5450, то посмотрите в сторону TLC5940

Jacks_d
Offline
Зарегистрирован: 31.12.2011

согласен TLC5940 отличная железяка и быстрая относительно например меги2560, TLC5940 все 16 каналов с 0 до 4095 пошагово без задержки проходит за 270 мс... но библиотека на 168/328 не даст использовать что то еще использующее таймеры(((( но ds18b20 вполне работает когда на TLC5940 ничего не передается. на канал вроде может выдать до 80 мА, ток настраивается одним резистором для всех каналов и => не нужны резисторы

VitaliyD
Offline
Зарегистрирован: 10.05.2013

дык в том то и дело прикупил уже себе m5451 в количестве 2х штук не выбрасывать же.

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Надо ж совпадение как раз использую 328, видать и делеи придется применять, надо подумать приемлемо ли это. Однако глянул в сторону библиотеки m5451 кажется зовут lightduino http://code.google.com/p/arduino-m5451-current-driver/

так и не разобрался мануала как такового нет или мож я туплю (((

illustrarium
Offline
Зарегистрирован: 29.01.2015

Уважаемый, я понимаю, что прошло 2 года, но разобрались ли вы с этим вопросом? Я просто сам сейчас копаю и пока никак не накопаю...