Линеаризация управления

Подскажите пожалуйста, какие функции применяются в WB-LED для создания нелинейности управления яркостью и температурой? Мне для моей задачи нужен линейный контроль освещённости в люксах и цветовой температуры в Кельвинах. Как вариант, я нашёл функции аппроксимации для кривых, или можно прямо таблично переводить, но хочется узнать исходные данные для простоты работы.

Снял кривые попроцентно (зависимость сырого значения от значения процентов):
Яркость:

Температура (два канала):

Добрый день.

Как описано:
Снимок экрана_20260403_100522

Вы можете использовать, если не нужно никакое преобразование - прямое управление ШИМ

Да, из этих же каналов можно и текущее, установленное значение выхода получить.

Вижу, что уже их используете.
Получается - нужна именно точная применяемая формула?

1 Like

Нужна плавность перехода, прямое управление ШИМ не подойдёт, тк регулировка будет быстрыми скачками.

Очень желательны точные функции с параметрами (для яркости и температуры), чтобы не гадать по этому вопросу.

Вообще, было бы неплохо добавить опцию в конфигурацию модуля, которая включает/отключает нелинейность.

Ещё заметил, что нормализация не совсем ожидаемо работает. По идее же сумма каналов c1+c2 = brightness * 2048
но в итоге получается на 20 единиц выше, что соответствует смещению ШИМ при 1% яркости.

Спрошу у разработчиков.

А это добавил в пожелания.

Что (какое значение) задано для минимального/максимального ШИМ?

Минимум - 20
Максимум - 2048

Да, собственно как и ожидается.

Подобрал функции линеаризации и написал классы. Может кому понадобятся:


function WBLED_BrightMapper(a, b, c, d) {
    var self = this;

    a = a || 3.48204801;
    b = b || -0.16440747;
    c = c || 1.95761972;
    d = d || -3.053028;

    self.forward = function (x) {
        return a * Math.exp(c * x + d) + b;
    }

    self.backward = function (y) {
        var v = (y - b) / a
        return (Math.log(v) - d) / c
    }
}

function WBLED_TempcolorMapper(x0, y0, A, k) {
    var self = this
    x0 = x0 || 0.50001874;
    y0 = y0 || 0.50000733;
    A = A || 0.82138416;
    k = k || 0.32138416;

    self.forward = function (x) {
        x -= x0
        return y0 + A * x / (Math.abs(x) + k)
    }

    self.backward = function (y) {
        var y_ = (y - y0) / A
        if (y_ >= 0)
            return x0 + (y_ * k) / (1.0 - y_)
        else
            return x0 + (y_ * k) / (1.0 + y_)
    }
}

Вход и выход нормализованы на [0; 1]
forward - переводит желаемую яркость или температуру в реальное значение
backward - переводит реальное значение в желаемое

2 Likes