From 5938ad70cdd0d0320ed204ee71219c1fd2bc6bc0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sun, 23 Apr 2023 02:40:36 -0400 Subject: [PATCH] Update code --- firmware/nixitest1/nixitest1.c | 31 ++++++++++++++++++---------- firmware/nixitest1/testnix/testnix.c | 4 ++-- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/firmware/nixitest1/nixitest1.c b/firmware/nixitest1/nixitest1.c index 9b27d2f..cc7e4c7 100644 --- a/firmware/nixitest1/nixitest1.c +++ b/firmware/nixitest1/nixitest1.c @@ -1,4 +1,3 @@ -// Could be defined here, or in the processor defines. #define SYSTEM_CORE_CLOCK 48000000 #include "ch32v003fun.h" @@ -9,8 +8,8 @@ uint32_t count; //#define ENABLE_TUNING -// VDD Adjusted. -#define ABSOLUTE_MAX_ADC_SET 208 // Actually around 188V (0 to 208 maps to 0 to 190V) + +#define ABSOLUTE_MAX_ADC_SET 208 // Actually around 190V (0 to 208 maps to 0 to 190V) // Do not mess with PWM_ values unless you know what you are willing to go down a very deep rabbit hole. #ifndef ENABLE_TUNING @@ -20,7 +19,11 @@ int PWM_PERIOD = 140; #endif int PWM_MAXIMUM_DUTY = 48; //This actually gets overwrittenin the first few milliseconds onces a system VDD is read. -#define ERROR_P_TERM 1 // Actually a shift. Normally we would do the opposite to smooth out, but we can realy bang this around! It's OK if we rattle like crazy. +#define ERROR_P_TERM 2 // Actually a shift. Normally we would do the opposite to smooth out, but we can realy bang this around! It's OK if we rattle like crazy. + +// We can filter +#define ADC_IIR 2 +#define VDD_IIR 2 int update_targ_based_on_vdd = 0; int target_feedback = 0; @@ -44,7 +47,8 @@ void ADC1_IRQHandler(void) __attribute__((interrupt)); void ADC1_IRQHandler(void) { // This interrupt should happen ~3.5uS on current settings. - int adc = lastadc = ADC1->RDATAR; + lastadc = ADC1->RDATAR + (lastadc - (lastadc>>ADC_IIR)); + int adc = lastadc>>ADC_IIR; int err = target_feedback_vdd_adjusted - adc; ADC1->STATR &= ~ADC_EOC; @@ -58,11 +62,12 @@ void ADC1_IRQHandler(void) } int fadepos = (++count) & 0xff; - if( fadepos == 0 ) + + if( fadepos & 1 ) { ADC1->CTLR2 |= ADC_JSWSTART; } - else if( fadepos == 2 ) + else { // Use injection channel data to read vref. // Ballparks: @@ -82,16 +87,20 @@ void ADC1_IRQHandler(void) // 373 -> 84 // Ratio is 4.440 // 240 -> 56 // Ratio is 4.444 // Wow! That's nice! - lastvdd = ADC1->IDATAR1; + + // TODO: Consider filtering lastvdd. + //lastvdd = ADC1->IDATAR1; // Don't filter VDD + lastvdd = ADC1->IDATAR1 + (lastvdd - (lastvdd>>VDD_IIR)); // Filter VDD (but now it's 2^VDD_IIR bigger) #ifndef ENABLE_TUNING + // IF we aren't enabling tuning, we can update max-on-time with this value. // There's a neat hack where you can divide by weird decimal divisors by adding and subtracing terms. // I apply that weird trick here. // 1÷(1÷4−1÷64−1÷128−1÷1024) is roughly equal to dividing by 4.43290 // We actually can simplify it for our purposes as: 1÷(1÷4−1÷64−1÷128) // - PWM_MAXIMUM_DUTY = (lastvdd>>2) - (lastvdd>>6) - (lastvdd>>7); // lastvdd / 4.44. For ~5V, this works out to 45, for ~3.3V it works out to ~70. + PWM_MAXIMUM_DUTY = (lastvdd>>(2+VDD_IIR)) - (lastvdd>>(6+VDD_IIR)) - (lastvdd>>(7+VDD_IIR)); // lastvdd / 4.44. For ~5V, this works out to 45, for ~3.3V it works out to ~70. #endif update_targ_based_on_vdd = 1; } @@ -261,7 +270,7 @@ static void HandleCommand( uint32_t dmdword ) } } - *DMDATA0 = (lastadc << 12) | (lastvdd << 22); + *DMDATA0 = ((lastadc>>ADC_IIR) << 12) | ((lastvdd>>VDD_IIR) << 22); } int main() @@ -325,7 +334,7 @@ int main() // 680 = 192 * 373 / x = (373*680)/192 = 105.317647059 // Close enough to 128. // - target_feedback_vdd_adjusted = (target_feedback * lastvdd) >> 7; + target_feedback_vdd_adjusted = (target_feedback * lastvdd) >> (7+VDD_IIR); update_targ_based_on_vdd = 0; } } diff --git a/firmware/nixitest1/testnix/testnix.c b/firmware/nixitest1/testnix/testnix.c index 7dacb60..b16b6c6 100644 --- a/firmware/nixitest1/testnix/testnix.c +++ b/firmware/nixitest1/testnix/testnix.c @@ -156,8 +156,8 @@ int main() if( r ) { printf( "R: %d\n", r ); status = 0; goto retry; } printf( "%08x\n", status ); - float voltvdd = 1.21/(((status>>22)&0x3ff)/1023.0f); // vref = 2.2v - float voltage = ((((float)((status>>12)&0x3ff))/1023.0f)*100.0)*voltvdd; + float voltvdd = 1.20/(((status>>22)&0x3ff)/1023.0f); // vref = 2.2v + float voltage = ((((float)((status>>12)&0x3ff))/1023.0f)*101.0)*voltvdd; //101 because it's 10k + 1M // Measured @ 176 reported here, but 180 in reality if ref is 1.2. But 1.21 fixes it. volthist[volthisthead] = voltage; volthistvdd[volthisthead] = voltvdd;