A library for the MCP3221 12BIT I2C ADC. (2.7 - 5.0v)
Dependents: MCP3221_TEST ADC2DAC
MCP3221.cpp@0:db4e3d0374fe, 2012-10-31 (annotated)
- Committer:
- DaveStyles
- Date:
- Wed Oct 31 21:43:28 2012 +0000
- Revision:
- 0:db4e3d0374fe
MCP3221 12Bit I2C ADC Library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DaveStyles | 0:db4e3d0374fe | 1 | |
DaveStyles | 0:db4e3d0374fe | 2 | #include "MCP3221.h" |
DaveStyles | 0:db4e3d0374fe | 3 | |
DaveStyles | 0:db4e3d0374fe | 4 | //Create instance |
DaveStyles | 0:db4e3d0374fe | 5 | MCP3221::MCP3221(PinName sda, PinName scl, float supplyVoltage) : i2c(sda, scl), _supplyVoltage(supplyVoltage) |
DaveStyles | 0:db4e3d0374fe | 6 | { |
DaveStyles | 0:db4e3d0374fe | 7 | } |
DaveStyles | 0:db4e3d0374fe | 8 | |
DaveStyles | 0:db4e3d0374fe | 9 | //destroy instance |
DaveStyles | 0:db4e3d0374fe | 10 | MCP3221::~MCP3221() |
DaveStyles | 0:db4e3d0374fe | 11 | { |
DaveStyles | 0:db4e3d0374fe | 12 | } |
DaveStyles | 0:db4e3d0374fe | 13 | |
DaveStyles | 0:db4e3d0374fe | 14 | float MCP3221::read() |
DaveStyles | 0:db4e3d0374fe | 15 | { |
DaveStyles | 0:db4e3d0374fe | 16 | |
DaveStyles | 0:db4e3d0374fe | 17 | //You cannot write to an MCP3221, it has no writable registers. |
DaveStyles | 0:db4e3d0374fe | 18 | //MCP3221 also requires an ACKnowledge between each byte sent, before it will send the next byte. So we need to be a bit manual with how we talk to it. |
DaveStyles | 0:db4e3d0374fe | 19 | //It also needs an (NOT) ACKnowledge after the second byte or it will keep sending bytes (continuous sampling) |
DaveStyles | 0:db4e3d0374fe | 20 | // |
DaveStyles | 0:db4e3d0374fe | 21 | //From the datasheet. |
DaveStyles | 0:db4e3d0374fe | 22 | // |
DaveStyles | 0:db4e3d0374fe | 23 | //I2C.START |
DaveStyles | 0:db4e3d0374fe | 24 | //Send 8 bit device/ part address to open conversation. (See .h file for part explanation) |
DaveStyles | 0:db4e3d0374fe | 25 | //read a byte (with ACK) |
DaveStyles | 0:db4e3d0374fe | 26 | //read a byte (with NAK) |
DaveStyles | 0:db4e3d0374fe | 27 | //I2C.STOP |
DaveStyles | 0:db4e3d0374fe | 28 | |
DaveStyles | 0:db4e3d0374fe | 29 | |
DaveStyles | 0:db4e3d0374fe | 30 | // char data[2]; |
DaveStyles | 0:db4e3d0374fe | 31 | |
DaveStyles | 0:db4e3d0374fe | 32 | i2c.start(); |
DaveStyles | 0:db4e3d0374fe | 33 | int acknowledged = i2c.write(MCP3221_CONVERSE); //send a byte to start the conversation. It should be acknowledged. |
DaveStyles | 0:db4e3d0374fe | 34 | _data[0] = i2c.read(1); //read a byte. acknowledge when we have it. |
DaveStyles | 0:db4e3d0374fe | 35 | _data[1] = i2c.read(0); //read the second byte. (n)acknowledge when we have it to stop the flow. |
DaveStyles | 0:db4e3d0374fe | 36 | i2c.stop(); |
DaveStyles | 0:db4e3d0374fe | 37 | |
DaveStyles | 0:db4e3d0374fe | 38 | //convert to 12 bit. |
DaveStyles | 0:db4e3d0374fe | 39 | short res; |
DaveStyles | 0:db4e3d0374fe | 40 | int _12_bit_var; // 2 bytes |
DaveStyles | 0:db4e3d0374fe | 41 | char _4_bit_MSnibble = _data[0]; // 1 byte, example 0000 1000 |
DaveStyles | 0:db4e3d0374fe | 42 | char _8_bit_LSByte = _data[1]; // 1 byte, example 1111 0000 |
DaveStyles | 0:db4e3d0374fe | 43 | |
DaveStyles | 0:db4e3d0374fe | 44 | _12_bit_var = ((0x0F & _4_bit_MSnibble) << 8) | _8_bit_LSByte; //example 100011110000 |
DaveStyles | 0:db4e3d0374fe | 45 | res=_12_bit_var; |
DaveStyles | 0:db4e3d0374fe | 46 | |
DaveStyles | 0:db4e3d0374fe | 47 | return (_supplyVoltage/4096) * res; |
DaveStyles | 0:db4e3d0374fe | 48 | |
DaveStyles | 0:db4e3d0374fe | 49 | } |
DaveStyles | 0:db4e3d0374fe | 50 |