гамм-коррекция для ШИМ светодиодов

NikNik
Offline
Зарегистрирован: 08.11.2018

Доброго дня! Помогите разобраться новичку, как подставить гамма-коррекцию на шим регулировку яркости светодиода при помощи декодера. Если можно, немного кода, чтобы понять

vvadim
Offline
Зарегистрирован: 23.05.2012

блииин, опять искать хрустальные шары.....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vvadim пишет:

хрустальные шары.....

Они ведь запрещены!

Расслабился народ :(

sadman41
Offline
Зарегистрирован: 19.10.2016

Гамма-коррекция на шим-регулировку через декодер? Чего тут непонятного... надо только сказать "крекс-пекс-фекс", повернуться трижды и плюнуть через левое плечо. Потом... идти домой и ждать урожая.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

не, тут "код" посложнее нужен:

"– Слухай сюда! Положь колдобину со стороны загогулины и два раза дергани за пимпочки. Опосля чего долбани плюхалкой по кувыкалке и, кады чвокнет, – отскочь дальшее, прикинься ветошью и не отсвечивай. Потому как она в энто время шмяк тудыть, сюдыть, ёксель-моксель, ёрш твою медь... Пш-ш-ш! – И ждешь пока остынет. Остыло – подымаесся, вздыхаешь. Осторожненько вздыхаешь, про себя, шобы эта быдла не рванула! И бегишь за угол за пол-литрой." 

(C) Михаил ЗАДОРНОВ.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

NikNik пишет:

Доброго дня! Помогите разобраться новичку, как подставить гамма-коррекцию на шим регулировку яркости светодиода при помощи декодера. Если можно, немного кода, чтобы понять

Хотелось бы услышать какие-то детальки и пояснения про:

а) "светодиод". Если речь за RGB-светодиод, где их 3шт в одном корпусе, то о какой "гамма коррекции" идет речь? И в частности, в "каком направлении", поскольку они там хоть и в одном корпусе, но светят несколько в разные стороны и "белый" там .. ну очень относительное понятие.

б) "гамма коррекция" в каком интервале яркостей требуется? Но это - только после показа о каком "светодиоде" идет речь.. Там шибко нелинейная функция .. Вам с какой точностью отсыпать?

в) Чем собираетесь контролировать "гамма коррекцию"? Колориметр - имеется или так, "на глаз"? А то .. "белый цвет" .. он такой разный .. (цветовая температура зовется).

Ну в общем, рассказывайте, иначе тут гадания начнутся.

NikNik
Offline
Зарегистрирован: 08.11.2018

Спасибо! я бы хотел понять сам принцип реализации... пусть один светодиод, гамма-коррекция яркости... там кривая, как я понял однотипная ведь для всех ледов более или менее? собирается массив и подставляются из него значения яркости при ее регулировки? или через библиотеки какие?  фиг с ним с декодером, может просто на кнопке покажете синтаксис кода? что б мне зацепиться за направление мысли :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Попробуй янтарную кислоту, ну и аспирин, если желудок позволяет. Это должно снять основные симптомы похмелья.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

NikNik пишет:
я бы хотел понять сам принцип реализации... пусть один светодиод, гамма-коррекция яркости... там кривая, как я понял однотипная ведь для всех ледов более или менее? собирается массив и подставляются из него значения яркости при ее регулировки?
Я тоже хотел узнать , где Вы нашли гамма-коррекцию яркости у светодиода. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

NikNik пишет:

Спасибо! я бы хотел понять сам принцип реализации... пусть один светодиод, гамма-коррекция яркости... там кривая, как я понял однотипная ведь для всех ледов более или менее? собирается массив и подставляются из него значения яркости при ее регулировки? или через библиотеки какие?  фиг с ним с декодером, может просто на кнопке покажете синтаксис кода? что б мне зацепиться за направление мысли :)

Чтобы Вам зацепиться за направление мысли - выше мною задана кучка вопросов. Пока на них нет ответов - цепляться не за что. Крайне важно "что за светодиод", что Вы хотите от его "гамма коррекции" и т.д.

И да, "гамма коррекция мониторов" (в т.ч. led) в помощь. Она ваще-то "существует", но .. там "светодиоды" - очень специфичное понятие.. отсюда и вопросы.

Пока нет ясного изложения задачи - можно гадать о чем угодно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Люди!

У меня сегодня день покаяния и хорошее настроение! ;) я поясню, что от нас хочет ТС.

Ему нужна линейная зависимость зрительного восприятия яркости свечения от параметра регулировки.

То есть если в "скетче" написано свет на 30%, то и глаз должен видеть на 30%.

Есть прямой и точный ответ на это вопрос прям с формулой ;) !!!

1. у LED практически линейная зависимость светимости от тока;

2. средний ток через диод практически линейно зависит от коэф. заполнения ШИМ.

3. глаз имеет ЛОГАРИФМИЧЕСКОЕ восприятие яркости... да и всего остального. Все чуЙства у человека устроены логарифмически... ну, акромя жадности!

=========================

итого пусть параметр регулировки в процентах от 0 до 100.

значит при 0 - 0 ;

а при 100 - 255 ;

ШИМ в ардуино принимает значения от 0 до 255.

ШИМ = (1.057) в степени (ЯРКОСТЬ) - 1; где ЯРКОСТЬ - параметр регулировки от 0 до 100.

Напоминаю, что в Ардуино есть функция pow(x,y) возводящая в степень. Потом нужно округлить до целого вниз и использовать в analogWrite().

sadman41
Offline
Зарегистрирован: 19.10.2016

А декодер?..

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:

А декодер?..

Да-а. Тут промашка вышла. Сорри. Я думаю, что ТС просто не знает, как пишеццо "энкодер" ;).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:
Все чуЙства у человека устроены логарифмически... ну, акромя жадности!
а последняя - экпоненциально?

NikNik
Offline
Зарегистрирован: 08.11.2018

ШИМ в ардуино принимает столько, сколько нальешь... но не суть... вот немного кода... вроде работает... интересно, что на значении массива 73 и 255 яркость выдает 100 %, есть идеи с чего? косяк кода?

#include <avr/pgmspace.h>
#define CIELPWM(a) (pgm_read_word_near(gamma + a))

int brightness = 0;      // яркость LED, порядок в массиве
int fadeAmount = 2;      // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 8;     // pin 12
const int pin_B = 10;     // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
boolean buttFlag = 0;
boolean buttPower;
boolean ledFlag = 0;
unsigned long lastPress; // компенсатор дребезжания кнопки

const uint16_t PROGMEM gamma[] = {
  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    1,    1,
  1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    3,    3,    3,
  3,    3,    3,    3,    3,    3,    3,    4,    4,    4,    4,    4,    4,    4,    4,    5,
  5,    5,    5,    5,    5,    5,    6,    6,    6,    6,    6,    6,    7,    7,    7,    7,
  7,    7,    8,    8,    8,    8,    8,    9,    9,    9,    9,   10,   10,   10,   10,   10,
  11,   11,   11,   11,   12,   12,   12,   12,   13,   13,   13,   13,   14,   14,   14,   14,
  15,   15,   15,   16,   16,   16,   17,   17,   17,   18,   18,   18,   18,   19,   19,   20,
  20,   20,   21,   21,   21,   22,   22,   22,   23,   23,   24,   24,   24,   25,   25,   26,
  26,   26,   27,   27,   28,   28,   28,   29,   29,   30,   30,   31,   31,   32,   32,   33,
  33,   34,   34,   35,   35,   36,   36,   37,   37,   38,   38,   39,   39,   40,   40,   41,
  41,   42,   43,   43,   44,   44,   45,   45,   46,   47,   47,   48,   48,   49,   50,   50,
  51,   52,   52,   53,   54,   54,   55,   56,   56,   57,   58,   58,   59,   60,   60,   61,
  62,   63,   63,   64,   65,   65,   66,   67,   68,   69,   69,   70,   71,   72,   72,   75,
  75,   76,   76,   76,   77,   78,   79,   80,   81,   82,   82,   83,   84,   85,   86,   87,
  88,   89,   90,   90,   91,   92,   93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
  103,  104,  105,  106,  107,  108,  109,  110,  111,  112,  113,  114,  115,  117,  118,  119,
  120,  121,  122,  123,  124,  125,  127,  128,  129,  130,  131,  132,  134,  135,  136,  137,
  138,  140,  141,  142,  143,  144,  146,  147,  148,  149,  151,  152,  153,  155,  156,  157,
  159,  160,  161,  163,  164,  165,  167,  168,  169,  171,  172,  173,  175,  176,  178,  179,
  181,  182,  183,  185,  186,  188,  189,  191,  192,  194,  195,  197,  198,  200,  201,  203,
  205,  206,  208,  209,  211,  212,  214,  216,  217,  219,  220,  222,  224,  225,  227,  229,
  230,  232,  234,  235,  237,  239,  241,  242,  244,  246,  248,  249,  251,  253,  256,  257,
  258,  260,  262,  264,  266,  267,  269,  271,  273,  275,  277,  279,  281,  283,  284,  286,
  288,  290,  292,  294,  296,  298,  300,  302,  304,  306,  308,  310,  312,  314,  316,  318,
  320,  323,  325,  327,  329,  331,  333,  335,  337,  339,  342,  344,  346,  348,  350,  353,
  355,  357,  359,  361,  364,  366,  368,  371,  373,  375,  377,  380,  382,  384,  387,  389,
  391,  394,  396,  399,  401,  403,  406,  408,  411,  413,  415,  418,  420,  423,  425,  428,
  430,  433,  435,  438,  440,  443,  446,  448,  451,  453,  456,  459,  461,  464,  466,  469,
  472,  474,  477,  480,  482,  485,  488,  491,  493,  496,  499,  502,  504,  507,  510
};

void setup()  {
  TCCR1A = TCCR1A & 0xe0 | 2; // разрешение 9 бит
  TCCR1B = TCCR1B & 0xe0 | 0x09; // частота щим 31 250 Гц
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(3, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP); // switch
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);     // устанавливаем pin 9 как выход
  analogWrite(9, 0); // функция ШИМ , 0 % на выходе
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime;

}

void loop()  {
  buttPower = !digitalRead(3);
  if (buttPower == 1 && buttFlag == 0 && millis() - lastPress > 50) {
    buttFlag = 1;
    Serial.println("buttPower pressed");
    ledFlag = !ledFlag;
    digitalWrite(13, ledFlag);
    lastPress = millis();
  }
  if (buttPower == 0 && buttFlag == 1 && millis() - lastPress > 50) {
    buttFlag = 0;
    brightness = 0;
    analogWrite(9, CIELPWM(brightness));
    Serial.println("buttPower released");
  }

  boolean button = !digitalRead(7); // логическое значение кнопки
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) { // проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера
    if (ledFlag == 1) {
      if ((!encoder_A) && (encoder_A_prev)) { // если состояние изменилось с положительного к нулю
        if (encoder_B) {
          // выход В в полож. сост., значит вращение по часовой стрелке
          // увеличиваем яркость, не более чем до 511
          if (brightness + fadeAmount <= 511) {
            brightness += fadeAmount;
            Serial.println(CIELPWM(brightness));
          }
        }
        else {
          // выход В в 0 сост., значит вращение против часовой стрелки
          // уменьшаем яркость, но не ниже 0
          if (brightness - fadeAmount >= 0) {
            brightness -= fadeAmount;
            Serial.println(CIELPWM(brightness));
          }
        }
      }
      encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла

      analogWrite(9, brightness);   // устанавливаем яркость на 9 ножку

      loopTime = currentTime;
      if (button == true) {
        brightness = 0; // сбрасываем яркость на ноль
      }
    }
  }
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ну?! а чё я говорил? тело под "декодером" "энкодер" понимает! ;)

Тело! не выёживайся. Я тебе формулу написал, а программировать таймеры тебе, наверно, мама еще не разрешает. :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

 под "декодером" "энкодер" понимает! ;)

Так это ж обратные понятия. Так что если энкодер к верху ногами припаять, то как раз декодер и получится.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так это не "гаммакоррекция", а просто управление яркостью с помощью энкодера. Совсем иная задача. :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

wdrakula пишет:
ну?! а чё я говорил? тело под "декодером" "энкодер" понимает! ;)

САША + МАША = ЛЮБОВЬ
декодер +энкодер = ДЕНЬКОДЕР . Вращением ручки вы управляем СОЛНЦЕМ ДНЕМ
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТС, мошт, ты тупо у автора кода спросишь?