Гамма-коррекция дисплея
Код 128 из 255 не даёт половину яркости — и это задумано. Контроллер TFT-панели переводит код цвета в напряжение на жидком кристалле по кривой гаммы, и от её настройки зависит, будут ли тени чёрными пятнами, а светлые места — белёсыми.
Обновлено Редакция GAW
Гамма-коррекция (gamma correction) — нелинейное преобразование кода цвета в яркость точки экрана. В TFT-панели контроллер дисплея переводит код каждой составляющей R, G, B в напряжение на жидком кристалле, а зависимость пропускания кристалла от напряжения нелинейна и у каждого стекла своя. Гамма-коррекция подбирает эти напряжения так, чтобы яркость следовала заданной кривой, обычно степенной: в ILI9341 кривая 1 описывается функцией y = x^2,2.
Как устроено в контроллере
Генератор напряжений серой шкалы выдаёт набор опорных уровней, и уровень для каждого кода берётся из них. В ILI9341 это уровни VP0–VP63 для положительной полярности и VN0–VN63 для отрицательной: жидкий кристалл питают переменным напряжением относительно VCOM, и каждой полярности нужна своя таблица. ST7789V настраивает гамму тремя группами регистров — наклоном, контрастом и тонкой подстройкой — и позволяет менять каналы R, G и B отдельно.
| Команда | ILI9341 | ST7789V |
|---|---|---|
| 26h GAMSET — выбор кривой | 01h — G2.2 (одна предустановленная) | 01h — G2.2, 02h — G1.8, 04h — G2.5, 08h — G1.0 |
| E0h — гамма положительной полярности | PGAMCTRL, 15 параметров | PVGAMCTRL |
| E1h — гамма отрицательной полярности | NGAMCTRL, 15 параметров | NVGAMCTRL |
| E2h, E3h — цифровая гамма | Digital Gamma Control 1 и 2 | таблицы для красного и синего |
Команды E0h и E1h у ILI9341 работают только при высоком уровне вывода EXTC; если он на земле, контроллер их не выполняет.
Что это значит на практике
- Половина кода — не половина яркости. При кривой 2,2 код 128 из 255 даёт около 22 % яркости (0,5^2,2, наш пересчёт). Поэтому плавное изменение яркости подсветкой и плавная заливка цветом ведут себя по-разному.
- Строки E0h и E1h из примера модуля не трогают. Их подбирает производитель под своё стекло, и значения от другого модуля искажают серую шкалу. Инициализация ILI9341 и порядок команд разобраны на странице ILI9341, для ST7789 — на странице ST7789 и ST7735.
- У светодиодов гамму делают в программе. У адресных светодиодов и простых ШИМ-каналов такого блока нет, и кривую применяют таблицей значений ШИМ; её строит генератор таблиц, а временные параметры сигнала лент проверяет калькулятор WS2812.
- Гамма не влияет на скорость. Она не меняет ни частоту кадров, ни объём данных: формат точки задаётся отдельно — см. формат пикселя.
После аппаратного и программного сброса GAMSET равен 01h, то есть включена кривая G2.2, а таблицы E0h и E1h содержат значения по умолчанию. Если изображение выглядит блёклым, сначала сверьте инициализацию с примером производителя модуля и только потом подбирайте параметры сами — по одному, сравнивая градиент от чёрного к белому.
Частые вопросы
Что делают команды E0h и E1h в инициализации ILI9341?
Это тонкая настройка гамма-кривой для конкретной панели: PGAMCTRL (E0h) и NGAMCTRL (E1h) по 15 параметров задают опорные напряжения серой шкалы для положительной и отрицательной полярности. Ilitek описывает их как установку напряжений серой шкалы для подстройки гаммы TFT-панели. Значения подбирает производитель модуля под своё стекло, поэтому их берут из примера инициализации модуля, а не придумывают.
Почему код 128 не даёт половину яркости?
Кривая 1 в ILI9341 по даташиту следует функции y = x^2,2: яркость растёт как степень кода. Для середины шкалы это 0,5^2,2 ≈ 0,22 — около пятой части максимальной яркости (наш пересчёт). Почти линейную зависимость дала бы кривая G1.0, которую среди четырёх предустановленных предлагает ST7789V; G2.2 — значение по умолчанию у обоих контроллеров.
Как сменить гамму у ST7789V?
Командой GAMSET (26h) с одним параметром: 01h — кривая G2.2, 02h — G1.8, 04h — G2.5, 08h — G1.0. Остальные значения Sitronix называет недопустимыми — они не меняют текущую кривую. Тонкая подстройка — командами E0h и E1h, а цифровые таблицы E2h и E3h корректируют красный и синий каналы отдельно.
Источники
- ILI Technology. ILI9341 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color, Specification V1.11 (ILI9341_DS_V1.11) — разд. 2: одна предустановленная кривая гаммы с раздельной коррекцией R, G, B; разд. 7: генератор напряжений серой шкалы формирует напряжение на жидком кристалле по уровню, заданному в регистрах гамма-коррекции, до 262 144 цветов; разд. 8.2.17: GAMSET (26h) — выбор кривой, 01h — кривая 1 (G2.2), до 4 кривых, по умолчанию 01h, прочие значения не меняют текущую кривую; разд. 8.3.24–8.3.25: PGAMCTRL (E0h) и NGAMCTRL (E1h) — по 15 параметров, задают напряжения серой шкалы VP0–VP63 и VN0–VN63 для подстройки гаммы панели, команды работают при высоком уровне EXTC; разд. 8.3.26–8.3.27: цифровая гамма E2h и E3h; разд. 14.2.1: кривая 1 (GC0) описывается функцией y = x^2,2
- Sitronix. ST7789V 240RGB x 320 dot 262K Color with Frame Memory Single-Chip TFT Controller/Driver, Version 1.3 (2014-03) — разд. 2: 4 предустановленные кривые гаммы с раздельной настройкой RGB; разд. 8.19: гамма-коррекция тремя группами регистров — наклон, контраст и тонкая подстройка — для положительной и отрицательной полярности, R, G и B настраиваются отдельно; рис. 36 — связь выходного напряжения истока и VCOM; разд. 9.1.17: GAMSET (26h): 01h — G2.2, 02h — G1.8, 04h — G2.5, 08h — G1.0, по умолчанию после включения и сбросов 01h; разд. 9.2.24–9.2.27: PVGAMCTRL (E0h), NVGAMCTRL (E1h), цифровые таблицы гаммы DGMLUTR (E2h) и DGMLUTB (E3h)
Нашли ошибку?
Смотрите также
- TFT на ILI9341Питание, SPI с D/CX, RGB565 и RGB666, окно записи, поворот, инициализация
- TFT на ST7735 и ST7789Память и разрешения, SPI, цвет, поворот, смещение окна, инициализация
- Контроллер и драйвер дисплеяМикросхема, которая хранит изображение и управляет строками и столбцами панели
- Частота кадров дисплеяСколько раз в секунду контроллер перерисовывает панель из своей памяти
- Формат пикселяRGB444, RGB565, RGB666: биты на точку, команда 3Ah, размер кадра