Перейти к содержанию

Генератор таблиц для микроконтроллера

Выберите вид таблицы, число точек и максимальное значение — калькулятор построит таблицу, покажет её график и сгенерирует массив на C нужного типа, при желании с PROGMEM для AVR. Синус — для ЦАП и ШИМ, гамма и CIE L* — для плавного диммирования светодиодов.

Исходные данные

64, 256, 1024

255 — 8 бит, 1023 — 10 бит, 4095 — 12 бит

Значения
°
Запись
Во флеш-памяти AVR (PROGMEM)

Результат

Размер таблицы
256 байт
256 × uint8_t
Значения
0 … 255первые: 128, 131, 134, 137, 140, 143

Массив на C

#include <stdint.h>
#include <avr/pgmspace.h>

/* sine, 256 points per period, 0..255, phase 0 deg */
const uint8_t sine_table[256] PROGMEM = {
    128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167,
    170, 173, 176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206,
    208, 211, 213, 215, 218, 220, 222, 224, 226, 228, 230, 232, 234, 235,
    237, 238, 240, 241, 243, 244, 245, 246, 248, 249, 250, 250, 251, 252,
    253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 254,
    254, 253, 253, 252, 251, 250, 250, 249, 248, 246, 245, 244, 243, 241,
    240, 238, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220, 218, 215,
    213, 211, 208, 206, 203, 201, 198, 196, 193, 190, 188, 185, 182, 179,
    176, 173, 170, 167, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137,
    134, 131, 128, 124, 121, 118, 115, 112, 109, 106, 103, 100,  97,  93,
     90,  88,  85,  82,  79,  76,  73,  70,  67,  65,  62,  59,  57,  54,
     52,  49,  47,  44,  42,  40,  37,  35,  33,  31,  29,  27,  25,  23,
     21,  20,  18,  17,  15,  14,  12,  11,  10,   9,   7,   6,   5,   5,
      4,   3,   2,   2,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
      1,   1,   1,   2,   2,   3,   4,   5,   5,   6,   7,   9,  10,  11,
     12,  14,  15,  17,  18,  20,  21,  23,  25,  27,  29,  31,  33,  35,
     37,  40,  42,  44,  47,  49,  52,  54,  57,  59,  62,  65,  67,  70,
     73,  76,  79,  82,  85,  88,  90,  93,  97, 100, 103, 106, 109, 112,
    115, 118, 121, 124
};

/* reading: uint8_t v = pgm_read_byte(&sine_table[i]); */

Таблица заранее вычисленных значений избавляет микроконтроллер от тригонометрии и возведения в степень во время работы: синус для генератора или кривую яркости достаточно один раз посчитать и записать во флеш-память.

Формулы

Синус на N точек за период для ЦАП или ШИМ (значения от 0 до max) и знаковый (от −A до A):

vi=round⁡(max2(1+sin⁡(2πiN+φ))),vi=round⁡(Asin⁡(2πiN+φ)).v_i = \operatorname{round}\left(\frac{max}{2}\left(1 + \sin\left(\frac{2\pi i}{N} + \varphi\right)\right)\right), \qquad v_i = \operatorname{round}\left(A \sin\left(\frac{2\pi i}{N} + \varphi\right)\right).

Гамма-коррекция и светлота CIE L* для диммирования:

vi=round⁡(max⋅(iN−1)γ),Y={(L∗+16116)3,L∗>8L∗/903,3,L∗≤8v_i = \operatorname{round}\left(max \cdot \left(\frac{i}{N - 1}\right)^{\gamma}\right), \qquad Y = \begin{cases} \left(\dfrac{L^* + 16}{116}\right)^3, & L^* > 8 \\[1ex] L^*/903{,}3, & L^* \le 8 \end{cases}

где для CIE L* = 100 · i / (N − 1), а значение таблицы — max · Y.

Синус для генератора

Таблица синуса — основа прямого цифрового синтеза: на каждом прерывании таймера к фазовому аккумулятору прибавляют шаг, а старшие биты аккумулятора служат индексом в таблице. Чем больше точек и разрядность значений, тем меньше искажения, но тем больше памяти занимает таблица. Однополярная таблица подходит для ЦАП и ШИМ, знаковая — для цифровой обработки, где синус затем масштабируют и сдвигают. Как получить из ШИМ аналоговый сигнал и подобрать фильтр, — в калькуляторе ЦАП на ШИМ.

Яркость светодиодов

Таблица гаммы или CIE L* ставится между регулятором и регистром сравнения таймера: номер ступени яркости — индекс, значение из таблицы — заполнение ШИМ. Частоту и разрядность ШИМ подбирают в калькуляторе таймеров микроконтроллера: для плавной регулировки на малой яркости нужно 10 бит и больше.

Частые вопросы

Зачем нужна гамма-коррекция для светодиодов?

Светодиод светит пропорционально заполнению ШИМ, а глаз воспринимает яркость нелинейно: шаг от 1 до 2 % заполнения заметен гораздо сильнее, чем от 90 до 91 %. Без коррекции регулировка «проскакивает» тёмный диапазон и почти не меняется в светлом. Таблица гаммы переводит равномерные шаги регулятора в заполнение ШИМ по степенной кривой с показателем 2,2–2,8.

Чем таблица CIE L* отличается от гаммы?

CIE L* — стандартная шкала светлоты CIE 1976: в самой тёмной части она линейна, дальше — кубическая. Середина шкалы, L* = 50, соответствует 18,4 % яркости, а гамма 2,2 в середине даёт 21,8 %. На практике обе кривые дают плавное диммирование; CIE L* аккуратнее в самой тёмной части, где у степенной кривой значения прижимаются к нулю.

Почему в 8-битной таблице гаммы в начале одни нули?

При гамме 2,2 и 256 точках с максимумом 255 первые 15 значений, с 0-го по 14-е, после округления равны нулю: столько уровней яркости 8-битный ШИМ просто не различает. Для плавного свечения на малой яркости таблицу делают для 10–16-битного ШИМ — задайте максимум 1023 или 65535.

Где хранить таблицу на AVR?

Обычный const-массив на AVR копируется при старте в оперативную память, которой у ATmega328P всего 2 КБ. С атрибутом PROGMEM таблица остаётся во флеш-памяти, а читают её макросами pgm_read_byte или pgm_read_word из avr/pgmspace.h — калькулятор добавляет пример чтения. На Cortex-M с GCC const-массив и так попадает во флеш-память.

Источники

  1. CIE 15:2004. Colorimetry, 3rd edition — светлота L* шкалы CIE 1976 и её связь с относительной яркостью Y
  2. Bruce Lindbloom. Lab to XYZ — обратное преобразование: Y = ((L* + 16)/116)³ при L* > 8, иначе L*/κ, κ = 903,3
  3. avr-libc: Program Space Utilities (avr/pgmspace.h) — размещение констант во флеш-памяти AVR и чтение pgm_read_byte, pgm_read_word
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/lookup-table/" title="Генератор таблиц для микроконтроллера" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/lookup-table/">Генератор таблиц для микроконтроллера</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено . Нашли ошибку в расчёте? Напишите нам.