Skip to content

Instantly share code, notes, and snippets.

@DatanoiseTV
Created July 29, 2014 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DatanoiseTV/4e40429eecf90b88dcf5 to your computer and use it in GitHub Desktop.
Save DatanoiseTV/4e40429eecf90b88dcf5 to your computer and use it in GitHub Desktop.
#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