-
-
Save DatanoiseTV/4e40429eecf90b88dcf5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "DAC_AD5668.h" | |
#define DATAOUT 11 // DIN | |
#define SPICLK 13 // CLK | |
#define SLAVESELECT 15 // SYNC | |
#define LDAC 12 | |
#define CLR 10 | |
// Commands | |
//AD5668 Command definitions | |
#define WRITE 0 | |
#define UPDATE 1 | |
#define WRITE_UPDATE_ALL 2 | |
#define WRITE_UPDATE_N 3 | |
#define POWER 4 | |
#define LOAD_CC_REG 5 | |
#define LOAD_LDAC_REG 6 | |
#define RESET 7 | |
#define SETUP_INTERNAL_REGISTER 8 | |
unsigned int voltage1 = 13400; | |
unsigned int voltage2 = 26500; | |
unsigned int voltage3 = 39550; | |
unsigned int voltage4 = 52625; | |
long voltage5 = 65735; | |
void AD5668_init(void) | |
{ | |
pinMode(DATAOUT, OUTPUT); | |
pinMode(SPICLK, OUTPUT); | |
pinMode(SLAVESELECT, OUTPUT); | |
pinMode(LDAC, OUTPUT); | |
pinMode(CLR, OUTPUT); | |
digitalWrite(DATAOUT, LOW); | |
digitalWrite(SPICLK, LOW); | |
digitalWrite(SLAVESELECT, LOW); | |
digitalWrite(LDAC, HIGH); | |
digitalWrite(CLR, LOW); | |
digitalWrite(CLR, HIGH); | |
delay(100); | |
AD5668_write(SETUP_INTERNAL_REGISTER, 0, 1); | |
delay(100); | |
AD5668_write(POWER, 0, 0); | |
delay(100); | |
AD5668_write(RESET, 0, 0); | |
delay(1000); | |
AD5668_writeNote(60, 127); | |
} | |
void AD5668_writeNote(int pin, int note) | |
{ | |
unsigned int voltage = 0; | |
if ((note >= 12) && (note < 24)) { | |
voltage = (voltage1)*((note - 12)/12.0); | |
} | |
else if ((note >= 24) && (note < 36)) { | |
voltage = (voltage2 - voltage1)*((note - 24)/12.0) + voltage1; | |
} | |
else if ((note >= 36) && (note < 48)) { | |
voltage = (voltage3 - voltage2)*((note - 36)/12.0) + voltage2; | |
} | |
else if ((note >= 48) && (note < 60)) { | |
voltage = (voltage4 - voltage3)*((note - 48)/12.0) + voltage3; | |
} | |
else if ((note >= 60) && (note < 72)) { | |
voltage = (voltage5 - voltage4)*((note - 60)/12.0) + voltage4; | |
} | |
AD5668_write(SETUP_INTERNAL_REGISTER, 0, 1); | |
AD5668_write(WRITE_UPDATE_N, pin, voltage); | |
} | |
void AD5668_write(byte command, byte address, unsigned int data) | |
{ | |
switch (command) { | |
case WRITE_UPDATE_N: | |
{ | |
byte b1 = B11110000|command; //padding at beginning of byte | |
byte b2 = address << 4 | data >> 12; //4 address bits and 4 MSBs of data | |
byte b3 = (data << 4) >> 8; // middle 8 bits of data | |
byte b4 = (data << 12) >> 8 | B00001111; | |
digitalWrite(SLAVESELECT, LOW); | |
delayMicroseconds(1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4); | |
delayMicroseconds(1); | |
digitalWrite(LDAC, LOW); | |
delayMicroseconds(1); | |
digitalWrite(LDAC, HIGH); | |
delayMicroseconds(1); | |
digitalWrite(SLAVESELECT, HIGH); | |
break; | |
} | |
case SETUP_INTERNAL_REGISTER: | |
{ | |
byte b1 = B11111000; //padding at beginning of byte | |
byte b2 = B00000000; | |
byte b3 = B00000000; | |
byte b4 = B00000000|data; | |
digitalWrite(SLAVESELECT, LOW); | |
delayMicroseconds(1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4); | |
delayMicroseconds(1); | |
digitalWrite(SLAVESELECT, HIGH); | |
break; | |
} | |
case RESET: | |
{ | |
byte b1 = B11110111; //padding at beginning of byte | |
byte b2 = B00000000; | |
byte b3 = B00000000; | |
byte b4 = B00000000|data; | |
digitalWrite(SLAVESELECT, LOW); | |
delayMicroseconds(1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4); | |
delayMicroseconds(1); | |
digitalWrite(SLAVESELECT, HIGH); | |
break; | |
} | |
case POWER: | |
{ | |
byte b1 = B11110100; //padding at beginning of byte | |
byte b2 = B00000000; | |
byte b3 = B00000000; | |
byte b4 = B11111111; | |
digitalWrite(SLAVESELECT, LOW); | |
delayMicroseconds(1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3); | |
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4); | |
delayMicroseconds(1); | |
digitalWrite(SLAVESELECT, HIGH); | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment