Added genral support for DAC MCP4725
This commit is contained in:
parent
69ac7c3f8a
commit
dbd69c7284
4 changed files with 45 additions and 21 deletions
|
@ -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
|
// 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 < WF_FREQ_MAX_HZ)
|
||||||
{
|
{
|
||||||
if (freq > PWM_MAX_VALUE)
|
|
||||||
{
|
|
||||||
setWaveform(WAVEFORM_SINUS);
|
|
||||||
setWaveformFrequency(freq);
|
setWaveformFrequency(freq);
|
||||||
} else {
|
|
||||||
setWaveform(WAVEFORM_DUTYCYCLE);
|
|
||||||
setWaveformDC((uint8_t)(freq & 0xff));
|
|
||||||
}
|
|
||||||
enableWaveformOutput();
|
enableWaveformOutput();
|
||||||
pollWaveformGenerator(); // manually poll the waveformgenerator
|
pollWaveformGenerator(); // manually poll the waveformgenerator
|
||||||
si5351.output_enable(SI5351_CLK0, 0); // disable clock output 0
|
si5351.output_enable(SI5351_CLK0, 0); // disable clock output 0
|
||||||
|
@ -315,7 +309,7 @@ void cc_getConfig()
|
||||||
send32BitValue(end_freq);
|
send32BitValue(end_freq);
|
||||||
send32BitValue(step_freq);
|
send32BitValue(step_freq);
|
||||||
send16BitValue(intervall);
|
send16BitValue(intervall);
|
||||||
Serial.write((uint8_t) drive_str);
|
Serial.write((uint8_t)drive_str);
|
||||||
sendEOM();
|
sendEOM();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,14 +322,8 @@ void cc_enableClk(void)
|
||||||
{
|
{
|
||||||
if (start_freq < WF_FREQ_MAX_HZ) // < 8kHz
|
if (start_freq < WF_FREQ_MAX_HZ) // < 8kHz
|
||||||
{
|
{
|
||||||
if (start_freq > PWM_MAX_VALUE) // > 8 bit pwm value
|
|
||||||
{
|
|
||||||
setWaveform(WAVEFORM_SINUS);
|
|
||||||
setWaveformFrequency(start_freq);
|
setWaveformFrequency(start_freq);
|
||||||
} else {
|
|
||||||
setWaveform(WAVEFORM_DUTYCYCLE);
|
|
||||||
setWaveformDC((uint8_t)(start_freq & 0xff));
|
|
||||||
}
|
|
||||||
enableWaveformOutput();
|
enableWaveformOutput();
|
||||||
si5351.output_enable(SI5351_CLK0, 0);
|
si5351.output_enable(SI5351_CLK0, 0);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <Adafruit_MCP4725.h>
|
||||||
#include <si5351.h>
|
#include <si5351.h>
|
||||||
|
|
||||||
#include "Wire.h"
|
#include "Wire.h"
|
||||||
|
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
|
@ -19,11 +21,13 @@ extern "C" {
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
Si5351 si5351;
|
Si5351 si5351;
|
||||||
|
Adafruit_MCP4725 dac;
|
||||||
|
|
||||||
uint32_t start_freq = 10000;
|
uint32_t start_freq = 10000;
|
||||||
uint32_t end_freq = 50000000;
|
uint32_t end_freq = 50000000;
|
||||||
uint32_t step_freq = 1000000; // 1 MHz default step size
|
uint32_t step_freq = 1000000; // 1 MHz default step size
|
||||||
uint16_t intervall = 1000; // intervall to change the frequency as milli seconds
|
uint16_t intervall = 1000; // intervall to change the frequency as milli seconds
|
||||||
|
|
||||||
enum si5351_drive drive_str = SI5351_DRIVE_2MA;
|
enum si5351_drive drive_str = SI5351_DRIVE_2MA;
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -49,6 +53,17 @@ void setup()
|
||||||
// initialize the command control module
|
// initialize the command control module
|
||||||
cc_init();
|
cc_init();
|
||||||
|
|
||||||
|
if (dac.begin(0x62))
|
||||||
|
{
|
||||||
|
bool tmp = dac.setVoltage(500, false, 100000);
|
||||||
|
if (!tmp)
|
||||||
|
{
|
||||||
|
blinkCode(150);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blinkCode(500);
|
||||||
|
}
|
||||||
|
|
||||||
// init the Si5351
|
// init the Si5351
|
||||||
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
|
@ -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_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)
|
#define PWM_MAX_VALUE ((1 << PWM_BIT_WIDTH)-1)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -82,10 +82,10 @@ void pollWaveformGenerator()
|
||||||
{
|
{
|
||||||
wf_prevMicros = currentMicros;
|
wf_prevMicros = currentMicros;
|
||||||
|
|
||||||
uint16_t sample = map(waveformsTable[wf_wave0][wf_pos], 0, 0xfff, 0, PWM_MAX_VALUE);
|
uint16_t sample = map(waveformsTable[wf_wave0][wf_pos], 0, 0xfff, 0, DAC_MAX_VOLTAGE);
|
||||||
sample = constrain(sample, 0, PWM_MAX_VALUE);
|
sample = constrain(sample, 0, DAC_MAX_VOLTAGE);
|
||||||
// TODO write the selected waveform on DAC0
|
// 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++;
|
wf_pos++;
|
||||||
if (wf_pos == WAVEFORM_MAX_SAMPLES_NUM) // Reset the counter to repeat the wave
|
if (wf_pos == WAVEFORM_MAX_SAMPLES_NUM) // Reset the counter to repeat the wave
|
||||||
|
@ -104,6 +104,7 @@ void pollWaveformGenerator()
|
||||||
} else {
|
} else {
|
||||||
if (wf_pwm_needs_disabling)
|
if (wf_pwm_needs_disabling)
|
||||||
{
|
{
|
||||||
|
dac.setVoltage(0, false, 400000);
|
||||||
analogWrite(PWM_PIN, 0);
|
analogWrite(PWM_PIN, 0);
|
||||||
wf_pwm_needs_disabling = false;
|
wf_pwm_needs_disabling = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue