65
68
#if PWM_CHANNELS >= 4
71
// disable the power channel, if relevant
73
LED_ENABLE_PORT &= ~(1 << LED_ENABLE_PIN);
75
#ifdef LED_ENABLE2_PIN
76
LED_ENABLE2_PORT &= ~(1 << LED_ENABLE2_PIN);
81
// enable the power channel, if relevant
83
LED_ENABLE_PORT |= (1 << LED_ENABLE_PIN);
85
#ifdef LED_ENABLE2_PIN
86
LED_ENABLE2_PORT |= (1 << LED_ENABLE2_PIN);
71
89
#ifdef USE_TINT_RAMPING
90
#ifndef TINT_RAMPING_CORRECTION
91
#define TINT_RAMPING_CORRECTION 26 // 140% brightness at middle tint
72
93
// calculate actual PWM levels based on a single-channel ramp
73
94
// and a global tint value
74
uint8_t brightness = pgm_read_byte(pwm1_levels + level);
95
uint8_t brightness = PWM_GET(pwm1_levels, level);
75
96
uint8_t warm_PWM, cool_PWM;
93
114
// correction is only necessary when PWM is fast
94
115
if (level > HALFSPEED_LEVEL) {
95
116
base_PWM = brightness
96
+ ((((uint16_t)brightness) * 26 / 64) * triangle_wave(mytint) / 255);
117
+ ((((uint16_t)brightness) * TINT_RAMPING_CORRECTION / 64) * triangle_wave(mytint) / 255);
99
120
cool_PWM = (((uint16_t)mytint * (uint16_t)base_PWM) + 127) / 255;
106
127
#if PWM_CHANNELS >= 1
107
PWM1_LVL = pgm_read_byte(pwm1_levels + level);
128
PWM1_LVL = PWM_GET(pwm1_levels, level);
109
130
#if PWM_CHANNELS >= 2
110
PWM2_LVL = pgm_read_byte(pwm2_levels + level);
131
PWM2_LVL = PWM_GET(pwm2_levels, level);
112
133
#if PWM_CHANNELS >= 3
113
PWM3_LVL = pgm_read_byte(pwm3_levels + level);
134
PWM3_LVL = PWM_GET(pwm3_levels, level);
115
136
#if PWM_CHANNELS >= 4
116
PWM4_LVL = pgm_read_byte(pwm4_levels + level);
137
PWM4_LVL = PWM_GET(pwm4_levels, level);
119
140
#endif // ifdef USE_TINT_RAMPING
138
159
gt --; // convert 1-based number to 0-based
142
163
#if PWM_CHANNELS >= 1
143
target = pgm_read_byte(pwm1_levels + gt);
164
target = PWM_GET(pwm1_levels, gt);
144
165
if ((gt < actual_level) // special case for FET-only turbo
145
166
&& (PWM1_LVL == 0) // (bypass adjustment period for first step)
146
&& (target == 255)) PWM1_LVL = 255;
167
&& (target == PWM_TOP)) PWM1_LVL = PWM_TOP;
147
168
else if (PWM1_LVL < target) PWM1_LVL ++;
148
169
else if (PWM1_LVL > target) PWM1_LVL --;
150
171
#if PWM_CHANNELS >= 2
151
target = pgm_read_byte(pwm2_levels + gt);
172
target = PWM_GET(pwm2_levels, gt);
152
173
if (PWM2_LVL < target) PWM2_LVL ++;
153
174
else if (PWM2_LVL > target) PWM2_LVL --;
155
176
#if PWM_CHANNELS >= 3
156
target = pgm_read_byte(pwm3_levels + gt);
177
target = PWM_GET(pwm3_levels, gt);
157
178
if (PWM3_LVL < target) PWM3_LVL ++;
158
179
else if (PWM3_LVL > target) PWM3_LVL --;
160
181
#if PWM_CHANNELS >= 4
161
target = pgm_read_byte(pwm4_levels + gt);
182
target = PWM_GET(pwm4_levels, gt);
162
183
if (PWM4_LVL < target) PWM4_LVL ++;
163
184
else if (PWM4_LVL > target) PWM4_LVL --;
166
187
// did we go far enough to hit the next defined ramp level?
167
188
// if so, update the main ramp level tracking var
168
if ((PWM1_LVL == pgm_read_byte(pwm1_levels + gt))
189
if ((PWM1_LVL == PWM_GET(pwm1_levels, gt))
169
190
#if PWM_CHANNELS >= 2
170
&& (PWM2_LVL == pgm_read_byte(pwm2_levels + gt))
191
&& (PWM2_LVL == PWM_GET(pwm2_levels, gt))
172
193
#if PWM_CHANNELS >= 3
173
&& (PWM3_LVL == pgm_read_byte(pwm3_levels + gt))
194
&& (PWM3_LVL == PWM_GET(pwm3_levels, gt))
175
196
#if PWM_CHANNELS >= 4
176
&& (PWM4_LVL == pgm_read_byte(pwm4_levels + gt))
197
&& (PWM4_LVL == PWM_GET(pwm4_levels, gt))