Simple library for SPI DAC MCP4801
Dependents: DAC_MCP4801_example
MCP4801.cpp@0:886b1ee1370b, 2020-03-03 (annotated)
- Committer:
- JohnnyK
- Date:
- Tue Mar 03 20:08:59 2020 +0000
- Revision:
- 0:886b1ee1370b
First release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JohnnyK | 0:886b1ee1370b | 1 | #include "mbed.h" |
JohnnyK | 0:886b1ee1370b | 2 | #include "MCP4801.h" |
JohnnyK | 0:886b1ee1370b | 3 | |
JohnnyK | 0:886b1ee1370b | 4 | MCP4801::MCP4801(SPI &spi, PinName ssel, PinName ldacLowPin,PinName shutdownLowPin): _slaveSelectLow(ssel), _ldacLow(ldacLowPin),_shutdownLow(shutdownLowPin){ |
JohnnyK | 0:886b1ee1370b | 5 | //initialize pins |
JohnnyK | 0:886b1ee1370b | 6 | _slaveSelectLow = 1; |
JohnnyK | 0:886b1ee1370b | 7 | _spi = &spi; |
JohnnyK | 0:886b1ee1370b | 8 | _spi->format(8,0); |
JohnnyK | 0:886b1ee1370b | 9 | _spi->frequency(1000000); |
JohnnyK | 0:886b1ee1370b | 10 | if(_ldacLow.is_connected()) _ldacLow = 0; |
JohnnyK | 0:886b1ee1370b | 11 | if(_shutdownLow.is_connected()) _shutdownLow = 0; |
JohnnyK | 0:886b1ee1370b | 12 | } |
JohnnyK | 0:886b1ee1370b | 13 | |
JohnnyK | 0:886b1ee1370b | 14 | void MCP4801::setOutput_state(uint8_t state, bool soft){ |
JohnnyK | 0:886b1ee1370b | 15 | if(soft){ |
JohnnyK | 0:886b1ee1370b | 16 | shutdown = state; |
JohnnyK | 0:886b1ee1370b | 17 | }else{ |
JohnnyK | 0:886b1ee1370b | 18 | if(_shutdownLow.is_connected()) _shutdownLow = state; |
JohnnyK | 0:886b1ee1370b | 19 | } |
JohnnyK | 0:886b1ee1370b | 20 | |
JohnnyK | 0:886b1ee1370b | 21 | } |
JohnnyK | 0:886b1ee1370b | 22 | |
JohnnyK | 0:886b1ee1370b | 23 | void MCP4801::updateOutput(){ |
JohnnyK | 0:886b1ee1370b | 24 | if(_ldacLow.is_connected()){ |
JohnnyK | 0:886b1ee1370b | 25 | _ldacLow = 1; |
JohnnyK | 0:886b1ee1370b | 26 | wait_us(5000); |
JohnnyK | 0:886b1ee1370b | 27 | _ldacLow = 0; |
JohnnyK | 0:886b1ee1370b | 28 | } |
JohnnyK | 0:886b1ee1370b | 29 | } |
JohnnyK | 0:886b1ee1370b | 30 | |
JohnnyK | 0:886b1ee1370b | 31 | |
JohnnyK | 0:886b1ee1370b | 32 | int MCP4801::setVOutput(float voltage){ |
JohnnyK | 0:886b1ee1370b | 33 | uint8_t gain_bit = 0; |
JohnnyK | 0:886b1ee1370b | 34 | unsigned short int value = 0; |
JohnnyK | 0:886b1ee1370b | 35 | int error; |
JohnnyK | 0:886b1ee1370b | 36 | |
JohnnyK | 0:886b1ee1370b | 37 | //auto choose range |
JohnnyK | 0:886b1ee1370b | 38 | if(voltage < VREF){ |
JohnnyK | 0:886b1ee1370b | 39 | gain_bit = 1; //gain 1 |
JohnnyK | 0:886b1ee1370b | 40 | value = voltage/VREF*RES8BIT; |
JohnnyK | 0:886b1ee1370b | 41 | }else{ |
JohnnyK | 0:886b1ee1370b | 42 | gain_bit = 0; //gain 2 |
JohnnyK | 0:886b1ee1370b | 43 | value = 0.5*voltage/VREF*RES8BIT; |
JohnnyK | 0:886b1ee1370b | 44 | } |
JohnnyK | 0:886b1ee1370b | 45 | char packet[]= {0x00,0x00}; |
JohnnyK | 0:886b1ee1370b | 46 | packet[0] = value >> 4; |
JohnnyK | 0:886b1ee1370b | 47 | packet[1] = value << 4; |
JohnnyK | 0:886b1ee1370b | 48 | packet[0] |= shutdown << 4; //shutdown - output state |
JohnnyK | 0:886b1ee1370b | 49 | packet[0] |= gain_bit << 5; //gain |
JohnnyK | 0:886b1ee1370b | 50 | |
JohnnyK | 0:886b1ee1370b | 51 | _slaveSelectLow = 0; //set chip as listener |
JohnnyK | 0:886b1ee1370b | 52 | error = _spi->write(packet, sizeof(packet), NULL, 0); //send packet (const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) |
JohnnyK | 0:886b1ee1370b | 53 | _slaveSelectLow = 1; //release chip select |
JohnnyK | 0:886b1ee1370b | 54 | if(_ldacLow.is_connected()) _ldacLow = 0; //pull latch down |
JohnnyK | 0:886b1ee1370b | 55 | wait_us(1); |
JohnnyK | 0:886b1ee1370b | 56 | if(_ldacLow.is_connected()) _ldacLow = 1; //pull latch up |
JohnnyK | 0:886b1ee1370b | 57 | |
JohnnyK | 0:886b1ee1370b | 58 | return error; |
JohnnyK | 0:886b1ee1370b | 59 | } |