aboutsummaryrefslogtreecommitdiffstats
path: root/fw/dac.c
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 /fw/dac.c
parentb6f66e394ad3f18b3dccea674b5c041f5a22fb41 (diff)
downloadcan-gauge-interface-be26e8497b510d4bf441f9d9cd3207d02b058bc0.zip
specify dac voltage in millivolts
Diffstat (limited to 'fw/dac.c')
-rw-r--r--fw/dac.c30
1 files changed, 21 insertions, 9 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);
}