гамм-коррекция для ШИМ светодиодов
- Войдите на сайт для отправки комментариев
Чт, 08/11/2018 - 18:11
Доброго дня! Помогите разобраться новичку, как подставить гамма-коррекцию на шим регулировку яркости светодиода при помощи декодера. Если можно, немного кода, чтобы понять
блииин, опять искать хрустальные шары.....
хрустальные шары.....
Они ведь запрещены!
Расслабился народ :(
Гамма-коррекция на шим-регулировку через декодер? Чего тут непонятного... надо только сказать "крекс-пекс-фекс", повернуться трижды и плюнуть через левое плечо. Потом... идти домой и ждать урожая.
не, тут "код" посложнее нужен:
"– Слухай сюда! Положь колдобину со стороны загогулины и два раза дергани за пимпочки. Опосля чего долбани плюхалкой по кувыкалке и, кады чвокнет, – отскочь дальшее, прикинься ветошью и не отсвечивай. Потому как она в энто время шмяк тудыть, сюдыть, ёксель-моксель, ёрш твою медь... Пш-ш-ш! – И ждешь пока остынет. Остыло – подымаесся, вздыхаешь. Осторожненько вздыхаешь, про себя, шобы эта быдла не рванула! И бегишь за угол за пол-литрой."
(C) Михаил ЗАДОРНОВ.
Доброго дня! Помогите разобраться новичку, как подставить гамма-коррекцию на шим регулировку яркости светодиода при помощи декодера. Если можно, немного кода, чтобы понять
Хотелось бы услышать какие-то детальки и пояснения про:
а) "светодиод". Если речь за RGB-светодиод, где их 3шт в одном корпусе, то о какой "гамма коррекции" идет речь? И в частности, в "каком направлении", поскольку они там хоть и в одном корпусе, но светят несколько в разные стороны и "белый" там .. ну очень относительное понятие.
б) "гамма коррекция" в каком интервале яркостей требуется? Но это - только после показа о каком "светодиоде" идет речь.. Там шибко нелинейная функция .. Вам с какой точностью отсыпать?
в) Чем собираетесь контролировать "гамма коррекцию"? Колориметр - имеется или так, "на глаз"? А то .. "белый цвет" .. он такой разный .. (цветовая температура зовется).
Ну в общем, рассказывайте, иначе тут гадания начнутся.
Спасибо! я бы хотел понять сам принцип реализации... пусть один светодиод, гамма-коррекция яркости... там кривая, как я понял однотипная ведь для всех ледов более или менее? собирается массив и подставляются из него значения яркости при ее регулировки? или через библиотеки какие? фиг с ним с декодером, может просто на кнопке покажете синтаксис кода? что б мне зацепиться за направление мысли :)
Попробуй янтарную кислоту, ну и аспирин, если желудок позволяет. Это должно снять основные симптомы похмелья.
Спасибо! я бы хотел понять сам принцип реализации... пусть один светодиод, гамма-коррекция яркости... там кривая, как я понял однотипная ведь для всех ледов более или менее? собирается массив и подставляются из него значения яркости при ее регулировки? или через библиотеки какие? фиг с ним с декодером, может просто на кнопке покажете синтаксис кода? что б мне зацепиться за направление мысли :)
И да, "гамма коррекция мониторов" (в т.ч. led) в помощь. Она ваще-то "существует", но .. там "светодиоды" - очень специфичное понятие.. отсюда и вопросы.
Пока нет ясного изложения задачи - можно гадать о чем угодно.
Люди!
У меня сегодня день покаяния и хорошее настроение! ;) я поясню, что от нас хочет ТС.
Ему нужна линейная зависимость зрительного восприятия яркости свечения от параметра регулировки.
То есть если в "скетче" написано свет на 30%, то и глаз должен видеть на 30%.
Есть прямой и точный ответ на это вопрос прям с формулой ;) !!!
1. у LED практически линейная зависимость светимости от тока;
2. средний ток через диод практически линейно зависит от коэф. заполнения ШИМ.
3. глаз имеет ЛОГАРИФМИЧЕСКОЕ восприятие яркости... да и всего остального. Все чуЙства у человека устроены логарифмически... ну, акромя жадности!
=========================
итого пусть параметр регулировки в процентах от 0 до 100.
значит при 0 - 0 ;
а при 100 - 255 ;
ШИМ в ардуино принимает значения от 0 до 255.
ШИМ = (1.057) в степени (ЯРКОСТЬ) - 1; где ЯРКОСТЬ - параметр регулировки от 0 до 100.
Напоминаю, что в Ардуино есть функция pow(x,y) возводящая в степень. Потом нужно округлить до целого вниз и использовать в analogWrite().
А декодер?..
А декодер?..
Да-а. Тут промашка вышла. Сорри. Я думаю, что ТС просто не знает, как пишеццо "энкодер" ;).
ШИМ в ардуино принимает столько, сколько нальешь... но не суть... вот немного кода... вроде работает... интересно, что на значении массива 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; // сбрасываем яркость на ноль } } } }ну?! а чё я говорил? тело под "декодером" "энкодер" понимает! ;)
Тело! не выёживайся. Я тебе формулу написал, а программировать таймеры тебе, наверно, мама еще не разрешает. :(
под "декодером" "энкодер" понимает! ;)
Так это ж обратные понятия. Так что если энкодер к верху ногами припаять, то как раз декодер и получится.
Так это не "гаммакоррекция", а просто управление яркостью с помощью энкодера. Совсем иная задача. :)
САША + МАША = ЛЮБОВЬТС, мошт, ты тупо у автора кода спросишь?