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 /arch/avr32dd20.c | |
| 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 'arch/avr32dd20.c')
| -rw-r--r-- | arch/avr32dd20.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/arch/avr32dd20.c b/arch/avr32dd20.c index 998e9f6..2ac3526 100644 --- a/arch/avr32dd20.c +++ b/arch/avr32dd20.c @@ -1,8 +1,10 @@ -// arch/avr32dd20.h: avr32dd20 support header +// arch/avr32dd20.h: avr32dd20 support functions // Copyright (C) 2023 Selene ToyKeeper // SPDX-License-Identifier: GPL-3.0-or-later #pragma once +#include "arch/avr32dd20.h" + ////////// clock speed / delay stuff ////////// inline void mcu_clock_speed() { @@ -137,12 +139,22 @@ inline uint16_t mcu_adc_result() { return ADC0.RES; } -inline uint16_t mcu_vdd_raw2cooked(uint16_t measurement) { +inline uint8_t mcu_vdd_raw2cooked(uint16_t measurement) { + // In : 65535 * (Vbat / 10) / 1.024V + // Out: uint8_t: Vbat * 40 + // (add 80 to round up near a boundary) + uint8_t vbat40 = (uint16_t)(measurement + 80) / 160; + return vbat40; +} + +#if 0 +inline uint16_t mcu_vdd_raw2fine(uint16_t measurement) { // In : 65535 * (Vbat / 10) / 1.024V // Out: 65535 * (Vbat / 10) / 1.024V // This MCU's native format is already correct return measurement; } +#endif inline uint16_t mcu_temp_raw2cooked(uint16_t measurement) { // convert raw ADC values to calibrated temperature @@ -164,29 +176,10 @@ inline uint16_t mcu_temp_raw2cooked(uint16_t measurement) { } inline uint8_t mcu_adc_lsb() { - // temp is right-aligned, voltage is 16-bit, both have a useful LSB + // volts and temp are both 16-bit, so the LSB is useful as-is return ADC0_RESL; } -#ifdef USE_VOLTAGE_VDD -uint8_t calc_voltage(uint16_t measurement) { - // calculate actual voltage: volts * 10 - // FIXME - // ADC = 1.1 * 1024 / volts - // volts = 1.1 * 1024 / ADC - result = ((uint16_t)(2*1.1*1024*10)/(measurement>>6) - + VOLTAGE_FUDGE_FACTOR - #ifdef USE_VOLTAGE_CORRECTION - + VOLT_CORR - 7 - #endif - ) >> 1; - return result; -} -#elif defined(USE_VOLTAGE_VDDIO2) -#elif defined(USE_VOLTAGE_VDDIO2) -#else -// hwdef must supply its own function -#endif ////////// WDT ////////// // this uses the RTC PIT interrupt instead of WDT, |
