aboutsummaryrefslogtreecommitdiff
path: root/hw/thefreeman/avr32dd20-devkit/hwdef.c
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-11-22 05:34:26 -0700
committerSelene ToyKeeper2023-11-22 05:34:26 -0700
commitbaaa035cf93340b8f2c626bdba47e8066cf40067 (patch)
tree10114a3fa02f301c41da8b07619e146a14186f28 /hw/thefreeman/avr32dd20-devkit/hwdef.c
parentgot ADC voltage+temp working on avrdd... but broke all other builds/MCUs (diff)
downloadanduril-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 'hw/thefreeman/avr32dd20-devkit/hwdef.c')
-rw-r--r--hw/thefreeman/avr32dd20-devkit/hwdef.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/hw/thefreeman/avr32dd20-devkit/hwdef.c b/hw/thefreeman/avr32dd20-devkit/hwdef.c
index 133baca..3e5dd79 100644
--- a/hw/thefreeman/avr32dd20-devkit/hwdef.c
+++ b/hw/thefreeman/avr32dd20-devkit/hwdef.c
@@ -104,15 +104,15 @@ bool gradual_tick_main(uint8_t gt) {
}
-uint16_t voltage_raw2cooked(uint16_t measurement) {
- // In : 65535 * BATTLVL pin / 1.024 Vref
- // Out: 65535 * (Vbat / 10) / 1.024V (i.e. FSM Volt units)
+uint8_t voltage_raw2cooked(uint16_t measurement) {
+ // In : 65535 * BATTLVL / 1.024V
+ // Out: uint8_t: Vbat * 40
// BATTLVL = Vbat * (100.0/(330+100)) = Vbat / 4.3
- // So, Out = In * 4.3 / 10.24
- // (plus 1.5% based on measured hardware)
- // (plus a fudge factor of +0.04V to round up to nearest 1/10th Volt)
- uint16_t result = ((uint32_t)measurement * 436 / 1024)
- + (65535 * 4 / 1024);
+ // So, Out = In * 4.3 / 1600
+ // (plus a bit of fudging to fix the slope and offset,
+ // based on measuring actual hardware)
+ uint8_t result = (uint32_t)(measurement + (65535 * 4 / 1024))
+ * 43 / 16128;
return result;
}