diff options
| author | Selene ToyKeeper | 2023-11-22 05:34:26 -0700 |
|---|---|---|
| committer | Selene ToyKeeper | 2023-11-22 05:34:26 -0700 |
| commit | baaa035cf93340b8f2c626bdba47e8066cf40067 (patch) | |
| tree | 10114a3fa02f301c41da8b07619e146a14186f28 /fsm | |
| parent | got ADC voltage+temp working on avrdd... but broke all other builds/MCUs (diff) | |
| download | anduril-baaa035cf93340b8f2c626bdba47e8066cf40067.tar.gz anduril-baaa035cf93340b8f2c626bdba47e8066cf40067.tar.bz2 anduril-baaa035cf93340b8f2c626bdba47e8066cf40067.zip | |
ADC voltage: battcheck 3 digits, fixed t1616, switched back to 8-bit internal volt unit
Before this branch, `voltage` was 6 bits: Volts * 10
A couple patches ago, I upgraded it to 16 bits: 65535 * Volts / 10.24
That costs too much extra ROM on attiny85 though, for extra precision
it doesn't even use... so I switched back to an 8-bit value. It's still
more precise than before though: Volts * 40
... and battcheck displays an extra digit now, on devices with ROM for it.
... and battcheck waits a second to get a more accurate measurement
before displaying the first value. It has *much* less variation
between first and later readings now.
Also:
- got t1616 builds working again (tested fc13 and thefreeman-boost-fwaa)
- upgraded t1616 voltage and temp to 12-bit (10 bits + 4x oversampling)
- removed expensive temp conversion from t1616 ADC interrupt
- recalibrated t1616 bogomips again; runs faster after interrupt fix
- increased t1616 internal VDD measurement resolution by 36% (1.5V Vref, not 1.1V)
- fixed sloppy setting of Vref bits
I still need to test / update other t1616 builds,
and fix all the t85 + t1634 code and build targets.
Diffstat (limited to 'fsm')
| -rw-r--r-- | fsm/adc.c | 47 | ||||
| -rw-r--r-- | fsm/adc.h | 4 |
2 files changed, 31 insertions, 20 deletions
@@ -209,10 +209,16 @@ static inline void ADC_voltage_handler() { #endif else measurement = adc_smooth[0]; - // convert raw ADC value to FSM voltage units: (V * 100) << 6 - // 0 .. 65535 = 0.0V .. 10.24V - measurement = voltage_raw2cooked(measurement) / (10 << 5); - + // convert raw ADC value to FSM voltage units: Volts * 40 + // 0 .. 200 = 0.0V .. 5.0V + voltage = voltage_raw2cooked(measurement) + + (VOLTAGE_FUDGE_FACTOR << 1) + #ifdef USE_VOLTAGE_CORRECTION + + ((VOLT_CORR - 7) << 1) + #endif + ; + + /* // calculate actual voltage: volts * 10 // TODO: should be (volts * 40) for extra precision voltage = (measurement + VOLTAGE_FUDGE_FACTOR @@ -220,6 +226,7 @@ static inline void ADC_voltage_handler() { + VOLT_CORR - 7 #endif ) >> 1; + */ #if 0 // values stair-step between intervals of 64, with random variations @@ -433,33 +440,37 @@ static inline void ADC_temperature_handler() { #ifdef USE_BATTCHECK #ifdef BATTCHECK_4bars PROGMEM const uint8_t voltage_blinks[] = { - 30, 35, 38, 40, 42, 99, + 4*30, 4*35, 4*38, 4*40, 4*42, 255, }; #endif #ifdef BATTCHECK_6bars PROGMEM const uint8_t voltage_blinks[] = { - 30, 34, 36, 38, 40, 41, 43, 99, + 4*30, 4*34, 4*36, 4*38, 4*40, 4*41, 4*43, 255, }; #endif #ifdef BATTCHECK_8bars PROGMEM const uint8_t voltage_blinks[] = { - 30, 33, 35, 37, 38, 39, 40, 41, 42, 99, + 4*30, 4*33, 4*35, 4*37, 4*38, 4*39, 4*40, 4*41, 4*42, 255, }; #endif void battcheck() { #ifdef BATTCHECK_VpT - blink_num(voltage); - #else - uint8_t i; - for(i=0; - voltage >= pgm_read_byte(voltage_blinks + i); - i++) {} - #ifdef DONT_DELAY_AFTER_BATTCHECK - blink_digit(i); + blink_num(voltage / 4); + #ifdef USE_EXTRA_BATTCHECK_DIGIT + // 0 1 2 3 --> 0 2 5 7, representing x.x00 x.x25 x.x50 x.x75 + blink_num(((voltage % 4)<<1) + ((voltage % 4)>>1)); + #endif #else - if (blink_digit(i)) - nice_delay_ms(1000); - #endif + uint8_t i; + for(i=0; + voltage >= pgm_read_byte(voltage_blinks + i); + i++) {} + #ifdef DONT_DELAY_AFTER_BATTCHECK + blink_digit(i); + #else + if (blink_digit(i)) + nice_delay_ms(1000); + #endif #endif } #endif @@ -17,11 +17,11 @@ volatile uint8_t adc_reset = 2; #endif // low-battery threshold in volts * 10 #ifndef VOLTAGE_LOW -#define VOLTAGE_LOW 29 +#define VOLTAGE_LOW (4*29) #endif // battery is low but not critical #ifndef VOLTAGE_RED -#define VOLTAGE_RED 33 +#define VOLTAGE_RED (4*33) #endif // MCU sees voltage 0.X volts lower than actual, add X/2 to readings #ifndef VOLTAGE_FUDGE_FACTOR |
