Files
audio-synth/dev/digital/DAC_MCP4728_Test/src/main.cpp
Erik Tóth aec4e43ba8 DAC Software Test
- Korrekte Software: Nur noch kleiner offset max. -+5mV
2025-10-13 20:43:59 +02:00

83 lines
1.8 KiB
C++

#include <Wire.h>
#include <Adafruit_MCP4728.h>
#define BAUDRATE 115200
#define I2C_SDA 15
#define I2C_SCL 16
#define I2C_FREQ 400000
#define DAC_MAX 4095
#define DAC_MIN 0
#define VREF_mV 2048
#define VREF_CONF_IN_USE MCP4728_VREF_INTERNAL
#define PIN_BTN 40
Adafruit_MCP4728 mcp;
static uint16_t value_mV = VREF_mV;
bool button_state_old = false;
bool button_state_now = false;
uint16_t voltage(uint16_t mV)
{
return map(mV, 0, VREF_mV, DAC_MIN, DAC_MAX);
}
void setup()
{
Serial.begin(BAUDRATE);
delay(1000);
Serial.print("\n\rMCP4728 DAC Test");
Wire.begin(I2C_SDA, I2C_SCL);
Wire.setClock(I2C_FREQ);
pinMode(PIN_BTN, INPUT);
Serial.print("\n\rInitialisiere MCP4728...");
uint8_t attempts = 0;
while (!mcp.begin())
{
if(attempts > 20)
{
Serial.print("\n\rError: Es konnte nach 20 Versuchen kein IC gefunden werden. Überprüfe die Verkabelung und starte den ESP neu!");
for(;;);
}
Serial.print(".");
delay(100);
attempts++;
}
Serial.print("\n\rErfolgreich verbunden!");
mcp.setChannelValue(MCP4728_CHANNEL_A, 4095, VREF_CONF_IN_USE);
Serial.print("\n\rDAC-Kanal A auf 0 gesetzt");
delay(1000);
}
void loop()
{
button_state_now = digitalRead(PIN_BTN);
if (button_state_now != button_state_old)
{
delay(10); // debounce delay
button_state_now = digitalRead(PIN_BTN);
if (button_state_now != button_state_old)
{
button_state_old = button_state_now;
if (button_state_now == HIGH)
{
if(value_mV < 2000) value_mV += (1000/12);
if(value_mV >= 2000) value_mV = 0;
if (mcp.setChannelValue(MCP4728_CHANNEL_A, voltage(value_mV), VREF_CONF_IN_USE)) Serial.printf("DAC A = %u -> mV: %u\r\n", voltage(value_mV), value_mV);
else Serial.println("Error: Neuer MCP4728 Wert konnte nicht gesetzt werden!");
}
}
}
}