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 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'fw/dac.c') 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); } -- cgit v1.2.3