﻿LumArh V2.4.0
Прошивка для платы с линейными потенциометрами


1. СРЕДА РАЗРАБОТКИ

Проект ведется в IAR Embedded Workbench for STM8.

Открывать:
    LumArh.eww

В workspace подключен проект:
    LumArh\LumArh.ewp

Контроллер:
    STM8S003F3P6

Основной файл прошивки:
    LumArh\main.c

В архиве уже лежит используемая STM8S Standard Peripheral Library.
Папки LumArh и STM8S_StdPeriph_Lib должны оставаться рядом, без изменения структуры.

Перед началом работы:
    Project -> Rebuild All


2. КАРТА ВЫВОДОВ

Аналоговые входы:

    PC4 / ADC1 AIN2   - измерение тока
    PD2 / ADC1 AIN3   - Pot2 / MIX
    PD3 / ADC1 AIN4   - Pot1 / BRIGHT

PWM:

    PC6 / TIM1_CH1    - Cold / CW
    PC7 / TIM1_CH2    - Warm / WW

DIP-переключатели:

    PD6               - SW1
    PD5               - SW2
    PD4               - SW3

DIP-входы работают с внутренней подтяжкой вверх.
Замкнутый переключатель читается как 0.

Состояние DIP читается при включении питания или Reset.
После изменения положения переключателей устройство нужно перезапустить.


3. ЧАСТОТА PWM

SW1 и SW2 выбирают частоту PWM:

    SW1=0, SW2=0      4 кГц
    SW1=1, SW2=0      8 кГц
    SW1=0, SW2=1      16 кГц
    SW1=1, SW2=1      около 24 кГц

В коде используются следующие ARR:

    4 кГц     ARR = 3999
    8 кГц     ARR = 1999
    16 кГц    ARR = 999
    24 кГц    ARR = 665

Prescaler TIM1 = 0.

SW3 выбирает характеристику регулировки яркости:

    SW3=0     Linear
    SW3=1     Gamma2


4. ЛОГИКА BRIGHT И MIX

Pot1 отвечает за общую яркость BRIGHT.

Диапазон:
    0...1023

Pot2 отвечает за смешивание Warm / Cold.

Диапазон:
    0...1023

Направление:

    0         Warm
    ~511      середина
    1023      Cold

PWM-каналы:

    TIM1_CH1 / PC6    Cold
    TIM1_CH2 / PC7    Warm

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

За величину этой компенсации отвечает:
    MIX_BUMP


5. ФИЛЬТРАЦИЯ

Значения обоих потенциометров сглаживаются до расчета PWM.

Для этого используются:

    POT_SHIFT_UP
    POT_SHIFT_DOWN

После расчета Bright/Mix дополнительно сглаживается уже итоговый duty:

    DUTY_SHIFT_UP
    DUTY_SHIFT_DOWN

Сейчас фильтрация сделана асимметрично: увеличение яркости может идти быстрее, чем уменьшение.

В функциях фильтра есть минимальный шаг 1, поэтому сама фильтрация не должна создавать фиксированную dead-zone в начале хода потенциометра.


6. SOFT-START

После включения питания яркость набирается постепенно.

Основные параметры:

    SOFTSTART_ENABLE
    SOFTSTART_MS_TOTAL
    SOFTSTART_STEPS

Текущие настройки:

    SOFTSTART_ENABLE      = 1
    SOFTSTART_MS_TOTAL    = 1500 мс
    SOFTSTART_STEPS       = 200

Soft-start действует только после запуска устройства и не участвует в обычной регулировке ручкой после завершения старта.


7. КОМПЕНСАЦИЯ ЯРКОСТИ В ЦЕНТРЕ MIX

Параметр:

    MIX_BUMP

Текущее значение:

    MIX_BUMP = 180

Это примерно соответствует максимальной добавке около +18% в центре MIX.

Логика простая:

    0      компенсация выключена
    100    около +10%
    180    около +18%
    200    около +20%

Если центр MIX визуально темнее крайних положений, значение можно увеличивать.
Если центр получается заметно ярче, уменьшать.


8. ХАРАКТЕРИСТИКА BRIGHT

В режиме Linear:

    B = Pot1

То есть вход 0...1023 используется напрямую.

В режиме Gamma2 яркость рассчитывается по квадратичной характеристике:

    B ~= Pot1^2 / 1023

За счет этого регулировка становится более плавной на малой яркости и более быстрой ближе к максимуму.

У Gamma2 около нуля есть естественно очень пологий участок из-за самой формулы и целочисленного округления.


9. ИЗМЕРЕНИЕ И ОГРАНИЧЕНИЕ ТОКА

Измерение тока идет через:

    PC4 / ADC1 AIN2

Ограничитель включается параметром:

    CURRENT_LIMIT_ENABLE

Текущие основные пороги:

    CUR_SOFT_MA = 3000 мА
    CUR_HARD_MA = 5000 мА

При достижении CUR_SOFT_MA прошивка начинает уменьшать допустимый duty.

При достижении CUR_HARD_MA оба PWM отключаются полностью.
Авария фиксируется до Reset или снятия питания.

Дополнительно контролируется резкий скачок показаний:

    CUR_AVA_DELTA

Текущее значение:

    CUR_AVA_DELTA = 120 ADC counts

Калибровка тока в этой версии:

    I(mA) ~= 19.2 * Cur - 188

где Cur - значение ADC по AIN2.


10. ПАРАМЕТРЫ ОГРАНИЧИТЕЛЯ ТОКА

LIM_DOWN_STEP

    Шаг уменьшения разрешенного duty при превышении мягкого порога.

    Больше значение -> мощность уменьшается быстрее.
    Меньше значение -> ограничение работает мягче.


LIM_UP_STEP

    Шаг восстановления мощности после снижения тока.

    Обычно должен быть меньше LIM_DOWN_STEP, чтобы ограничитель не раскачивался.


LIM_HYST

    Гистерезис около мягкого порога.

    Если ограничитель начинает заметно "пилить" около границы, гистерезис можно немного увеличить.


11. ТАКТИРОВАНИЕ

Используется внутренний генератор HSI STM8.

Настройки:

    HSI divider = /1
    CPU divider = /1

Внешний кварц не используется.


12. АЦП

ADC1 работает в continuous scan mode с буфером данных.

Используемые каналы:

    AIN2   Current
    AIN3   Pot2
    AIN4   Pot1

Чтение выполняется через:

    ADC1_GetBufferValue()

Pot1 и Pot2 в логике используются в диапазоне 0...1023.


13. OPTION BYTES

Для работы PWM на PC6 и PC7 обязательно должен быть включен:

    AFR0 = Alternate Active

Это включает remap:

    PC6 = TIM1_CH1
    PC7 = TIM1_CH2

Без AFR0 PWM на этих выводах работать не будет.

Также используются:

    ROP      = disabled
    IWDG_HW  = Software
    WWDG_HW  = Software

Файл с настройками:

    LumArh\optionbytes.obc


14. СБОРКА

1. Распаковать проект полностью.
2. Открыть:
       LumArh.eww
3. Выбрать конфигурацию:
       Debug
4. Выполнить:
       Project -> Rebuild All

Готовый HEX:

    LumArh\Debug\Exe\LumArh.hex


15. ПРОШИВКА ЧЕРЕЗ ST-LINK V2

STM8 прошивается через SWIM.

Подключение:

    ST-Link SWIM       -> SWIM платы
    ST-Link NRST       -> NRST платы
    ST-Link GND        -> GND платы
    ST-Link VTref/VCC  -> питание логики / reference платы

Плату лучше питать штатным способом.


ST Visual Programmer:

    Hardware   ST-LINK
    Port       SWIM
    Device     STM8S003F3

Порядок прошивки:

1. Подключить ST-Link V2 к плате.
2. Подать питание.
3. Запустить STVP.
4. Выбрать:
       ST-LINK
       SWIM
       STM8S003F3
5. Открыть:
       LumArh\Debug\Exe\LumArh.hex
6. Записать Program Memory.
7. Выполнить Verify.
8. Проверить Option Bytes.
9. Убедиться, что:
       AFR0 = Alternate Active
10. Записать Option Bytes.
11. Полностью снять питание с платы.
12. Подать питание снова.


16. ЧТО ПРОВЕРИТЬ ПОСЛЕ ПРОШИВКИ

Проверить:

    - PWM на PC6 и PC7;
    - регулировку BRIGHT по всему ходу Pot1;
    - MIX по всему ходу Pot2;
    - отсутствие заметного провала яркости в центре MIX;
    - все четыре частоты PWM;
    - Linear / Gamma2 через SW3;
    - soft-start;
    - работу soft current limit;
    - hard current shutdown.


17. КАК ВЕСТИ ДАЛЬНЕЙШУЮ РАЗРАБОТКУ

Основной файл:

    LumArh\main.c

Структуру проекта и расположение STM8S_StdPeriph_Lib лучше не менять без необходимости.

После каждого изменения:

    1. Project -> Rebuild All
    2. прошить через ST-Link
    3. проверить оба PWM-канала
    4. проверить Pot1
    5. проверить Pot2
    6. проверить выбранную частоту PWM
    7. проверить ограничение тока

AFR0 не отключать, пока PWM остается на PC6/PC7.


18. РЕКОМЕНДАЦИИ ПО НАСТРОЙКЕ

POT_SHIFT_UP / POT_SHIFT_DOWN

Эти параметры задают скорость реакции фильтра потенциометров.

Примерно:

    SHIFT=2    быстрый фильтр
    SHIFT=3    умеренно быстрый
    SHIFT=4    текущий вариант
    SHIFT=5    более плавный
    SHIFT=6    заметно инерционный

Меньше значение -> быстрее реакция.
Больше значение -> сильнее сглаживание.

Если ручка кажется слишком "вязкой", уменьшать SHIFT.
Если есть заметное дрожание, увеличивать.

Эти параметры не предназначены для сдвига точки появления света в начале хода.


DUTY_SHIFT_UP / DUTY_SHIFT_DOWN

Фильтруют уже рассчитанный PWM.

Текущая логика настроена так, чтобы яркость набиралась быстрее, чем уменьшалась.

Если спад яркости кажется слишком медленным, уменьшать DUTY_SHIFT_DOWN.
Если выход дрожит, можно немного увеличить соответствующий SHIFT.


MIX_BUMP

Настраивать по фактической яркости в центре MIX.

Если середина проваливается:
    увеличивать.

Если середина выбивается вверх:
    уменьшать.


SOFTSTART_MS_TOTAL

Если включение слишком долгое:
    уменьшать.

Если старт хочется сделать мягче:
    увеличивать.


CUR_SOFT_MA / CUR_HARD_MA

Менять только после проверки реального тока и калибровки ADC.

CUR_HARD_MA всегда должен быть выше CUR_SOFT_MA.


CUR_AVA_DELTA

Меньше значение -> защита чувствительнее к резким скачкам.
Больше значение -> менее чувствительна.

Слишком маленькое значение может дать ложные отключения.


LIM_DOWN_STEP

Определяет, насколько быстро ограничитель снижает мощность.

Больше -> быстрее.
Меньше -> мягче.


LIM_UP_STEP

Определяет скорость возврата мощности.

Обычно оставлять меньше LIM_DOWN_STEP.


LIM_HYST

Увеличивать только если ограничитель заметно колеблется около порога.


19. ПРОБЛЕМА С НАЧАЛОМ ХОДА BRIGHT

Отмечалась проблема: в первых миллиметрах поворота Pot1 свет может еще не появляться.

Важно сначала определить причину, а не менять фильтры наугад.


Если SW3 установлен в Gamma2:

часть эффекта объясняется самой квадратичной характеристикой.

В начале диапазона:

    B ~= Pot1^2 / 1023

Поэтому первые значения Pot1 дают очень маленький результат, а из-за целочисленного округления несколько начальных отсчетов вообще дают B=0.

Gamma2 может заметно увеличить ощущаемую "пустую" часть ручки.


Если проблема остается в Linear:

в режиме Linear программной dead-zone в BRIGHT нет:

    B = Pot1

Поэтому нужно проверить две вещи:

    1. начинает ли реально расти ADC Pot1 сразу после начала механического поворота;
    2. при каком минимальном duty силовая часть и светодиоды реально начинают давать видимый свет.


Если Pot1 остается равным 0 в первых миллиметрах:

это механическая/электрическая зона самого потенциометра.
Прошивка не может отреагировать раньше, пока ADC не начал меняться.


Если Pot1 уже растет, а свет еще не появляется:

значит проблема находится ниже по цепочке — в минимальном полезном PWM, драйвере или силовой части.


Быстрая проверка:

сравнить начало регулировки в Linear на 24 кГц и на 4 кГц.

Если на 4 кГц свет начинает появляться раньше, причина с высокой вероятностью связана с минимальной длительностью PWM, а не с Pot1.


Что снять перед изменением алгоритма:

    - Pot1 в механическом нуле;
    - Pot1 сразу после начала движения ручки;
    - Pot1 в точке первого видимого света;
    - частоту PWM, на которой делалось измерение.


Если потребуется программно сдвинуть момент появления света:

лучше добавить отдельную коррекцию нижней части BRIGHT.

Не стоит использовать для этого POT_SHIFT_UP/DOWN:
они меняют скорость реакции, а не нижнюю точку характеристики.

Также нежелательно просто задавать большой минимальный PWM, потому что получится скачок:

    0 -> сразу заметная яркость

Лучше сделать отдельную нелинейную коррекцию нижнего участка, сохранив:

    Pot1=0     -> PWM=0
    Pot1=max   -> PWM=max

а между ними немного увеличить наклон кривой около нуля.

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