from machine import Pin, SPI
from utime import sleep_ms
VREF = 2.5
spi = SPI(0, baudrate=1000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3))
cs = Pin(5, Pin.OUT)
cs.value(1)
def set_dac_code(code):
code &= 0x0FFF
command = 0x3000 | code
high_byte = (command >> 8) & 0xFF
low_byte = command & 0xFF
cs.value(0)
spi.write(bytes([high_byte, low_byte]))
cs.value(1)
def code_to_voltage(code):
return VREF * code / 4096
clk = Pin(16, Pin.IN, Pin.PULL_UP)
dt = Pin(17, Pin.IN, Pin.PULL_UP)
_delta = 0
_last_clk = clk.value()
def _on_clk(pin):
global _delta, _last_clk
state = clk.value()
if state != _last_clk:
_delta += 1 if dt.value() != state else -1
_last_clk = state
clk.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=_on_clk)
CODE_STEP = 40 # raw code per detent (~0.024V at VREF=2.5)
setpoint_code = 0
set_dac_code(setpoint_code)
while True:
delta, _delta = _delta, 0
if delta != 0:
setpoint_code = max(0, min(4095, setpoint_code + delta * CODE_STEP))
set_dac_code(setpoint_code)
print("Code:", setpoint_code, " Voltage:", round(code_to_voltage(setpoint_code), 4), "V")
sleep_ms(20)