aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-11-08 11:03:02 -0500
committerSam Anthony <sam@samanthony.xyz>2025-11-08 11:03:02 -0500
commitbe26e8497b510d4bf441f9d9cd3207d02b058bc0 (patch)
tree85c64c4e67679451d6454e16e89c3097f4ac76ac
parentb6f66e394ad3f18b3dccea674b5c041f5a22fb41 (diff)
downloadcan-gauge-interface-be26e8497b510d4bf441f9d9cd3207d02b058bc0.zip
specify dac voltage in millivolts
-rw-r--r--fw/dac.c30
-rw-r--r--fw/dac.h16
-rw-r--r--fw/tests/system/dac_systest.c5
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 (;;) {