init
This commit is contained in:
commit
d487fdd81b
|
@ -0,0 +1,385 @@
|
||||||
|
//Ardunio *DUE*code for controlling EVAL-AD5780
|
||||||
|
//Created by Carlos Kometter
|
||||||
|
|
||||||
|
/////////////CHANGELOG//////////////////
|
||||||
|
//v3- 5/20/2016 If a DAC does not intilizies, normalmode() is recall until everysingle dac is initilized.
|
||||||
|
//v4- 6/15/2016 Initializes dacs durin power up
|
||||||
|
/////////////////////////////////
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "SPI.h" // necessary library for SPI communication
|
||||||
|
int ldac = 11;
|
||||||
|
int led = 30;
|
||||||
|
int data = 32;
|
||||||
|
int dac[4] = {4, 10, 12, 52};
|
||||||
|
const int Noperations = 8;
|
||||||
|
String operations[Noperations] = {"NOP", "INITIALIZE", "SET", "GET_DAC", "RAMP1", "RAMP2", "*IDN?", "RDY?"}; //NOP, *IDN?, *RDY? RAMP
|
||||||
|
int initialized = 0;
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
void __throw_bad_alloc()
|
||||||
|
{
|
||||||
|
Serial.println("Unable to allocate memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
void __throw_length_error( char const*e )
|
||||||
|
{
|
||||||
|
Serial.print("Length Error :");
|
||||||
|
Serial.println(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
while (! Serial);
|
||||||
|
pinMode(ldac,OUTPUT);
|
||||||
|
digitalWrite(ldac,LOW); //Load DAC pin for DAC. Make it LOW if not in use.
|
||||||
|
pinMode(led,OUTPUT);
|
||||||
|
digitalWrite(led,HIGH);
|
||||||
|
|
||||||
|
for(int i =0; i <= 3; i++)
|
||||||
|
{
|
||||||
|
pinMode(dac[i],OUTPUT);
|
||||||
|
digitalWrite(dac[i],HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SPI.begin();
|
||||||
|
SPI.setBitOrder(MSBFIRST);
|
||||||
|
SPI.setClockDivider(84);
|
||||||
|
SPI.setDataMode(SPI_MODE1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOfOperation(String operation)
|
||||||
|
{
|
||||||
|
for(int index = 0; index < Noperations; index++)
|
||||||
|
{
|
||||||
|
if(operations[index] == operation)
|
||||||
|
{
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int threeByteToInt(byte DB1,byte DB2, byte DB3) // This gives a 16 bit integer (between +/- 2^16)
|
||||||
|
{
|
||||||
|
return ((int)(((((DB1&15)<<8)| DB2)<<8)|DB3)>>2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void intToThreeBytes(int decimal, byte *DB1, byte *DB2, byte *DB3)
|
||||||
|
{
|
||||||
|
*DB1 = (byte)((decimal >> 14) | 16);
|
||||||
|
*DB2 = (byte)((decimal >> 6) & 0xFF);
|
||||||
|
*DB3 = (byte)((decimal & 0x3F) << 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
float threeByteToVoltage(byte DB1, byte DB2, byte DB3)
|
||||||
|
{
|
||||||
|
int decimal;
|
||||||
|
float voltage;
|
||||||
|
|
||||||
|
decimal = threeByteToInt(DB1,DB2,DB3);
|
||||||
|
|
||||||
|
if (decimal <= 131071)
|
||||||
|
{
|
||||||
|
voltage = decimal*10.0/131071;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
voltage = -(262144-decimal)*10.0/131072;
|
||||||
|
}
|
||||||
|
return voltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void voltageToDecimal(float voltage, byte *DB1, byte *DB2, byte *DB3)
|
||||||
|
{
|
||||||
|
int decimal;
|
||||||
|
if (voltage >= 0)
|
||||||
|
{
|
||||||
|
decimal = voltage*131071/10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
decimal = voltage*131072/10 + 262144;
|
||||||
|
}
|
||||||
|
intToThreeBytes(decimal, DB1, DB2, DB3);
|
||||||
|
}
|
||||||
|
|
||||||
|
float setValue(int channelDAC, float voltage)
|
||||||
|
{
|
||||||
|
byte b1;
|
||||||
|
byte b2;
|
||||||
|
byte b3;
|
||||||
|
|
||||||
|
voltageToDecimal(voltage, &b1, &b2, &b3);
|
||||||
|
|
||||||
|
digitalWrite(data, HIGH);
|
||||||
|
digitalWrite(channelDAC,LOW);
|
||||||
|
SPI.transfer(b1); // send command byte to DAC
|
||||||
|
SPI.transfer(b2); // MS data bits, DAC2
|
||||||
|
SPI.transfer(b3); //LS 8 data bits, DAC2
|
||||||
|
digitalWrite(channelDAC,HIGH);
|
||||||
|
digitalWrite(data, LOW);
|
||||||
|
|
||||||
|
return threeByteToVoltage(b1,b2,b3);
|
||||||
|
}
|
||||||
|
|
||||||
|
float writeDAC(int dacChannel, float voltage)
|
||||||
|
{
|
||||||
|
switch( dacChannel )//uses the first byte choose what to do. 0x00: set DACS with asynchronous update
|
||||||
|
{
|
||||||
|
case 0: // Write DAC;
|
||||||
|
return setValue(dac[0],voltage);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return setValue(dac[1],voltage);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return setValue(dac[2],voltage);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
return setValue(dac[3],voltage);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void autoRamp1(std::vector<String> DB)
|
||||||
|
{
|
||||||
|
float v1 = DB[2].toFloat();
|
||||||
|
float v2 = DB[3].toFloat();
|
||||||
|
int nSteps = DB[4].toInt();
|
||||||
|
int dacChannel=DB[1].toInt();
|
||||||
|
|
||||||
|
for (int j=0; j<nSteps;j++)
|
||||||
|
{
|
||||||
|
int timer = micros();
|
||||||
|
writeDAC(dacChannel, v1+(v2-v1)*j/(nSteps-1));
|
||||||
|
while(micros() <= timer + DB[5].toInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void autoRamp2(std::vector<String> DB)
|
||||||
|
{
|
||||||
|
float vi1 = DB[3].toFloat();
|
||||||
|
float vi2 = DB[4].toFloat();
|
||||||
|
float vf1 = DB[5].toFloat();
|
||||||
|
float vf2 = DB[6].toFloat();
|
||||||
|
int nSteps = DB[7].toInt();
|
||||||
|
byte b1;
|
||||||
|
byte b2;
|
||||||
|
int dacChannel1=DB[1].toInt();
|
||||||
|
int dacChannel2=DB[2].toInt();
|
||||||
|
|
||||||
|
for (int j=0; j<nSteps;j++)
|
||||||
|
{
|
||||||
|
int timer = micros();
|
||||||
|
writeDAC(dacChannel1, vi1+(vf1-vi1)*j/(nSteps-1));
|
||||||
|
writeDAC(dacChannel2, vi2+(vf2-vi2)*j/(nSteps-1));
|
||||||
|
while(micros() <= timer + DB[8].toInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void readControl(int channelDAC)
|
||||||
|
{
|
||||||
|
int o1;
|
||||||
|
int o2;
|
||||||
|
int o3;
|
||||||
|
|
||||||
|
digitalWrite(channelDAC,LOW);
|
||||||
|
SPI.transfer(160); // send command byte to DAC
|
||||||
|
SPI.transfer(0); // MS data bits, DAC2
|
||||||
|
SPI.transfer(0);//LS 8 data bits, DAC2
|
||||||
|
digitalWrite(channelDAC,HIGH);
|
||||||
|
delayMicroseconds(3);
|
||||||
|
digitalWrite(channelDAC,LOW);
|
||||||
|
o1 = SPI.transfer(0);
|
||||||
|
o2 = SPI.transfer(0);
|
||||||
|
o3 = SPI.transfer(0);
|
||||||
|
digitalWrite(channelDAC,HIGH);
|
||||||
|
|
||||||
|
Serial.write(o1);
|
||||||
|
Serial.write(o1);
|
||||||
|
Serial.write(o1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readDAC(int channelDAC)
|
||||||
|
{
|
||||||
|
int o1;
|
||||||
|
int o2;
|
||||||
|
int o3;
|
||||||
|
float voltage;
|
||||||
|
|
||||||
|
digitalWrite(channelDAC,LOW);
|
||||||
|
SPI.transfer(144); // send command byte to DAC
|
||||||
|
SPI.transfer(0); // MS data bits, DAC2
|
||||||
|
SPI.transfer(0);//LS 8 data bits, DAC2
|
||||||
|
digitalWrite(channelDAC,HIGH);
|
||||||
|
delayMicroseconds(1);
|
||||||
|
digitalWrite(channelDAC,LOW);
|
||||||
|
o1 = SPI.transfer(0);
|
||||||
|
o2 = SPI.transfer(0);
|
||||||
|
o3 = SPI.transfer(0);
|
||||||
|
digitalWrite(channelDAC,HIGH);
|
||||||
|
|
||||||
|
voltage = threeByteToVoltage(o1, o2, o3);
|
||||||
|
Serial.println(voltage,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void normalMode()
|
||||||
|
{
|
||||||
|
int attemps = 0;
|
||||||
|
for( int i = 0; i <= 3; i++)
|
||||||
|
{
|
||||||
|
int o;
|
||||||
|
setValue(dac[i],0);
|
||||||
|
digitalWrite(dac[i],LOW);
|
||||||
|
SPI.transfer(32);
|
||||||
|
SPI.transfer(0);
|
||||||
|
SPI.transfer(2);
|
||||||
|
digitalWrite(dac[i],HIGH);
|
||||||
|
|
||||||
|
digitalWrite(dac[i],LOW);
|
||||||
|
SPI.transfer(160);
|
||||||
|
SPI.transfer(0);
|
||||||
|
SPI.transfer(0);
|
||||||
|
digitalWrite(dac[i],HIGH);
|
||||||
|
delayMicroseconds(1);
|
||||||
|
digitalWrite(dac[i],LOW);
|
||||||
|
SPI.transfer(0);
|
||||||
|
SPI.transfer(0);
|
||||||
|
o = SPI.transfer(0);
|
||||||
|
digitalWrite(dac[i],HIGH);
|
||||||
|
|
||||||
|
if (attemps>=5)
|
||||||
|
{
|
||||||
|
Serial.print("ERROR INITIALIZING DAC");
|
||||||
|
Serial.println(i);
|
||||||
|
}
|
||||||
|
else if (o!=2)
|
||||||
|
{
|
||||||
|
i=i-1;
|
||||||
|
attemps++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ID()
|
||||||
|
{
|
||||||
|
Serial.println("DCBOX_QUAD_AD5780(DOGWOOD)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void RDY()
|
||||||
|
{
|
||||||
|
Serial.println("READY");
|
||||||
|
}
|
||||||
|
|
||||||
|
void debug()
|
||||||
|
{
|
||||||
|
digitalWrite(led,HIGH);
|
||||||
|
delay(3000);
|
||||||
|
digitalWrite(led,LOW);
|
||||||
|
delay(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void router(std::vector<String> DB)
|
||||||
|
{
|
||||||
|
int operation = indexOfOperation(DB[0]);
|
||||||
|
switch( operation )//uses the first byte choose what to do. 0x00: set DACS with asynchronous update
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
Serial.println("NOP");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // Write DAC;
|
||||||
|
normalMode();
|
||||||
|
Serial.println("INITIALIZATION COMPLETE");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if(DB[2].toFloat() < -10 || DB[2].toFloat() > 10)
|
||||||
|
{
|
||||||
|
Serial.println("VOLTAGE_OVERRANGE");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
float v;
|
||||||
|
v = writeDAC(DB[1].toInt(),DB[2].toFloat());
|
||||||
|
Serial.print("DAC ");
|
||||||
|
Serial.print(DB[1]);
|
||||||
|
Serial.print(" UPDATED TO ");
|
||||||
|
Serial.print(v,5);
|
||||||
|
Serial.println("V");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
readDAC(dac[DB[1].toInt()]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
autoRamp1(DB);
|
||||||
|
Serial.println("RAMP_FINISHED");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
autoRamp2(DB);
|
||||||
|
Serial.println("RAMP_FINISHED");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
ID();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
RDY();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
Serial.flush();
|
||||||
|
String inByte = "";
|
||||||
|
std::vector<String> comm;
|
||||||
|
|
||||||
|
if(initialized == 0)
|
||||||
|
{
|
||||||
|
normalMode();
|
||||||
|
initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(Serial.available())
|
||||||
|
{
|
||||||
|
char received;
|
||||||
|
while (received != '\r')
|
||||||
|
{
|
||||||
|
if(Serial.available())
|
||||||
|
{
|
||||||
|
received = Serial.read();
|
||||||
|
if (received == '\n' || received == ' ')
|
||||||
|
{}
|
||||||
|
else if (received == ',' || received == '\r')
|
||||||
|
{
|
||||||
|
comm.push_back(inByte);
|
||||||
|
inByte = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inByte += received;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
router(comm);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue