MCP4822 dual 12-bit Digital to Analog Converter (DAC) chip.

Dependents:   ADC2DAC

The MCP4822 is a dual 12-bit Digital to Analog Converter that is controlled via an SPI interface. It is available in PDIP, SOIC or MSOP packages. The documentation for the chip is available at Microchip's MC4822 page.

The range also includes 8 or 10-bit DACs, which this library could easily be converted to.

Committer:
atyeomans
Date:
Mon Mar 04 17:06:01 2013 +0000
Revision:
3:7484c0fe6f4d
Parent:
2:e60995ceccbd
Added individual shutdowns

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NickRyder 0:74353da3eacd 1 #include "MCP4822.h"
NickRyder 0:74353da3eacd 2
NickRyder 0:74353da3eacd 3 MCP4822::MCP4822(PinName dataout, PinName clock, PinName chipselect, PinName latch) :
NickRyder 0:74353da3eacd 4 cs(chipselect), latchpin(latch), spi(dataout, NC, clock)
NickRyder 0:74353da3eacd 5 {
NickRyder 0:74353da3eacd 6 cs = 1;
NickRyder 0:74353da3eacd 7 latchpin = 1;
NickRyder 0:74353da3eacd 8 spi.format(16);
NickRyder 0:74353da3eacd 9 }
NickRyder 0:74353da3eacd 10
NickRyder 0:74353da3eacd 11 void MCP4822::setA(float voltage) {
NickRyder 0:74353da3eacd 12 setvoltage(voltage);
NickRyder 0:74353da3eacd 13 }
NickRyder 0:74353da3eacd 14
NickRyder 0:74353da3eacd 15 void MCP4822::setB(float voltage) {
NickRyder 0:74353da3eacd 16 setvoltage(voltage, true);
NickRyder 0:74353da3eacd 17 }
NickRyder 0:74353da3eacd 18
NickRyder 0:74353da3eacd 19 void MCP4822::set(float voltageA, float voltageB) {
NickRyder 0:74353da3eacd 20 setvoltage(voltageA);
NickRyder 0:74353da3eacd 21 setvoltage(voltageB, true);
NickRyder 0:74353da3eacd 22 }
NickRyder 0:74353da3eacd 23
NickRyder 0:74353da3eacd 24 void MCP4822::setvoltage(float voltage, bool chanB) {
NickRyder 0:74353da3eacd 25 int gain = 1;
NickRyder 0:74353da3eacd 26 if (voltage > 2.048) {
NickRyder 0:74353da3eacd 27 gain = 2;
NickRyder 0:74353da3eacd 28 }
NickRyder 0:74353da3eacd 29 unsigned int v;
NickRyder 0:74353da3eacd 30 v = (unsigned int) (voltage * 4096.0 / 2.048 / (float) gain);
NickRyder 0:74353da3eacd 31 write(chanB, (gain == 1), v);
NickRyder 0:74353da3eacd 32 }
NickRyder 0:74353da3eacd 33
NickRyder 0:74353da3eacd 34 void MCP4822::latch() {
NickRyder 0:74353da3eacd 35 latchpin = 0;
NickRyder 0:74353da3eacd 36 latchpin = 1;
NickRyder 0:74353da3eacd 37 }
NickRyder 0:74353da3eacd 38
NickRyder 0:74353da3eacd 39
NickRyder 0:74353da3eacd 40 void MCP4822::write(bool chanB, bool gain1, unsigned int voltage, bool shutdown) {
NickRyder 0:74353da3eacd 41 if (voltage < 4096) {
NickRyder 0:74353da3eacd 42 int msg = 0x0000;
NickRyder 0:74353da3eacd 43 if (chanB) msg |= (0x1 << 15);
NickRyder 0:74353da3eacd 44 if (gain1) msg |= (0x1 << 13);
NickRyder 0:74353da3eacd 45 if (!shutdown) msg |= (0x1 << 12);
NickRyder 0:74353da3eacd 46 msg |= voltage;
NickRyder 0:74353da3eacd 47 cs = 0;
NickRyder 0:74353da3eacd 48 spi.write(msg);
NickRyder 0:74353da3eacd 49 cs = 1;
NickRyder 0:74353da3eacd 50 }
NickRyder 0:74353da3eacd 51 }
NickRyder 0:74353da3eacd 52
NickRyder 0:74353da3eacd 53 void MCP4822::shutdown() {
NickRyder 0:74353da3eacd 54 write(false, false, 0, true);
NickRyder 0:74353da3eacd 55 write(true, false, 0, true);
NickRyder 2:e60995ceccbd 56 }
NickRyder 2:e60995ceccbd 57
NickRyder 2:e60995ceccbd 58 void MCP4822::shutdownA() {
NickRyder 2:e60995ceccbd 59 write(false, false, 0, true);
NickRyder 2:e60995ceccbd 60 }
NickRyder 2:e60995ceccbd 61
NickRyder 2:e60995ceccbd 62 void MCP4822::shutdownB() {
NickRyder 2:e60995ceccbd 63 write(true, false, 0, true);
atyeomans 3:7484c0fe6f4d 64 }
atyeomans 3:7484c0fe6f4d 65
atyeomans 3:7484c0fe6f4d 66 void MCP4822::chipSel(){
atyeomans 3:7484c0fe6f4d 67 cs = !cs;
NickRyder 0:74353da3eacd 68 }