Driver for the DACxx6xT series of Texas Instruments DACs Not all functions have been implemented yet. DAC7562T, DAC7563T, DAC8162T DAC8163T, DAC8562T, DAC8563T
DACxx6xT.cpp
- Committer:
- Ryan Vasquez
- Date:
- 2019-01-29
- Revision:
- 2:6edde8a229f7
- Parent:
- 1:c033f984277b
File content as of revision 2:6edde8a229f7:
#include "DACxx6xT.h" DACxx6xT::DACxx6xT(SPI *A, float Vref = 3.3) { DACC = A; numslaves = 0; vref_A = Vref; vrefpin = Vref; gain_DAC_A = 1.0; gain_DAC_B = 1.0; custom_gain_A = 1.0; custom_gain_B = 1.0; vref_B = Vref; } DACxx6xT::DACxx6xT(SPI *A, DigitalOut *device_CS, float Vref = 3.3) { DACC = A; CS = device_CS; CS->write(1); vref_A = Vref; vref_B = Vref; vrefpin = Vref; gain_DAC_A = 1.0; gain_DAC_B = 1.0; custom_gain_A = 1.0; custom_gain_B = 1.0; } void DACxx6xT::init() { CS->write(0); DACC->write(RESET_ALL_REG_UPDATE_ALL>>16); DACC->write(RESET_ALL_REG_UPDATE_ALL>>8); DACC->write(RESET_ALL_REG_UPDATE_ALL); CS->write(1); } void DACxx6xT::write(short value, int dacnum) { CS->write(0); if(dacnum == 1) //write to DAC A { DACC->write(WRITE_DAC_A_REG_UPDATE_A);//Write to DAC-A input register and update DAC-A DACC->write(value>>8); //send top 8 bits DACC->write(value); //send buttom 8 bits } else if(dacnum == 2) { DACC->write(WRITE_DAC_B_REG_UPDATE_B);//Write to DAC-A input register and update DAC-A DACC->write(value>>8); //send top 8 bits DACC->write(value); //send buttom 8 bits } CS->write(1); } void DACxx6xT::set_DAC_gain(short gain, int dacnum) { if(dacnum == 1) { gain_DAC_A = gain; } else if(dacnum == 2) { gain_DAC_B = gain; } CS->write(0); if(gain_DAC_A == 1 && gain_DAC_B == 1)//Gain: DAC-B gain = 1, DAC-A gain = 1 (power-on default) { DACC->write(DAC_B_G1_DAC_A_G1>>16); DACC->write(DAC_B_G1_DAC_A_G1>>8); DACC->write(DAC_B_G1_DAC_A_G1); gain_DAC_A = 1; gain_DAC_B = 1; } else if(gain_DAC_A == 2 && gain_DAC_B == 1)//Gain: DAC-B gain = 1, DAC-A gain = 2 { DACC->write(DAC_B_G1_DAC_A_G2>>16); DACC->write(DAC_B_G1_DAC_A_G2>>8); DACC->write(DAC_B_G1_DAC_A_G2); gain_DAC_A = 2; //vref_A = 2.5; gain_DAC_B = 1; } else if(gain_DAC_A == 1 && gain_DAC_B == 2)//Gain: DAC-B gain = 2, DAC-A gain = 1 { DACC->write(DAC_B_G2_DAC_A_G1>>16); DACC->write(DAC_B_G2_DAC_A_G1>>8); DACC->write(DAC_B_G2_DAC_A_G1); gain_DAC_A = 1; gain_DAC_B = 2; //vref_B = 2.5; } else if(gain_DAC_A == 2 && gain_DAC_B == 2)//Gain: DAC-B gain = 2, DAC-A gain = 2 { DACC->write(DAC_B_G2_DAC_A_G2>>16); DACC->write(DAC_B_G2_DAC_A_G2>>8); DACC->write(DAC_B_G2_DAC_A_G2); gain_DAC_A = 2; //vref_A = 2.5; gain_DAC_B = 2; //vref_B = 2.5; } CS->write(1); } void DACxx6xT::enable_internal_vref()//Enable internal reference and reset DACs to gain = 2 { CS->write(0); DACC->write(EN_INTREF_GAIN2_ALL>>16); DACC->write(EN_INTREF_GAIN2_ALL>>8); DACC->write(EN_INTREF_GAIN2_ALL); vref_A = INTERNAL_VREF; vref_B = INTERNAL_VREF; gain_DAC_B = 2; gain_DAC_A = 2; CS->write(1); } void DACxx6xT::disable_internal_vref()//Disable internal reference and reset DACs to gain = 1 { CS->write(0); DACC->write(DIS_INTREF_GAIN1_ALL>>16); DACC->write(DIS_INTREF_GAIN1_ALL>>8); DACC->write(DIS_INTREF_GAIN1_ALL); vref_A = vrefpin; vref_B = vrefpin; CS->write(1); } void DACxx6xT::set_custom_gain(float value, int dacnum) { if(dacnum == 1) { custom_gain_A = value; } else if(dacnum == 2) { custom_gain_B = value; } } void DACxx6xT::write_voltage(float value, int dacnum) { if(dacnum == 1) { write(static_cast<int>((value/(vref_A*gain_DAC_A*custom_gain_A))*65535.0), 1); } if(dacnum == 2) { write(static_cast<int>((value/(vref_B*gain_DAC_B*custom_gain_B))*65535.0), 2); } }