diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-08 11:03:02 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-08 11:03:02 -0500 |
| commit | be26e8497b510d4bf441f9d9cd3207d02b058bc0 (patch) | |
| tree | 85c64c4e67679451d6454e16e89c3097f4ac76ac | |
| parent | b6f66e394ad3f18b3dccea674b5c041f5a22fb41 (diff) | |
| download | can-gauge-interface-be26e8497b510d4bf441f9d9cd3207d02b058bc0.zip | |
specify dac voltage in millivolts
| -rw-r--r-- | fw/dac.c | 30 | ||||
| -rw-r--r-- | fw/dac.h | 16 | ||||
| -rw-r--r-- | fw/tests/system/dac_systest.c | 5 |
3 files changed, 33 insertions, 18 deletions
@@ -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); } @@ -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 (;;) { |