优化亮度平滑过渡

This commit is contained in:
2026-07-27 12:01:22 +08:00
parent faa3a1bdc1
commit 38fc1d2ea3
3 changed files with 48 additions and 13 deletions
@@ -124,11 +124,13 @@ static void Pairing_Feedback_Apply(uint8_t on)
if(on)
{
Start_PWM();
Light_Transition_SyncBrightness(BRIGHTNESS_MAX_PERCENT);
W_PWM_duty = 100U;
C_PWM_duty = 0U;
}
else
{
Light_Transition_SyncBrightness(0U);
W_PWM_duty = 0U;
C_PWM_duty = 0U;
Stop_PWM();
@@ -143,6 +145,9 @@ static void Pairing_Feedback_Restore(void)
C_PWM = pairing_saved_c;
Brightness = pairing_saved_brightness;
Mode = pairing_saved_mode;
Light_Transition_SyncBrightness(
pairing_saved_status == POWERON ? pairing_saved_brightness : 0U);
W_PWM_duty = pairing_saved_w_duty;
C_PWM_duty = pairing_saved_c_duty;
@@ -5,6 +5,7 @@
volatile uint8_t Light_Transition_FadeActive;
#define LIGHT_FADE_STEP 1U
#define BRIGHTNESS_SMOOTH_SHIFT 4U
/*
* Gamma 1.8, mapping APP levels 1..100 to a stable physical range of
@@ -24,6 +25,36 @@ static const uint16_t brightness_gamma_q12[100] = {
3515U, 3577U, 3640U, 3704U, 3768U, 3832U, 3897U, 3963U, 4029U, 4096U
};
static uint16_t current_brightness_q12;
static uint16_t brightness_scale_for_level(uint8_t level)
{
if(level == 0U) return 0U;
if(level < BRIGHTNESS_MIN_PERCENT) level = BRIGHTNESS_MIN_PERCENT;
if(level > BRIGHTNESS_MAX_PERCENT) level = BRIGHTNESS_MAX_PERCENT;
return brightness_gamma_q12[level - 1U];
}
static uint16_t approach_brightness_scale(uint16_t current, uint16_t target)
{
uint16_t delta;
uint16_t step;
if(current == target) return current;
if(current < target)
{
delta = target - current;
step = (uint16_t)((delta + ((1U << BRIGHTNESS_SMOOTH_SHIFT) - 1U)) >>
BRIGHTNESS_SMOOTH_SHIFT);
return current + step;
}
delta = current - target;
step = (uint16_t)((delta + ((1U << BRIGHTNESS_SMOOTH_SHIFT) - 1U)) >>
BRIGHTNESS_SMOOTH_SHIFT);
return current - step;
}
static uint16_t approach_target(uint16_t current, uint16_t target)
{
if(current < target)
@@ -39,27 +70,25 @@ static uint16_t approach_target(uint16_t current, uint16_t target)
return current;
}
void Light_Transition_SyncBrightness(uint8_t level)
{
current_brightness_q12 = brightness_scale_for_level(level);
}
void Light_Transition_Task(void)
{
uint8_t target_brightness = 0U;
uint16_t target_w;
uint16_t target_c;
uint16_t target_brightness_scale;
uint16_t brightness_scale;
if(deviceStatus != POWEROFF) target_brightness = Brightness;
if(target_brightness > BRIGHTNESS_MAX_PERCENT)
target_brightness = BRIGHTNESS_MAX_PERCENT;
if(target_brightness == 0U)
{
brightness_scale = 0U;
}
else
{
if(target_brightness < BRIGHTNESS_MIN_PERCENT)
target_brightness = BRIGHTNESS_MIN_PERCENT;
brightness_scale = brightness_gamma_q12[target_brightness - 1U];
}
target_brightness_scale = brightness_scale_for_level(target_brightness);
current_brightness_q12 =
approach_brightness_scale(current_brightness_q12,
target_brightness_scale);
brightness_scale = current_brightness_q12;
target_w =
(uint16_t)(((uint32_t)W_PWM * brightness_scale + 2048U) >> 12);
@@ -9,5 +9,6 @@ extern volatile uint8_t Light_Transition_FadeActive;
#define Light_Transition_RequestOff() (Light_Transition_FadeActive = 1U)
void Light_Transition_Task(void);
void Light_Transition_SyncBrightness(uint8_t level);
#endif