123 Main Street, New York, NY 10001

Human-Centric Lighting (HCL) Control: CCT Mixing & Scheduling

← Back to: Lighting & LED Drivers

Human-Centric Lighting (HCL) is an engineering control loop that turns time-based scenes (CCT + illuminance) into stable, smooth, driver-agnostic channel commands, optionally corrected by sensors to keep light consistent as temperature and conditions change.

A robust HCL system is proven by its evidence chain—CCT_target/est, Lux_target/est, Scene_ID, Cmd_norm[ch], Temp_C, and Fault_code—so every “comfort” complaint can be diagnosed and fixed deterministically.

H2-1 — HCL definition and system boundary

Engineering thesis: Human-Centric Lighting (HCL) is an engine that converts time-based scenes and optional sensor feedback into stable tunable-white output (CCT + illuminance) using controlled transitions, constraints, and evidence-ready telemetry.

What this chapter proves (in engineering terms, not marketing): HCL is not a “feature label”. It is a control system with (1) explicit targets, (2) explicit actuators, (3) optional feedback, and (4) a state machine that makes behavior deterministic across schedule changes, overrides, and reboots.

Define the three variable layers (this is the vocabulary used by every later chapter):

  • Setpoints (what the user wants): correlated color temperature and illuminance targets that can change over time (scenes, schedules).
  • Actuators (what the system controls): per-channel output commands (normalized channel ratios or absolute channel current setpoints).
  • Feedback/Observations (what the system measures): ambient light level (ALS), estimated CCT (color/CCT sensor), and temperature for drift compensation.

System boundary (what this page covers): circadian scheduling (RTC + scene table), CCT mixing, closed-loop stabilization using ALS/CCT sensors, smooth fades (perceptual ramps), calibration storage, and telemetry/log fields for field proof.

Explicit exclusions (keeps this page from overlapping siblings): protocol specifics (DALI/DMX/0–10V), LED driver power-stage design (buck/boost/flyback/LLC), and compliance subsystems (EMC/surge/creepage).

Minimum Evidence Bundle (the smallest log snapshot that proves the HCL engine is behaving correctly):

CCT_target CCT_est Lux_target Lux_est Scene_ID Schedule_state
HCL engine boundary Block diagram showing schedule and scene table feeding a mixer and transition policy, producing driver-agnostic output to the luminaire. Sensors feed an estimator and controller, with constraints and telemetry fields. HCL Engine Boundary setpoints → mixing → smooth output, with optional feedback + telemetry Schedule / RTC time-of-day Scene Table CCT_target Lux_target fade time CCT Mixer channel ratio bounds / clamps Transition Policy ramps / gamma slew limits Driver-Agnostic Output Cmd_norm[ch] Luminaire Output stable CCT stable lux Sensors ALS_raw → Lux_est CCT sensor → CCT_est Temp_C Estimator filter + validity Controller error → correction Constraints: min/max, reachability, saturation Telemetry / Logs Scene_ID Schedule_state CCT/Lux target & est ICNavigator • HCL

H2-2 — Reference architecture: dataflow + timing model

What this chapter solves: HCL becomes unstable or “feels inconsistent” when scheduling, sensing, and output updates run at the same rate or write the same variables. A robust HCL architecture separates responsibilities by rate, enforces a single source of truth for active state, and exchanges data only through timestamped buffers.

Rate separation (three loops, three responsibilities):

  • Fast control/update loop (≈ 200 Hz–2 kHz): applies ramps/gamma, enforces slew limits, preserves chromaticity during fades, and outputs Cmd_norm[ch] (actuators).
  • Sensor loop (≈ 10–50 Hz): samples sensors, filters noise, validates freshness, and produces CCT_est/Lux_est (observations).
  • Schedule/scene loop (≈ 0.1–1 Hz): advances time-of-day scenes, resolves priority/overrides, and updates only setpoints (never raw actuator commands).

Single source of truth (state machine rules):

  • One owner of: Scene_ID, schedule state, override priority, ramp phase, and persistence policy.
  • Every external change (manual scene recall, schedule tick, restore on boot) must enter through the same state machine to avoid split-brain behavior.
  • Persistent state must be stored with version + CRC so field issues can be proven as “bad state restore” vs “bad control”.

Dataflow contract (who writes what): This page stays interface-agnostic by defining a clean contract. Slow logic writes setpoints; sensor logic writes estimates; fast logic writes actuator commands. Cross-rate exchange uses two buffers (timestamped) so stale data never silently corrupts output.

Tick_ms Sensor_sample_ts Control_update_ts Ramp_phase Override_reason NVM_scene_crc

Field-proof guideline: if output “hunts”, “steps”, or “ignores schedule”, the fastest root-cause split is to compare timestamps: (1) is the sensor fresh, (2) is the fast loop running on time, (3) is the state machine overriding schedule for a reason.

Timing ladder for schedule, sensor, and control loops Three-lane timing ladder showing slow schedule updates writing setpoint buffer, medium sensor sampling writing estimator buffer, and fast control loop reading both to update actuator commands. Includes timestamps and a warning not to write actuators directly from slow loop. Timing Ladder (Rate Separation) slow sets setpoints • mid updates estimates • fast outputs commands Schedule / Scene Sensors Control Update time → scene scene scene sample + lpf update + ramp Setpoint Buffer ts + version Estimator Buffer sensor freshness read write write Rule Schedule loop updates setpoints only — no direct actuator writes ICNavigator • HCL

H2-3 — CCT mixing fundamentals (2-channel and multi-channel)

Design thesis: CCT mixing is not “warm% + cool%”. It is a 2D mapping from a brightness target (Total_flux / Lux proxy) and a chromaticity target (CCT, optionally duv) into a channel command vector that remains stable under gain mismatch, temperature drift, and actuator constraints.

2-channel tunable white (Warm + Cool): A warm/cool ratio moves chromaticity, but the mapping is non-linear and brightness-coupled. Two effects make naïve linear mixing drift:

  • Different luminous efficacy per channel: equal current change does not produce equal lux change. Holding lux constant forces the ratio to move as brightness changes.
  • Non-linear color mapping: ratio maps to chromaticity first, then to CCT (CCT is not a linear axis). Small ratio errors can create uneven CCT steps, especially near the ends.

Multi-channel mixing (W + CW + WW, or adding R): Extra channels can reduce green/magenta bias and improve CRI/duv control, but only if mixing is defined as a matrix/LUT problem. The output must be a vector that satisfies two primary axes:

  • Brightness axis: Total_flux (or a lux proxy) sets overall energy.
  • Chromaticity axis: CCT (and optionally duv) sets color appearance.

Control variables (recommended contract):

  • Inputs: CCT_target, Lux_target (or Total_flux_target).
  • Core internal representation: Ch_ratio[] (normalized per-channel weights, sum not necessarily 1 before scaling).
  • Actuator-facing command: I_set[] (absolute channel current setpoints) or a normalized command vector (Cmd_norm[ch]).
  • Optional chromaticity quality metric: duv_est to capture green/magenta bias even when CCT is near target.

Why a “mixing matrix” is the stable approach: Define a mixing surface that maps (CCT_target, Lux_target) into a channel vector, then apply calibration gains and constraints. This avoids ratio drift when brightness changes and provides predictable behavior across scenes.

Legal region and reachability: Not every (CCT, flux) point is physically reachable. A robust mixer must detect when a request is outside the legal region and apply a deterministic rule (project to boundary, clamp one axis, or trade brightness for chromaticity) so transitions remain smooth and explainable in logs.

Evidence-first debugging: When CCT “wanders” under dimming or across units, the fastest proof split is to compare the command vector and the estimate:

  • Ch_ratio[] stable but CCT_est drifts: likely gain/temperature model mismatch or optical mixing drift.
  • Ch_ratio[] changes unexpectedly with the same targets: constraints/clamps or a non-deterministic mapping (missing matrix/LUT ownership).
  • CCT_est stable but perception is off: duv_est bias or sensor transfer mismatch (covered in calibration chapter).

Implementation checklist (scope-safe):

  • Separate brightness and chromaticity axes; do not embed brightness control inside “ratio”.
  • Use matrix/LUT output as the source of truth for the channel vector.
  • Apply Gain_k[] and Temp_coeff[] as a post-map correction (calibration), then clamp.
  • Always expose Ch_ratio[], I_set[], and CCT_est in telemetry for field proof.
Ch_ratio[ ] I_set[ ] CCT_est duv_est (optional)
Mixing space map: CCT vs output flux with a legal region A schematic 2D map showing CCT axis and output flux axis, with iso-CCT and iso-flux bands, a legal reachable region, and target vs estimated points. Side blocks show channel ratio vector and constraints. Mixing Space Map CCT axis × flux axis, with reachable “legal region” CCT → flux iso-flux iso-CCT legal region sat warm sat cool max flux target CCT_target + Lux_target actual CCT_est + Lux_est Mixer outputs Ch_ratio[ ] I_set[ ] duv_est (opt) Rules clamp to legal region preserve smooth ramps deterministic mapping ICNavigator • HCL
Cite this figure: Figure F3 — Mixing space map

H2-4 — Calibration: from LED binning to mixing matrix (and what must be stored)

Calibration goal: Keep color and brightness behavior consistent across units and over time. Mixing quality depends on calibration assets (gains, matrices, temperature coefficients, optional sensor transfer), and those assets must be stored with versioning and integrity so field behavior is provable.

What calibration must cover (minimum set):

  • Channel gain mismatch: differences from LED binning, optics, and assembly. Without per-channel gain, the same scene produces different CCT across fixtures.
  • Temperature coefficients: chromaticity and flux drift with temperature. A stable mixer needs coefficients that correct the mapping as the system warms up.
  • Sensor transfer (if feedback exists): sensor offset/scale must be aligned so closed-loop control is not “correcting toward a biased measurement”.

From characterization to a mixing matrix: A practical approach is to build a 2D mapping surface over (CCT, flux) and store it as a matrix/LUT. The mixer reads the matrix entry (and interpolates between entries), then applies calibration gains and temperature correction before clamping to actuator limits.

What must be stored in NVM (non-negotiable for field proof):

  • Gain_k[ ]: per-channel gain normalization that anchors brightness and color repeatability.
  • Mix_matrix / Mix_LUT: maps (CCT_target, Lux_target) to a channel vector (Ch_ratio[ ]).
  • Temp_coeff[ ]: corrects channel contributions vs temperature (prevents warm-up color drift).
  • Sensor_offset (optional): ties estimation to reality for stable closed-loop behavior.
  • CRC + version: prevents silent corruption and enables controlled updates.

Factory-only vs field-updatable boundaries: Calibration assets that require controlled measurement conditions should be factory-only, while small trims can be field-updatable. This separation avoids “fixing” a symptom by damaging the foundational mapping.

  • Factory-only (recommended): Mix_matrix/Mix_LUT and baseline Gain_k[ ] (requires instrumentation and controlled optics).
  • Field-updatable (limited): small offsets/trims and timestamps, always with integrity checks and audit trail.

Integrity rule: Updates must be atomic (write → verify CRC → commit). A valid Cal_version and Cal_crc are required before enabling the mixer, otherwise the system should fall back to a safe default profile and log the condition.

Cal_version Cal_crc Gain_k[ ] Temp_coeff[ ] Last_cal_ts
Calibration storage map: factory vs field vs config regions A memory block map dividing NVM into factory calibration, field calibration, and configuration regions. Each region contains labeled blocks and CRC/version tags, with a verify-and-commit flow. Calibration Storage Map (NVM) separate factory cal, field cal, and config — each with integrity tags Factory Cal (RO) Gain_k[ ] Mix_matrix Temp Cal_version Cal_crc Field Cal (RW) Sensor_offset (opt) Last_cal_ts CRC Config (RW) Scene table Schedule policy Integrity flow (atomic update) Write staging Verify CRC Commit pointer Audit log Reject / fallback ICNavigator • HCL

H2-5 — Scheduler/RTC design: Circadian curves, priorities, and overrides

Engineering goal: Convert a time-of-day idea into deterministic behavior. Ensure the system behaves predictably by defining how to switch between scenes and handle manual or safety overrides, based on a priority stack and RTC validity.

Scene Table Contract (Minimum Fields for Scheduling):

  • Time window: Scene’s active time period.
  • CCT_target: Desired color temperature for the scene.
  • Lux_target: Desired illumination for the scene (or total flux proxy).
  • Fade_time_ms: Transition time for the scene’s change.
  • Min/max clamps: Boundaries for illumination or CCT.

Priority Stack (How scene priorities are handled):

  • Safety clamps: Highest priority to ensure safety.
  • Manual override: Allows users to override the schedule.
  • Schedule: Default schedule behavior.
  • Default: Fallback to default scene if no other condition applies.

RTC Design Considerations (Important for accurate timing):

  • RTC_valid: Ensures RTC time is valid before running schedules.
  • RTC_ppm_est: Optional parameter for time drift estimation.
  • Scene_next_ts: Timestamp for when the next scene will start.
  • Priority_level: Current priority level in the priority stack.
  • Fade_time_ms: Time for the transition between scenes.
Scene Table + Priority Stack A schematic diagram showing the scene table and priority stack. The scene table rows specify time window, CCT_target, Lux_target, and fade time, while the priority stack determines which setpoint takes precedence. Scene Table + Priority Stack Scene table rows and priority stack determining active setpoints Scene Table Time Window CCT_target Lux_target Fade_time_ms Min/Max Clamps Priority Stack Safety Clamps Manual Override Schedule Default Active Setpoints ICNavigator • HCL

H2-6 — Sensor closed-loop: What to sense and how to avoid “hunting”

Engineering goal: Maintain stable feedback in closed-loop systems without oscillations or brightness/CCT fluctuations. Design rules for sensor integration and decoupling loops to avoid common issues like hunting or breathing effects.

Allowed sensors: Ambient Light Sensor (ALS), color/CCT sensor, and temperature sensor.

Closed-loop design rules:

  • Low-pass sensor estimation: Use low-pass filtering on sensor data to prevent high-frequency noise.
  • Deadband and rate limit: Apply deadband to reduce unnecessary actions when errors are small, and rate limits to prevent rapid changes.
  • Separate lux loop vs CCT loop: Decouple the lux control loop and the CCT control loop to avoid cross-interference using a matrix or independent controllers.

Fail-safe mechanisms: In case of sensor faults, the system should either freeze the current setpoint or revert to an open-loop system to prevent erratic behavior.

Evidence chain fields for sensor closed-loop:

  • ALS_raw: Raw value from the ambient light sensor.
  • ALS_lpf: Low-pass filtered ALS value.
  • CCTsensor_raw: Raw value from the color/CCT sensor.
  • CCT_est: Estimated CCT value from sensor data.
  • Loop_err_lux: Error between Lux_target and Lux_est.
  • Loop_err_cct: Error between CCT_target and CCT_est.
  • Sensor_status: Indicates whether the sensor is operating correctly.
Two-loop decoupled control for lux and CCT A diagram showing the decoupled control loops for lux and CCT, with a mixer matrix to combine the results into final channel commands. Includes rate limits and deadband blocks for stability. Two-loop Decoupled Control Lux control and CCT control, decoupled with a mixer matrix Lux Control Loop_err_lux CCT Control Loop_err_cct Mixer Matrix Ch_ratio[] → I_set[] Stability Deadband Rate Limit Sensor Feedback ALS_raw → ALS_lpf CCTsensor_raw → CCT_est ICNavigator • HCL

H2-7 — Ramps, fades, and perceptual smoothness (no visible stepping)

Engineering goal: Ensure smooth transitions without visible stepping at all dim levels. Use perceptual gamma mapping to make “steps in code” align with human visual perception.

Key ramp design elements:

  • Maximum slew rate per channel: The maximum change rate allowed for each channel to avoid abrupt transitions.
  • Synchronized multi-channel ramp: Ensures that multiple channels ramp together, preserving chromaticity.
  • Deep dimming stability: Keep steps sub-perceptual and avoid loop noise amplification.

Important evidence chain fields:

  • Ramp_slew[ ]: Maximum allowed slew rate for each channel.
  • Gamma_id: The gamma mapping applied to the ramp.
  • Step_size: Size of the individual steps in the ramp.
  • CCT_delta_per_step: Color temperature change per step.
  • Lux_delta_per_step: Lux change per step.
Ramp Coordinator A diagram showing the Ramp Coordinator with synchronized ramping for multiple channels, including per-channel slew rate clamps. Ramp Coordinator Synchronized ramps + per-channel slew clamps Ramp Coordinator Synchronize Channels Apply Slew Rate Channel 1 Slew rate clamp Channel 2 Slew rate clamp Step Size CCT_delta_per_step Lux_delta_per_step ICNavigator • HCL
Cite this figure: Figure F7 — Ramp coordinator

H2-8 — Temperature compensation and long-term chromaticity stability

Engineering goal: Compensate for CCT drift caused by temperature and aging while maintaining stable scene performance. Ensure long-term chromaticity stability without affecting the scene consistency.

Sources of drift:

  • LED junction temperature: Causes spectral shifts, which affect CCT.
  • Sensor temperature sensitivity: The sensor’s response changes with temperature, affecting the measurement.
  • Aging: LED channel efficacy decreases over time, which affects output brightness and color temperature.

Compensation approaches:

  • Temp-indexed gain correction: Apply a gain correction based on temperature.
  • Periodic re-normalization using sensor (if present): Recalibrate using sensor data at regular intervals to counteract aging effects.

Key evidence chain fields:

  • Temp_C: Current temperature value.
  • Gain_temp_adj[ ]: Gain adjustment based on temperature.
  • CCT_drift_est: Estimated CCT drift based on temperature.
  • Age_factor (optional): Optional aging compensation factor for long-term stability.
  • Comp_state: The current state of compensation (whether compensation is active or not).
Temp-comp loop overlay A diagram showing how temperature influences the correction table and adjusts mixer gains before output, ensuring long-term stability. Temperature Compensation Loop Temperature influencing correction table to adjust mixer gains Temperature Input Temp_C Gain Adjustment Gain_temp_adj[ ] Correction Table Temp-indexed Mixer Output Adjusted CCT ICNavigator • HCL

H2-9 — Scene persistence, interoperability boundaries, and “driver-agnostic” outputs

Goal: Define the output contract of the HCL engine to ensure portability across LED driver interfaces and topologies. The system logic should remain consistent regardless of the underlying driver hardware.

Output Contract of HCL Engine:

  • Per-channel normalized command (0–1): The normalized control signal for each channel, ensuring consistent output across all drivers.
  • Optional absolute current command (mA): If available, provides a more precise control value.

Persistence Rules:

  • What survives reboot: Scene ID, last setpoints, and manual override (TTL).
  • Reboot recovery: The system should restore the last known good state after reboot, including scene ID and last active setpoints.

Boundary Statements:

  • Protocol details: The protocol-related details (e.g., DALI, PWM, 0–10V) belong to interface pages; this page focuses only on defining the output contract in a clean, abstract manner.

Key Evidence Chain Fields:

  • Cmd_norm[ ]: The normalized command values for each channel.
  • Cmd_abs_mA[ ] (optional): The absolute current values (if supported).
  • Persist_flags: Flags indicating what data should persist across reboots.
  • Boot_restore_state: The state of the system when rebooting, indicating which scene or setpoints should be restored.
HCL Output Contract A diagram illustrating the HCL output contract, showing normalized command and absolute current command along with persistence flags and reboot recovery state. HCL Output Contract Defining normalized commands and persistence rules for driver-agnostic outputs Normalized Command Cmd_norm[ ] Absolute Current Command Cmd_abs_mA[ ] Persistence Flags Persist_flags Boot Restore State Boot_restore_state ICNavigator • HCL

H2-10 — Telemetry, fault handling, and field logs (what to record)

Goal: Ensure that HCL systems are diagnosable in the field without guesswork. Record key telemetry data, log faults, and enable efficient fault handling.

Minimum Log Set:

  • Setpoints: CCT, Lux, and other key scene parameters.
  • Estimates: Estimations of CCT and Lux based on sensor readings.
  • Sensor Status: Monitoring the health of sensors.
  • Active Scene: The currently active scene being executed.
  • Ramp State: The current state of any active ramping process.
  • Saturation Flags: Flags indicating if any channel has reached its saturation limit.

Fault Taxonomy:

  • Sensor Stale/Out-of-Range: If the sensor data is no longer valid or is out of expected range.
  • CCT Cannot Be Reached: If one or more channels are saturated and unable to reach the target CCT.
  • Drift Beyond Bounds: If the CCT or Lux drift exceeds allowed limits.

First Containment Actions:

  • Freeze CCT: Stop any changes to CCT to avoid further issues.
  • Revert to Open-Loop: If the feedback loop is compromised, revert to open-loop control.
  • Clamp Lux: Limit the Lux to a safe value if any channel reaches its saturation limit.

Key Evidence Chain Fields:

  • Fault_code: The code indicating the type of fault.
  • Saturation_mask: Flags indicating which channels have reached their saturation limits.
  • Sensor_stale_ms: The timestamp indicating when the sensor data became stale.
  • Reachability_err: Errors related to the reachability of target values.
  • Fallback_mode: The current mode the system has entered during fault handling.
Fault Tree + Log Snapshot A diagram showing a fault tree leading to the decision to record specific fields. It illustrates the fault classification and the logs to capture based on the identified issue. Fault Tree + Log Snapshot A fault tree guiding to the specific fields to record during fault diagnosis Fault Tree Fault Classification Log Fields Fault_code Saturation_mask ICNavigator • HCL

H2-11 — Validation & Field Debug Playbook (SOP)

Goal: turn “color looks wrong / brightness breathes / schedule unreliable” into deterministic field actions: Symptom → 10 s capture → isolate root class → first containment fix. This chapter stays driver-agnostic (no protocol or power-topology deep dive).

11.1 SOP template (always use the same 4-step format)

  1. Symptom: restate what the user sees (one sentence).
  2. What to measure (exactly 2 items): choose two fields that prove/deny the hypothesis fastest.
  3. How to isolate: route the case into one of the five root classes: Sensor, Calibration, Ramp, Scheduler/RTC, Reachability/Saturation.
  4. First fix (containment): a reversible “stop the pain” action (freeze/revert/clamp), not a final redesign.
Field rule: no “try tuning randomly”. Every decision must point to captured evidence fields.

11.2 Debug Capture Bundle (standard 10-second snapshot)

Capture last 10 seconds during the symptom (recommended 10–20 Hz logging; any stable rate is acceptable if timestamps are included). This bundle enables cross-device comparison and post-mortem debugging.

  1. Setpoints vs estimates: CCT_target, CCT_est, Lux_target, Lux_est
  2. Commands: Cmd_norm[ch] (fixed channel order Ch0..ChN; normalized 0..1)
  3. Environment: Temp_C
  4. State: Scene_ID
  5. Fault: Fault_code
Recommended meta (one-time, not per-sample): Cal_version, Gamma_id, RTC_valid, Boot_restore_state, Saturation_mask (if implemented). These do not change the HCL boundary and greatly reduce “guessing”.

MPN examples for building a reproducible debug rig

  1. Ambient light (ALS): VEML7700, OPT3001, TSL2591
  2. Spectral / CCT sensor: AS7341
  3. Temperature: TMP117, MCP9808
  4. RTC: DS3231M, PCF85063A, MCP7940N
  5. Multi-channel constant-current sink (for lab fixtures): TLC59711
  6. Example LED-driver backends (only to reproduce “saturation/reachability” cases): AL8860, TPS92520-Q1
The SOP is independent of these parts. They are reference building blocks to reproduce symptoms and validate fixes consistently.

11.3 Symptom: “CCT looks wrong” (stable bias or sudden shift)

  1. What to measure (2): (1) CCT_target vs CCT_est; (2) Cmd_norm[ch] (look for rail-to-rail saturation).
  2. How to isolate:
    • Calibration if CCT_est is stable but offset from CCT_target across scenes (unit-to-unit repeatable).
    • Sensor if CCT_est jumps while CCT_target stays smooth (often coincides with sensor status changes).
    • Reachability/Saturation if one channel pins near 0 or 1 for long periods; the requested chromaticity is outside the “legal region”.
    • Scheduler/RTC if the mismatch appears exactly at schedule boundaries (scene transitions are wrong, not the mixer).
  3. First fix (containment):
    • Freeze chromaticity: hold last good Cmd_norm ratio; continue only lux changes.
    • If saturated: clamp target to reachable range (scene clamps) and log Fault_code as “unreachable”.
    • If sensor suspected: revert to open-loop scene until sensor recovers; keep logs for post analysis.
MPN: AS7341 (spectral/CCT sensor) MPN: VEML7700 / OPT3001 / TSL2591 (ALS)

11.4 Symptom: “Brightness breathes / hunts” (periodic up-down)

  1. What to measure (2): (1) Lux_target vs Lux_est; (2) Cmd_norm[ch] (is the actuator “chasing”?).
  2. How to isolate:
    • Sensor if Lux_est is noisy/stale and the command oscillates at the sensor sample rate.
    • Ramp if hunting only appears during fades (step/ramp quantization interacts with feedback).
    • Temperature coupling if breathing correlates with fast Temp_C changes (compensation overlays the lux loop).
  3. First fix (containment):
    • Increase deadband / reduce control update rate; enforce per-channel slew clamps for stability.
    • Temporarily disable lux closed-loop in deep dim zones; keep schedule and CCT setpoints.
    • If sensor suspected: swap to a known-good ALS module and re-capture the 10 s bundle.
MPN: OPT3001 (ALS) MPN: TMP117 / MCP9808 (temperature)

11.5 Symptom: “Schedule unreliable” / “RTC invalid after reboot”

  1. What to measure (2): (1) RTC_valid; (2) Scene_ID (and whether it matches the expected time window).
  2. How to isolate:
    • Scheduler/RTC if RTC_valid=0 but the schedule still advances scenes (missing gating rule).
    • Persistence if reboot restores an unexpected Scene_ID (wrong restore priority or stale NVM).
    • Priority override if a manual override persists longer than intended (override TTL not enforced).
  3. First fix (containment):
    • If RTC_valid=0: lock to “default safe scene” and block schedule transitions until time becomes valid.
    • Force a single-source-of-truth reset: clear override flags; restore last known good scene; log the restore state.
MPN: DS3231M (high-accuracy RTC) MPN: PCF85063A (low-power RTC) MPN: MCP7940N (RTC + SRAM)

11.6 Symptom: “Deep dim fades look stepped” (visible quantization)

  1. What to measure (2): (1) Gamma_id; (2) Lux_est (or a lux proxy derived from output).
  2. How to isolate:
    • Ramp if step visibility aligns with command updates (too-large step size or insufficient internal update rate).
    • Multi-channel sync if CCT “wobbles” during dimming (channels are not ramped coherently).
    • Sensor interaction if stepping appears only when closed-loop is enabled at very low lux.
  3. First fix (containment):
    • Switch to a finer gamma / smaller effective step size in deep-dim region.
    • Enforce synchronized multi-channel ramps (coordinator clamps per-channel slew together).
    • Disable lux closed-loop below a minimum lux threshold; keep CCT open-loop + temperature compensation.
MPN (lab fixture): TLC59711 (12-ch CC sink)

11.7 Symptom: “Thermal drift over a day” (color/brightness slowly shifts)

  1. What to measure (2): (1) Temp_C; (2) CCT_target vs CCT_est (drift direction and magnitude).
  2. How to isolate:
    • Temperature compensation if drift is strongly correlated with Temp_C (junction spectral shift or sensor tempco).
    • Aging / gain change if drift accumulates without major temperature movement (channel efficacy changes).
    • Reachability if compensation pushes channels into saturation in hot states (unreachable target at temperature extremes).
  3. First fix (containment):
    • Clamp compensation gains; keep scenes stable (avoid “scene breaking” due to over-correction).
    • Prefer periodic re-normalization using a stable sensor (if present); otherwise revert to a conservative temp-indexed table.
MPN: TMP117 (high-accuracy temperature) MPN: MCP9808 (compact I²C temperature)

Figure F11 — Debug decision flow (symptom → capture → isolate → first fix)

F11 — Field Debug Flow (HCL) Always: Symptom → 10s capture → isolate root class → containment fix Symptom (entry) CCT looks wrong Brightness breathes Schedule unreliable Deep dim stepping Thermal drift (hours) Capture (last 10 s) Setpoints / Estimates / Commands / State / Fault CCT_target, CCT_est Lux_target, Lux_est Cmd_norm[ch] Temp_C Scene_ID Fault_code Isolate (root class) Sensor path Calibration path Ramp path Scheduler/RTC path Reachability path First containment fix Freeze / revert open-loop Clamp targets / limit slew Keep logging (10 s bundle) conditions → path examples stale/noisy → Sensor stable bias → Calibration stepping → Ramp RTC invalid → Scheduler pinned cmd → Reachability

The flow enforces a single entry: capture the 10-second bundle first, then isolate into one root class before applying any fix.

Request a Quote

Accepted Formats

pdf, csv, xls, xlsx, zip

Attachment

Drag & drop files here or use the button below.

H2-12 — FAQs (HCL troubleshooting, evidence-based)

Format per FAQ: Short answer (1 sentence) + What to measure (2 items) + First fix (1 action). Each answer stays inside the HCL engine boundary and points back to earlier chapters.

Field rule: do not “tune by feel”. Capture evidence first using CCT_target/est, Lux_target/est, Cmd_norm[ch], Temp_C, Scene_ID, Fault_code before applying any containment fix.
Q1 CCT target is correct, but it still looks “green/pink”—calibration matrix or sensor bias? → H2-4 / H2-6

Short answer: A stable green/pink tint usually comes from an incorrect mixing/calibration matrix or a biased color sensor estimate, even when CCT is numerically “right”.

  • What to measure: (1) CCT_target vs CCT_est while holding the same scene; (2) Cmd_norm[ch] to confirm channel ratio is not being distorted by the loop.
  • First fix: Freeze chromaticity (hold channel ratio), then re-validate matrix/gains with a known-good sensor reference.
MPN examples: Spectral/CCT sensor: AS7341 • ALS (for lux loop separation): OPT3001 / VEML7700
Q2 Brightness “breathes” every few seconds—ALS filtering or loop gain too high? → H2-6 / H2-2

Short answer: Periodic breathing is typically a closed-loop instability driven by noisy/stale ALS data or too-aggressive control updates (gain + rate).

  • What to measure: (1) Lux_target vs Lux_est to see oscillation; (2) Cmd_norm[ch] to confirm the actuator is “chasing” the estimate.
  • First fix: Increase deadband and enforce a stricter slew limit; if needed, temporarily run lux in open-loop while keeping CCT control.
MPN examples: ALS: OPT3001 / TSL2591 • Temperature (to check coupling): TMP117
Q3 Scene transitions shift CCT briefly—ramp coordination or channel slew clamps? → H2-7 / H2-3

Short answer: Brief CCT shifts during transitions usually indicate multi-channel ramps are not synchronized, or per-channel slew clamps are unequal and distort chromaticity mid-fade.

  • What to measure: (1) CCT_est during the fade window; (2) Cmd_norm[ch] trajectories to verify channels change proportionally.
  • First fix: Enable a ramp coordinator that enforces synchronized channel ramps and shared slew constraints.
MPN examples: Lab multi-channel current sink for reproducible ramps: TLC59711
Q4 Schedule works for a day then drifts—RTC validity, drift, or override priority? → H2-5

Short answer: “Good for one day then wrong” is often RTC drift/invalid time, or an override priority/TTL that silently takes over the schedule state machine.

  • What to measure: (1) RTC_valid (and any drift estimate if logged); (2) Scene_ID vs expected time window to spot priority overrides.
  • First fix: Gate schedule execution on RTC_valid; when invalid, lock to a safe default scene and clear expired overrides.
MPN examples: RTC: DS3231M / PCF85063A / MCP7940N
Q5 At very low dim levels, color jumps—gamma mapping or quantization of commands? → H2-7 / H2-9

Short answer: Color jumps at deep dim are usually perceptual gamma mismatches or command quantization where tiny numeric steps become visible, especially across multiple channels.

  • What to measure: (1) Gamma_id used in deep-dim; (2) Cmd_norm[ch] step granularity near the lowest levels.
  • First fix: Switch to a finer deep-dim gamma/step policy and enforce synchronized multi-channel stepping.
MPN examples: For repeatable deep-dim evaluation: TLC59711 (multi-channel sink) + AS7341 (CCT sensor)
Q6 Cold start color is off, warms up and changes—temperature compensation missing? → H2-8 / H2-4

Short answer: A cold-start CCT shift that settles after warm-up typically indicates missing/incorrect temperature compensation (LED spectral shift and sensor tempco).

  • What to measure: (1) Temp_C during warm-up; (2) CCT_est drift relative to CCT_target in a fixed scene.
  • First fix: Apply a conservative temperature-indexed gain correction and clamp compensation so scenes remain stable.
MPN examples: Temperature: TMP117 / MCP9808
Q7 CCT cannot reach the warmest/coolest scenes—channel saturation or wrong mixing bounds? → H2-3 / H2-10

Short answer: Unreachable extreme CCT scenes are usually saturation/reachability issues: one channel hits its limit, or mixing bounds define a “legal region” that excludes the requested setpoint.

  • What to measure: (1) Cmd_norm[ch] (look for pinned near 0/1); (2) Fault_code / saturation flags if implemented.
  • First fix: Clamp scene targets to the reachable region and log the reachability fault for recalibration/model updates.
MPN examples: Backend drivers for saturation testing only: AL8860 • TPS92520-Q1
Q8 Two fixtures show different CCT on the same scene—binning variation or stored gains? → H2-4

Short answer: Unit-to-unit CCT differences with identical scene IDs typically come from LED binning variation and/or mismatched stored calibration gains and matrices.

  • What to measure: (1) Cal_version and calibration CRC (if logged) to confirm same dataset; (2) CCT_est under the same Cmd_norm to separate hardware binning vs config drift.
  • First fix: Reapply the correct calibration bundle (gains/matrix) and lock factory-only regions from field overwrite.
MPN examples: Reference sensor for cross-unit validation: AS7341 • Field-stable NVM (examples): 24LC256 (EEPROM)
Q9 Sensor sometimes reads nonsense—stale detection or out-of-range handling? → H2-10 / H2-6

Short answer: Intermittent “nonsense” sensor readings usually mean stale frames, I²C glitches, or out-of-range values not being gated before they enter the estimator/loop.

  • What to measure: (1) Fault_code and sensor status flags (stale/out-of-range); (2) Lux_est or CCT_est spikes vs normal ranges to confirm gating failure.
  • First fix: On invalid data, freeze estimates and revert to open-loop scene until sensor recovers.
MPN examples: ALS: OPT3001 / VEML7700 • Spectral: AS7341
Q10 Manual override doesn’t “stick” after reboot—persistence flags or restore policy? → H2-9

Short answer: Override loss after reboot is usually a persistence/restore policy bug: flags not set, TTL not stored, or boot restore prioritizes schedule/default over manual state.

  • What to measure: (1) Boot_restore_state (what was restored); (2) Scene_ID and last override state fields (if logged) to confirm policy ordering.
  • First fix: Persist override with TTL and restore it only if still valid; otherwise fall back deterministically to schedule.
MPN examples: NVM (examples): 24LC256 (EEPROM) • MB85RC256V (FRAM, optional)
Q11 After months, scenes look different—aging drift or recalibration strategy? → H2-8 / H2-4

Short answer: Long-term scene changes are typically aging drift: channel efficacy shifts and sensor reference drift require periodic re-normalization or scheduled recalibration to keep chromaticity consistent.

  • What to measure: (1) trend of CCT_est vs CCT_target over time; (2) Temp_C to rule out “seasonal temperature” effects masquerading as aging.
  • First fix: Add a controlled recalibration routine (factory reference or trusted sensor) and store versioned gains with CRC.
MPN examples: Reference sensing: AS7341 • Temperature: TMP117
Q12 CCT is stable, but perceived comfort is poor—scene curve design or fade timing? → H2-5 / H2-7

Short answer: Comfort issues with stable CCT often come from schedule curve choices and fade timing: transitions may be too fast/slow or occur at the wrong times, even if the setpoint is “correct”.

  • What to measure: (1) Scene_ID timeline with fade windows; (2) CCT_target step/ramp profile (how aggressively it moves).
  • First fix: Adjust scene table curves and extend fades to keep perceptual steps below noticeability.
MPN examples: RTC for stable scheduling: DS3231M / PCF85063A

Figure F12 — FAQ coverage map (questions → chapter anchors)

F12 — FAQ Map (Q1..Q12 → H2 anchors) Each FAQ points back to the evidence chain and one or two chapters above. Questions Chapter anchors H2-2 Timing model H2-3 CCT mixing H2-4 Calibration / NVM H2-5 Scheduler / RTC H2-6 Sensor closed-loop H2-7 Ramps / gamma H2-8 Temp compensation H2-9 Persistence / contract H2-10 Telemetry / faults Q1 green/pink tint Q2 breathing Q3 transition shift Q4 schedule drift Q5 low-dim jumps Q6 cold start shift Q7 unreachable CCT Q8 fixture mismatch Q9 sensor nonsense Q10 override lost Q11 months drift Q12 comfort poor

Use this map to keep the FAQ answers “inside scope”: each question must point back to the referenced chapter(s) and the evidence chain fields.