diff options
| -rw-r--r-- | hwdef-noctigon-m44.c | 84 | ||||
| -rw-r--r-- | hwdef-noctigon-m44.h | 4 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/cfg-noctigon-m44.h | 12 |
3 files changed, 51 insertions, 49 deletions
diff --git a/hwdef-noctigon-m44.c b/hwdef-noctigon-m44.c index 0c73005..776cb82 100644 --- a/hwdef-noctigon-m44.c +++ b/hwdef-noctigon-m44.c @@ -7,6 +7,8 @@ #include "chan-rgbaux.c" +void set_level_zero(); + void set_level_ch1(uint8_t level); void set_level_ch2(uint8_t level); void set_level_both(uint8_t level); @@ -53,26 +55,33 @@ Channel channels[] = { // set new values for both channels, // handling any possible combination // and any before/after state -void set_pwms(uint16_t ch1_pwm, uint16_t ch2_pwm, uint16_t top) { - bool was_on = (CH1_PWM>0) | (CH2_PWM>0); - bool now_on = (ch1_pwm>0) | (ch2_pwm>0); - - if (! now_on) { - CH1_PWM = 0; - CH2_PWM = 0; - PWM_TOP = PWM_TOP_INIT; - PWM_CNT = 0; - CH1_ENABLE_PORT &= ~(1 << CH1_ENABLE_PIN); // disable opamp - CH2_ENABLE_PORT &= ~(1 << CH2_ENABLE_PIN); // disable opamp - return; - } +void set_pwms(uint16_t ch1_pwm, uint16_t ch2_pwm, uint16_t top, + uint8_t ch1_on, uint8_t ch2_on) { + + bool was_on = (CH1_PWM>0) || (CH2_PWM>0) + || ( CH1_ENABLE_PORT & (1 << CH1_ENABLE_PIN) ) + || ( CH2_ENABLE_PORT & (1 << CH2_ENABLE_PIN) ); + bool now_on = (ch1_pwm>0) || (ch2_pwm>0) || ch1_on || ch2_on; + + // phase-correct PWM at zero (for flicker-free moon), + // fast PWM otherwise + if (ch1_pwm || ch2_pwm) + TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6) + | (1<<WGM13) | (1<<WGM12) // fast adjustable PWM (DS table 12-5) + //| (1<<WGM13) | (0<<WGM12) // phase-correct adjustable PWM (DS table 12-5) + ; + else + TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6) + //| (1<<WGM13) | (1<<WGM12) // fast adjustable PWM (DS table 12-5) + | (1<<WGM13) | (0<<WGM12) // phase-correct adjustable PWM (DS table 12-5) + ; - if (ch1_pwm) + if (ch1_pwm || ch1_on) CH1_ENABLE_PORT |= (1 << CH1_ENABLE_PIN); // enable opamp else CH1_ENABLE_PORT &= ~(1 << CH1_ENABLE_PIN); // disable opamp - if (ch2_pwm) + if (ch2_pwm || ch2_on) CH2_ENABLE_PORT |= (1 << CH2_ENABLE_PIN); // enable opamp else CH2_ENABLE_PORT &= ~(1 << CH2_ENABLE_PIN); // disable opamp @@ -90,41 +99,34 @@ void set_pwms(uint16_t ch1_pwm, uint16_t ch2_pwm, uint16_t top) { if (! was_on) PWM_CNT = 0; } -void set_level_ch1(uint8_t level) { - if (0 == level) - return set_pwms(0, 0, PWM_TOP_INIT); +void set_level_zero() { + CH1_PWM = 0; + CH2_PWM = 0; + PWM_TOP = PWM_TOP_INIT; + PWM_CNT = 0; + CH1_ENABLE_PORT &= ~(1 << CH1_ENABLE_PIN); // disable opamp + CH2_ENABLE_PORT &= ~(1 << CH2_ENABLE_PIN); // disable opamp +} - level --; +void set_level_ch1(uint8_t level) { uint16_t pwm = PWM_GET(pwm1_levels, level); uint16_t top = PWM_GET(pwm_tops, level); - set_pwms(pwm, 0, top); + set_pwms(pwm, 0, top, 1, 0); } void set_level_ch2(uint8_t level) { - if (0 == level) - return set_pwms(0, 0, PWM_TOP_INIT); - - level --; uint16_t pwm = PWM_GET(pwm1_levels, level); uint16_t top = PWM_GET(pwm_tops, level); - set_pwms(0, pwm, top); + set_pwms(0, pwm, top, 0, 1); } void set_level_both(uint8_t level) { - if (0 == level) - return set_pwms(0, 0, PWM_TOP_INIT); - - level --; uint16_t pwm = PWM_GET(pwm1_levels, level); uint16_t top = PWM_GET(pwm_tops, level); - set_pwms(pwm, pwm, top); + set_pwms(pwm, pwm, top, 1, 1); } void set_level_blend(uint8_t level) { - if (0 == level) - return set_pwms(0, 0, PWM_TOP_INIT); - - level --; PWM_DATATYPE ch1_pwm, ch2_pwm; PWM_DATATYPE brightness = PWM_GET(pwm1_levels, level); PWM_DATATYPE top = PWM_GET(pwm_tops, level); @@ -133,17 +135,11 @@ void set_level_blend(uint8_t level) { calc_2ch_blend(&ch1_pwm, &ch2_pwm, brightness, top, blend); // don't turn off either emitter entirely while using middle blends - if ((0 == ch1_pwm) && (blend < 255)) ch1_pwm = 1; - if ((0 == ch2_pwm) && (blend > 0)) ch2_pwm = 1; - - set_pwms(ch1_pwm, ch2_pwm, top); + set_pwms(ch1_pwm, ch2_pwm, top, + blend < 255, blend > 0); } void set_level_auto(uint8_t level) { - if (0 == level) - return set_pwms(0, 0, PWM_TOP_INIT); - - level --; PWM_DATATYPE ch1_pwm, ch2_pwm; PWM_DATATYPE brightness = PWM_GET(pwm1_levels, level); PWM_DATATYPE top = PWM_GET(pwm_tops, level); @@ -153,7 +149,9 @@ void set_level_auto(uint8_t level) { calc_2ch_blend(&ch1_pwm, &ch2_pwm, brightness, top, blend); - set_pwms(ch1_pwm, ch2_pwm, top); + // don't turn off either emitter entirely + // (it blinks pretty bright when the regulator turns on mid-ramp) + set_pwms(ch1_pwm, ch2_pwm, top, 1, 1); } diff --git a/hwdef-noctigon-m44.h b/hwdef-noctigon-m44.h index f69fdd5..d02d8dd 100644 --- a/hwdef-noctigon-m44.h +++ b/hwdef-noctigon-m44.h @@ -163,6 +163,7 @@ inline void hwdef_setup() { // pre-scale for timer: N = 1 // Linear opamp PWM for both main and 2nd LEDs (10-bit) // WGM1[3:0]: 1,0,1,0: PWM, Phase Correct, adjustable (DS table 12-5) + // WGM1[3:0]: 1,1,1,0: PWM, Fast, adjustable (DS table 12-5) // CS1[2:0]: 0,0,1: clk/1 (No prescaling) (DS table 12-6) // COM1A[1:0]: 1,0: PWM OC1A in the normal direction (DS table 12-4) // COM1B[1:0]: 1,0: PWM OC1B in the normal direction (DS table 12-4) @@ -171,7 +172,8 @@ inline void hwdef_setup() { | (1<<COM1B1) | (0<<COM1B0) // PWM 1B in normal direction (DS table 12-4) ; TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6) - | (1<<WGM13) | (0<<WGM12) // phase-correct adjustable PWM (DS table 12-5) + | (1<<WGM13) | (1<<WGM12) // fast adjustable PWM (DS table 12-5) + //| (1<<WGM13) | (0<<WGM12) // phase-correct adjustable PWM (DS table 12-5) ; // set PWM resolution diff --git a/spaghetti-monster/anduril/cfg-noctigon-m44.h b/spaghetti-monster/anduril/cfg-noctigon-m44.h index 92cf38f..127bd31 100644 --- a/spaghetti-monster/anduril/cfg-noctigon-m44.h +++ b/spaghetti-monster/anduril/cfg-noctigon-m44.h @@ -47,14 +47,16 @@ // channel 2 // output: unknown, 6000 lm? #define RAMP_SIZE 150 -// abstract ramp (power is split between both sets of LEDs) +// "100% power" ramp +// level_calc.py 5.01 1 150 7135 0 2.0 5000 --pwm dyn:64:16384:511:5 +// (with manual tweaks) +#define PWM1_LEVELS 0,1,1,2,2,3,4,5,6,6,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,11,11,12,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,31,32,34,35,37,39,40,42,44,46,48,50,52,54,57,59,62,64,67,69,72,75,78,81,84,87,91,94,98,101,105,109,113,117,121,126,130,135,140,145,150,155,160,165,171,177,183,189,195,201,208,214,221,228,236,243,251,258,266,274,283,291,300,309,318,328,337,347,357,368,378,389,400,411,423,435,447,459,472,484,498,511 +#define PWM_TOPS 16383,16383,10002,11695,8083,9374,9793,7993,8291,7017,7180,6235,5431,5556,4927,4385,3916,3511,3159,2852,2585,2349,2142,1958,1795,1648,1517,1398,1290,1193,1104,1023,950,883,822,765,714,667,623,582,632,610,588,566,544,512,535,505,523,494,509,480,492,502,509,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511 +// max "200% power" ramp and tops // 1-130: 0 to 100% power // level_calc.py 5.01 1 130 7135 2 0.2 2000 --pwm dyn:64:16383:511 // 131 to 150: 101% to 200% power // level_calc.py 6.44 1 150 7135 1 0.2 2000 --pwm dyn:74:16383:1022 -#define PWM1_LEVELS 1,1,1,2,2,2,3,3,4,5,5,6,7,8,9,10,11,12,13,15,16,18,19,21,22,24,26,28,29,31,33,35,37,40,42,44,46,48,50,52,54,56,58,59,61,62,63,64,65,66,66,66,66,65,64,62,60,58,54,50,46,41,35,28,20,21,22,24,25,26,27,29,30,32,33,35,37,38,40,42,44,46,48,50,53,55,57,60,63,65,68,71,74,77,80,83,87,90,94,98,102,106,110,114,118,123,128,132,137,142,148,153,159,164,170,176,183,189,196,202,209,216,224,231,239,247,255,263,272,281,290,299,309,318,328,339,349,360,371,382,394,406,418,430,443,456,469,483,497,511 -#define PWM_TOPS 16383,13650,10715,15388,11902,8195,12771,9834,12258,13423,11192,11947,12284,12363,12271,12064,11775,11428,11039,11469,10973,11132,10595,10601,10054,9971,9833,9655,9122,8923,8704,8473,8232,8196,7932,7668,7408,7152,6901,6656,6417,6186,5961,5647,5444,5163,4899,4653,4422,4206,3941,3697,3470,3210,2971,2707,2466,2245,1968,1717,1489,1251,1005,756,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511 -// max "200% power" ramp and tops //#define PWM2_LEVELS 2,2,2,3,3,4,4,5,6,7,8,9,10,11,13,14,16,17,19,21,23,25,28,30,33,35,38,41,44,47,50,54,57,60,64,67,71,74,78,81,84,88,91,94,97,99,101,103,105,106,107,107,107,106,105,102,99,95,90,84,77,68,58,47,34,36,38,40,42,44,47,49,52,54,57,60,63,66,69,73,76,80,83,87,91,96,100,104,109,114,119,124,130,135,141,147,153,160,166,173,180,187,195,203,211,219,228,236,245,255,264,274,285,295,306,317,329,340,353,365,378,391,405,419,433,448,463,479,495,511,530,550,570,591,612,634,657,680,705,730,755,782,809,837,865,895,925,957,989,1022 //#define PWM3_LEVELS 16383,13234,9781,13826,9593,13434,9973,12021,12900,13193,13150,12899,12508,12023,12666,11982,12181,11422,11393,11247,11018,10731,10826,10434,10365,9927,9767,9565,9332,9076,8806,8693,8395,8096,7928,7626,7439,7143,6948,6665,6393,6203,5946,5700,5465,5187,4926,4681,4451,4195,3957,3700,3463,3213,2983,2718,2476,2231,1986,1742,1501,1245,997,756,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511 #define DEFAULT_LEVEL 70 @@ -62,7 +64,7 @@ #define HALFSPEED_LEVEL 10 #define QUARTERSPEED_LEVEL 2 -#define RAMP_SMOOTH_FLOOR 10 // level 1 is unreliable (?) +#define RAMP_SMOOTH_FLOOR 1 #define RAMP_SMOOTH_CEIL 130 // 10, 30, 50, [70], 90, 110, [130] #define RAMP_DISCRETE_FLOOR 10 |
