From be26e8497b510d4bf441f9d9cd3207d02b058bc0 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 8 Nov 2025 11:03:02 -0500 Subject: specify dac voltage in millivolts --- fw/dac.c | 30 +++++++++++++++++++++--------- fw/dac.h | 16 ++++++++-------- fw/tests/system/dac_systest.c | 5 ++++- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/fw/dac.c b/fw/dac.c index bfea8c8..a4dc12c 100644 --- a/fw/dac.c +++ b/fw/dac.c @@ -8,6 +8,11 @@ #include "dac.h" +#define min(a, b) (((a) < (b)) ? (a) : (b)) + +// Nominal reference voltage in millivolts +#define VREF_MV 5000 + // Configuration bits: // buffered, gain=1x, mode=active typedef enum { @@ -30,7 +35,14 @@ dacInit(void) { } static void -set(U8 dacNum, Conf conf, U16 level) { +set(U8 dacNum, Conf conf, U16 mv) { + U16 level; + + mv = min(mv, VREF_MV); // clamp to 5V + + // D = 2^10 * Vout / Vref / (1000mV/V) + level = (U16)((U32)mv * (1u<<10u) / VREF_MV); + level <<= 2u; // D0 at bit 2 level = ((U16)conf & 0xF000) | (level & 0x0FFF); // set config bits @@ -52,20 +64,20 @@ set(U8 dacNum, Conf conf, U16 level) { } void -dacSet1a(U16 level) { - set(1u, CONFA, level); +dacSet1a(U16 mv) { + set(1u, CONFA, mv); } void -dacSet1b(U16 level) { - set(1u, CONFB, level); +dacSet1b(U16 mv) { + set(1u, CONFB, mv); } void -dacSet2a(U16 level) { - set(2u, CONFA, level); +dacSet2a(U16 mv) { + set(2u, CONFA, mv); } void -dacSet2b(U16 level) { - set(2u, CONFB, level); +dacSet2b(U16 mv) { + set(2u, CONFB, mv); } diff --git a/fw/dac.h b/fw/dac.h index 1882c3e..e9bf54b 100644 --- a/fw/dac.h +++ b/fw/dac.h @@ -20,17 +20,17 @@ void dacInit(void); // Set DAC1 VOUTA. -// Only the lower 10 bits are used. -void dacSet1a(U16 level); +// Mv is the desired voltage in millivolts. +void dacSet1a(U16 mv); // Set DAC1 VOUTB. -// Only the lower 10 bits are used. -void dacSet1b(U16 level); +// Mv is the desired voltage in millivolts. +void dacSet1b(U16 mv); // Set DAC2 VOUTA. -// Only the lower 10 bits are used. -void dacSet2a(U16 level); +// Mv is the desired voltage in millivolts. +void dacSet2a(U16 mv); // Set DAC2 VOUTB. -// Only the lower 10 bits are used. -void dacSet2b(U16 level); +// Mv is the desired voltage in millivolts. +void dacSet2b(U16 mv); diff --git a/fw/tests/system/dac_systest.c b/fw/tests/system/dac_systest.c index 47aefb9..50b600a 100644 --- a/fw/tests/system/dac_systest.c +++ b/fw/tests/system/dac_systest.c @@ -13,7 +13,10 @@ main(void) { spiInit(); dacInit(); - dacSet1a(252u); // 1.23V + dacSet1a(123); // 0.123V + dacSet1b(345); // 0.345V + dacSet2a(1230); // 1.230V + dacSet2b(3450); // 3.450V for (;;) { -- cgit v1.2.3