Basic libraries for functionality of the MCP4822 DAC, an easy to use DAC outputting up to 4.096V.
MCP4822.cpp
- Committer:
- JimmyTheHack
- Date:
- 2013-07-16
- Revision:
- 2:39a2c041eefe
- Parent:
- 0:a10e8793cf0a
File content as of revision 2:39a2c041eefe:
#include "MCP4822.h" //initialization function MCP4822::MCP4822(int SPIchannelNum, PinName _CS, PinName _LDAC) : DAC_SPI(SPIchannelNum, _CS, _LDAC){ messageBits(16); frequency(20000000); autoUpdate=1; gain =0; //set gain to x2 to get full range } void MCP4822::select(char DACnum){ DACselect=DACnum & 0x01; //choose between DAC A and DAC B } void MCP4822::write_mv(int mVolts){ //since out reference diode is at 4.096V, we can directly map our voltage values to DAC values when gain is set to x2. if (gain==0){ //gain is x2 write(mVolts); } else{ //gain is x1 write(mVolts*2); } } void MCP4822::write(int value){ //valid voltage values are up to 4096mV. We directly map our value to mV. //All serial commands are 16 bit words. The highest 4 bits are control bits, while the last 12 are the data bits for the 12-bit DAC MCP4822. //bit 15: select which DAC to use. //bit 14: unused //bit 13: 0= gain x2, 1= gain x1 //bit 12: 0= DAC active, 1= shut down DAC //bit 11-0: Data bits for the DAC. if (value > 0xFFF){ value = 0xFFF; //any out of range values will be truncated to our max value } value=value & 0xFFF; //limit our value to 12 bits. //SCK=0; //set the clock low. Data is read on the rising edge of the clock. LDAC=1; CS=0; //enable the chip to recieve data char controlbits=(DACselect<<3)+(gain<<1) +1; int message= (controlbits<<12)+value; (*DACspi).write(message); CS=1; //signal end of message. The data will be loaded into the internal registers. if(autoUpdate){ LDAC=0;} //trigger the update of the output voltage. } void MCP4822::update(){ //triggers the DAC to update output on command. Useful if we wish to synchronize the DAC output value with another event. LDAC=0; } //Set the multiplying factor for the output. Valid inputs are gains of 1 and 2.*/ void MCP4822::setGain(int gain_value){ if (gain_value>1){ gain =1; //Set gain to x2 } else{ gain=0; //Set gain to x1. Limits range to 2.098mV } }