From dbd69c72842b4fc213e707f11d7f37c18e0a9a75 Mon Sep 17 00:00:00 2001 From: Kai Lauterbach Date: Wed, 14 Feb 2024 16:42:47 +0100 Subject: [PATCH] Added genral support for DAC MCP4725 --- firmware/command_ctrl.ino | 22 +++++----------------- firmware/firmware.ino | 30 ++++++++++++++++++++++++++++++ firmware/globals.h | 7 ++++++- firmware/waveformgenerator.ino | 7 ++++--- 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/firmware/command_ctrl.ino b/firmware/command_ctrl.ino index bc73bbb..b52d164 100644 --- a/firmware/command_ctrl.ino +++ b/firmware/command_ctrl.ino @@ -241,14 +241,8 @@ void cc_startMeasurement() // TODO an diesem punkt muss unterschieden werden ob eine waveform ausgegeben werden soll oder eine frequenz, und welche Art von Kurve if (freq < WF_FREQ_MAX_HZ) { - if (freq > PWM_MAX_VALUE) - { - setWaveform(WAVEFORM_SINUS); - setWaveformFrequency(freq); - } else { - setWaveform(WAVEFORM_DUTYCYCLE); - setWaveformDC((uint8_t)(freq & 0xff)); - } + setWaveformFrequency(freq); + enableWaveformOutput(); pollWaveformGenerator(); // manually poll the waveformgenerator si5351.output_enable(SI5351_CLK0, 0); // disable clock output 0 @@ -315,7 +309,7 @@ void cc_getConfig() send32BitValue(end_freq); send32BitValue(step_freq); send16BitValue(intervall); - Serial.write((uint8_t) drive_str); + Serial.write((uint8_t)drive_str); sendEOM(); } @@ -328,14 +322,8 @@ void cc_enableClk(void) { if (start_freq < WF_FREQ_MAX_HZ) // < 8kHz { - if (start_freq > PWM_MAX_VALUE) // > 8 bit pwm value - { - setWaveform(WAVEFORM_SINUS); - setWaveformFrequency(start_freq); - } else { - setWaveform(WAVEFORM_DUTYCYCLE); - setWaveformDC((uint8_t)(start_freq & 0xff)); - } + setWaveformFrequency(start_freq); + enableWaveformOutput(); si5351.output_enable(SI5351_CLK0, 0); } else { diff --git a/firmware/firmware.ino b/firmware/firmware.ino index a3555f7..af8db88 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -6,7 +6,9 @@ /*****************************************************************************/ +#include #include + #include "Wire.h" #include @@ -19,11 +21,13 @@ extern "C" { /*****************************************************************************/ Si5351 si5351; +Adafruit_MCP4725 dac; uint32_t start_freq = 10000; uint32_t end_freq = 50000000; uint32_t step_freq = 1000000; // 1 MHz default step size uint16_t intervall = 1000; // intervall to change the frequency as milli seconds + enum si5351_drive drive_str = SI5351_DRIVE_2MA; /*****************************************************************************/ @@ -49,6 +53,17 @@ void setup() // initialize the command control module cc_init(); + if (dac.begin(0x62)) + { + bool tmp = dac.setVoltage(500, false, 100000); + if (!tmp) + { + blinkCode(150); + } + } else { + blinkCode(500); + } + // init the Si5351 si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0); @@ -192,3 +207,18 @@ uint32_t keepFreqRange(uint32_t freq) } /*****************************************************************************/ + +void blinkCode(uint16_t d) +{ + pinMode(13, OUTPUT); + while (true) + { + digitalWrite(13, HIGH); + delay(d); + digitalWrite(13, LOW); + delay(d); + Serial.write(MSG_TYPE_ANSWER_NOK); + } +} + +/*****************************************************************************/ diff --git a/firmware/globals.h b/firmware/globals.h index 72f8e43..7c6502c 100644 --- a/firmware/globals.h +++ b/firmware/globals.h @@ -5,8 +5,13 @@ /*****************************************************************************/ -#define PWM_BIT_WIDTH 8 +#define DAC_I2C_ADDRESS 0x62 +#define DAC_MAX_VOLTAGE 0xfff + +/*****************************************************************************/ + #define PWM_PIN 5 // PWM-Pin für DAC0 auf dem Arduino Nano 328 +#define PWM_BIT_WIDTH 12 #define PWM_MAX_VALUE ((1 << PWM_BIT_WIDTH)-1) /*****************************************************************************/ diff --git a/firmware/waveformgenerator.ino b/firmware/waveformgenerator.ino index ac84ac6..be0a0b8 100644 --- a/firmware/waveformgenerator.ino +++ b/firmware/waveformgenerator.ino @@ -82,10 +82,10 @@ void pollWaveformGenerator() { wf_prevMicros = currentMicros; - uint16_t sample = map(waveformsTable[wf_wave0][wf_pos], 0, 0xfff, 0, PWM_MAX_VALUE); - sample = constrain(sample, 0, PWM_MAX_VALUE); + uint16_t sample = map(waveformsTable[wf_wave0][wf_pos], 0, 0xfff, 0, DAC_MAX_VOLTAGE); + sample = constrain(sample, 0, DAC_MAX_VOLTAGE); // TODO write the selected waveform on DAC0 - analogWrite(PWM_PIN, sample); + dac.setVoltage(sample, false, 100000); // do not write to EEPROM, 400000Hz DAC frequency wf_pos++; if (wf_pos == WAVEFORM_MAX_SAMPLES_NUM) // Reset the counter to repeat the wave @@ -104,6 +104,7 @@ void pollWaveformGenerator() } else { if (wf_pwm_needs_disabling) { + dac.setVoltage(0, false, 400000); analogWrite(PWM_PIN, 0); wf_pwm_needs_disabling = false; }