LTC2301 - 1-Channel, 12-Bit ADCs with I2C Compatible Interface
Features
- 12-Bit Resolution
- Low Power: 1.5mW at 1ksps, 35μW Sleep Mode
- 14ksps Throughput Rate
- Internal Reference
- Low Noise: SNR = 73.5dB
- Guaranteed No Missing Codes
- Single 5V Supply
- 2-wire I2C Compatible Serial Interface with 9 Addresses Plus One Global for Synchronization
- Fast Conversion Time: 1.3μs
- 1-Channel (LTC2301) and 2-Channel (LTC2305) Versions
- Unipolar or Bipolar Input Ranges (Software Selectable)
- Internal Conversion Clock
- Guaranteed Operation from –40°C to 125°C (MSOP Package)
- 12-Pin 4mm × 3mm DFN and 12-Pin MSOP Packages
AEC-Q100 data available for specific packages
Typical Application
Description
The LTC2301/LTC2305 are low noise, low power, 1-/2-channel, 12-bit successive approximation ADCs with an I2C compatible serial interface. These ADCs include an internal reference and a fully differential sample-andhold circuit to reduce common mode noise. The LTC2301/ LTC2305 operate from an internal clock to achieve a fast 1.3μs conversion time.
The LTC2301/LTC2305 operate from a single 5V supply and draw just 300μA at a throughput rate of 1ksps. The ADC enters nap mode when not converting, reducing the power dissipation.
The LTC2301/LTC2305 are available in small 12-pin 4mm × 3mm DFN and 12-pin MSOP packages. The internal 2.5V reference further reduces PCB board space requirements.
The low power consumption and small size make the LTC2301/LTC2305 ideal for battery operated and portable applications, while the 2-wire I2C compatible serial interface makes these ADCs a good match for space-constrained systems.
Packaging
CAD Symbols and Footprints: The downloadable Zip file below contains the schematic symbol and PCB footprints.
For complete and up to date package information and drawings, please refer to our packaging page
| Part Number | Package | Code | Temp | Package Drawing |
RoHS |
|---|---|---|---|---|---|
| LTC2301CDE#PBF | 4x3 DFN-12 | DE/UE | C | 05-08-1695 | Yes |
| LTC2301CDE#TRPBF | 4x3 DFN-12 | DE/UE | C | 05-08-1695 | Yes |
| LTC2301CMS#PBF | MS-12 | MS | C | 05-08-1668 | Yes |
| LTC2301CMS#TRPBF | MS-12 | MS | C | 05-08-1668 | Yes |
| LTC2301HMS#PBF | MS-12 | MS | H | 05-08-1668 | Yes |
| LTC2301HMS#TRPBF | MS-12 | MS | H | 05-08-1668 | Yes |
| LTC2301IDE#PBF | 4x3 DFN-12 | DE/UE | I | 05-08-1695 | Yes |
| LTC2301IDE#TRPBF | 4x3 DFN-12 | DE/UE | I | 05-08-1695 | Yes |
| LTC2301IMS#PBF | MS-12 | MS | I | 05-08-1668 | Yes |
| LTC2301IMS#TRPBF | MS-12 | MS | I | 05-08-1668 | Yes |
Order Info
- Part numbers ending in PBF are lead free. Solder plated terminal finish (SnPb) versions are non-standard and special terms and conditions and pricing applies if available. Please contact LTC marketing for information.
- Part numbers containing TR or TRM are shipped in tape and reel or 500 unit mini tape and reel, respectively
- Please refer to our general ordering information or the product datasheet for more details
Package Variations and Pricing
| Part Number | Package | Temp | Price (1-99) |
Price (1k)* |
RoHS | |
|---|---|---|---|---|---|---|
| LTC2301CDE#PBF | 4x3 DFN-12 | C | $2.79 | $1.95 | Yes | |
| LTC2301CDE#TRPBF | 4x3 DFN-12 | C | $2.01 | Yes | ||
| LTC2301CMS#PBF | MS-12 | C | $2.79 | $1.95 | Yes | |
| LTC2301CMS#TRPBF | MS-12 | C | $2.01 | Yes | ||
| LTC2301HMS#PBF | MS-12 | H | $4.01 | $2.81 | Yes | |
| LTC2301HMS#TRPBF | MS-12 | H | $2.87 | Yes | ||
| LTC2301IDE#PBF | 4x3 DFN-12 | I | $3.34 | $2.34 | Yes | |
| LTC2301IDE#TRPBF | 4x3 DFN-12 | I | $2.40 | Yes | ||
| LTC2301IMS#PBF | MS-12 | I | $3.34 | $2.34 | Yes | |
| LTC2301IMS#TRPBF | MS-12 | I | $2.40 | Yes | ||
| Buy Now • Request Samples | ||||||
Demo Boards
Linear Technology offers many demo boards free of charge to qualified customers. Contact your local sales office or distributor to inquire about a demo board. Certain demo boards are also available for sale via credit card on this website. Demo boards are for evaluation purposes only. It remains the customer’s responsibility to verify proper and reliable operation in the actual end application.| Part Number | Description | Price | Documentation |
|---|---|---|---|
| DC1444A-A | LTC2301 Demo Board | 12-bit, 1-ch I2C 14ksps ADC (req DC590) | $50.00 | |
| Buy Now | |||
Companion Boards
| Part Number | Description | Price | Documentation |
|---|---|---|---|
| DC2026C | Linduino One Isolated USB Demo Board: An Arduino- and QuikEval-Compatible Code Development Platform | $75.00 | |
| DC590B | Isolated USB Serial Controller for Linear Technology QuikEval-Compatible Demo Boards | $50.00 | |
| Buy Now | |||
Designed for Automotive and Transportation Applications
AEC-Q100 data is available for these specific part numbers. Please contact your local sales representative for more information regarding reliability reports or to inquire about parts that are not included. For more information, view our Automotive and Transportation page
| Part Number | Package | Temp | Price (1-99) |
Price (1k)* |
RoHS | |
|---|---|---|---|---|---|---|
| LTC2301HMS#PBF | MS-12 | H | $4.01 | $2.81 | Yes | |
| LTC2301HMS#TRPBF | MS-12 | H | $2.87 | Yes | ||
| LTC2301IMS#PBF | MS-12 | I | $3.34 | $2.34 | Yes | |
| LTC2301IMS#TRPBF | MS-12 | I | $2.40 | Yes | ||
| Buy Now • Request Samples | ||||||
Applications
- Industrial Process Control
- Motor Control
- Accelerometer Measurements
- Battery Operated Instruments
- Isolated and/or Remote Data Acquisition
- Power Supply Monitoring
People Who Viewed This Product Also Viewed
- LTC2309 - 8-Channel, 12-Bit SAR ADC with I2C Interface
- LTC2305 - 2-Channel, 12-Bit ADCs with I2C Compatible Interface
- LT3080 - Adjustable 1.1A Single Resistor Low Dropout Regulator
- LTC2990 - Quad I2C Voltage, Current and Temperature Monitor
- LTC2991 - Octal I2C Voltage, Current, and Temperature Monitor
- LTC2945 - Wide Range I2C Power Monitor
- LTC4151 - High Voltage I2C Current and Voltage Monitor
- LT1761 - 100mA, Low Noise, LDO Micropower Regulators in TSOT-23
- LTM2883 - SPI/Digital or I2C μModule Isolator with Adjustable ±12.5V and 5V Regulated Power
- LT4320/LT4320-1 - Ideal Diode Bridge Controller
Product Notifications
Please login to your MyLinear account for notifications of datasheet updates, new document releases and LTspice model announcements for your favorite products. If you do not have a MyLinear account you may Sign Up Now.
Forgot your password? Click here.
Need help? Email mylinear@linear.com with questions and comments.
Design Tools
Linduino
Linduino is an Arduino compatible platform for developing and distributing firmware libraries and code for SPI and I²C-compatible integrated circuits. The Linduino One board interfaces to more than 300 QuikEval demonstration cards, supporting a variety of product types including analog-to-digital converters (ADCs), digital-to-analog converters (DACs), power monitors, and more. Firmware libraries for individual devices are written in C and designed to be portable to a wide variety of processors and microcontrollers. Each library has a demonstration program that can be uploaded to the Linduino One platform to allow the circuit and software to be quickly and easily verified.
Code
Linduino is Linear Technology's Arduino compatible system for developing and distributing firmware libraries and example code for Linear Technology’s integrated circuits. The code below can be downloaded or copied and pasted into your project. Please visit the Linduino Home Page for demo board, manual and setup information.
This part is Family Supported: There is example code available for a part in this family. The code may require some changes to work with this specific part, however it still provides many good examples of how certain interactions should take place. The code below may rely on other drivers available in the full library.
Download LTC2309 - DC1337A Linduino .INO File
/*!
Linear Technology DC1337A Demonstration Board.
LTC2309: 8-Channel, 12-Bit SAR ADC with I2C Interface.
Linear Technology DC1444A Demonstration Board.
LTC2301: 1-Channel, 12-Bit ADCs with I2C Compatible Interface
@verbatim
NOTES
Setup:
Set the terminal baud rate to 115200 and select the newline terminator. Equipment
required is a voltage source (preferably low-noise) and a precision voltmeter. No
external power supply is required. Ensure all jumpers on the demo board are
installed in their default positions from the factory. Refer to Demo Manual
DC1337A.
How to test Single-Ended mode:
Bipolar Mode:
The voltage source should be connected to one of the inputs CH0,...CH7. Ensure the input is
within its specified absolute input voltage range. (It is easiest
to tie the voltage source negative terminal to COM.) Ensure the voltage
source is set within the range of 0V to +4.096V.
(Swapping input voltages results in a reversed polarity reading.)
Unipolar Mode:
The voltage source should be connected to one of the inputs CH0,...CH7. Ensure the input is
within its specified absolute input voltage range. (It is easiest
to tie the voltage source negative terminal to COM.) Ensure the voltage
source is set within the range of 0V to +4.096V.
How to test Differential Mode:
Bipolar Mode:
The voltage source should be connected between paired channels. Ensure both
inputs are within their specified absolute input voltage range. (It is easiest
to tie the voltage source negative terminal to COM or GND.) Ensure the voltage
source is set within the range of 0 to +4.096V (differential voltage range).
(Swapping input voltages results in a reversed polarity reading.)
Unipolar Mode:
The voltage source should be connected between paired channels. (It is easiest
to tie the voltage source negative terminal to COM or GND.) Ensure both inputs
are within their specified absolute input voltage range. (It is easiest to tie
the voltage source negative terminal to COM or GND.) Ensure the voltage source
is set within the range of 0 to +4.096V (differential voltage range).
USER INPUT DATA FORMAT:
decimal : 1024
hex : 0x400
octal : 02000 (leading 0 "zero")
binary : B10000000000
float : 1024.0
@endverbatim
http://www.linear.com/product/LTC2309
http://www.linear.com/product/LTC2301
http://www.linear.com/product/LTC2309#demoboards
http://www.linear.com/product/LTC2301#demoboards
REVISION HISTORY
$Revision: 4775 $
$Date: 2016-03-14 10:38:42 -0700 (Mon, 14 Mar 2016) $
Copyright (c) 2013, Linear Technology Corp.(LTC)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of Linear Technology Corp.
The Linear Technology Linduino is not affiliated with the official Arduino team.
However, the Linduino is only possible because of the Arduino team's commitment
to the open-source community. Please, visit http://www.arduino.cc and
http://store.arduino.cc , and consider a purchase that will help fund their
ongoing work.
*/
/*! @file
@ingroup LTC2309
*/
#include <Arduino.h>
#include <stdint.h>
#include "Linduino.h"
#include "LT_I2C.h"
#include "UserInterface.h"
#include "QuikEval_EEPROM.h"
#include "LTC2309.h"
#include <Wire.h>
// Function Declaration
void print_title(); // Print the title block
void print_prompt(); // Prompt the user for an input command
uint8_t print_user_command_differential(); // Display selected differential channels
uint8_t print_user_command_single_ended(); // Display selected single ended channels
void print_channel_selection(uint8_t menu);
int8_t menu_1_read_input(); // Read channels in single-ended mode
void menu_3_select_uni_bipolar(); // Sets LTC2309 to Bipolar or Unipolar
void menu_2_select_single_ended_differential(); // Read differential channels
int8_t menu_4_sleep(); // Sets LTC2309 Sleep Mode
void menu_5_set_address();
// Global variables
static uint8_t uni_bipolar = LTC2309_UNIPOLAR_MODE; //!< LTC2309 Unipolar or Bipolar mode selection
static uint8_t single_ended_differential = LTC2309_SINGLE_ENDED_MODE; //!< LTC2309 Unipolar or Bipolar mode selection
static uint8_t i2c_address = LTC2309_I2C_ADDRESS; //!< I2C address in 7 bit format for part
static uint8_t LTC2309_bits = 12; //!< Resolution (12 bits)
static float LTC2309_vref = 4.096;
// Constants
// Build the command for single-ended mode
const uint8_t BUILD_COMMAND_SINGLE_ENDED[8] = {LTC2309_CH0, LTC2309_CH1, LTC2309_CH2, LTC2309_CH3,
LTC2309_CH4, LTC2309_CH5, LTC2309_CH6, LTC2309_CH7
}; //!< Builds the command for single-ended mode
// Build the command for differential mode
const uint8_t BUILD_COMMAND_DIFF[8] = {LTC2309_P0_N1, LTC2309_P2_N3, LTC2309_P4_N5, LTC2309_P6_N7,
LTC2309_P1_N0, LTC2309_P3_N2, LTC2309_P5_N4, LTC2309_P7_N6
}; //!< Build the command for differential mode
//! Initialize Linduino
void setup()
{
quikeval_I2C_init(); // Enable the I2C port
quikeval_I2C_connect(); // Connect I2C to main data port
Serial.begin(115200); // Initialize the serial port to the PC
print_title();
print_prompt();
}
//! Repeats Linduino loop
void loop()
{
int8_t user_command; // The user input command
uint8_t acknowledge = 0; // I2C acknowledge bit
if (Serial.available()) // Check for user input
{
user_command = read_int(); // Read the user command
if (user_command != 'm')
Serial.println(user_command); // Prints the user command to com port
Serial.flush();
switch (user_command)
{
case 1:
menu_1_read_input();
break;
case 2:
menu_2_select_single_ended_differential();
break;
case 3:
menu_3_select_uni_bipolar();
break;
case 4:
menu_4_set_address();
break;
case 5:
menu_5_sleep();
break;
default:
Serial.println(F("Invalid Option"));
break;
}
Serial.println();
if (acknowledge != 0) Serial.println(F("Error: No Acknowledge. Check I2C Address."));
Serial.println(F("*************************"));
print_prompt();
}
}
// Function Definitions
//! Read channels
//! @return 1 if successful, 0 if not
int8_t menu_1_read_input()
{
uint8_t user_command;
uint16_t adc_command; // The LTC2309 command byte
uint16_t adc_code = 0; // The LTC2309 code
uint8_t x, y, startcount, endcount;
uint16_t display_code;
float adc_voltage;
uint8_t acknowledge = 0; // I2C acknowledge bit
if (uni_bipolar == LTC2309_UNIPOLAR_MODE)
{
if (single_ended_differential == LTC2309_SINGLE_ENDED_MODE)
{
Serial.println(F(" Read Input in Single-Ended, Unipolar mode:"));
Serial.println(F(" Note that in Unipolar mode, input voltages less than zero are reported as 0.0V"));
user_command = print_user_command_single_ended();
}
else
{
Serial.println(F(" Read Input in Differential, Unipolar mode:"));
Serial.println(F(" Note that in Unipolar mode, input voltages less than zero are reported as 0.0V"));
user_command = print_user_command_differential();
}
}
else
{
if (single_ended_differential == LTC2309_SINGLE_ENDED_MODE)
{
Serial.println(F(" Read Input in Single-Ended, Bipolar mode:"));
user_command = print_user_command_single_ended();
}
else
{
Serial.println(F(" Read Input in Differential, Bipolar mode:"));
user_command = print_user_command_differential();
}
}
if (user_command == 8) //read all channels
{
startcount = 0;
endcount = 7;
}
else
{
startcount = user_command;
endcount = user_command;
}
if (single_ended_differential == LTC2309_SINGLE_ENDED_MODE) //read single-ended
{
adc_command = BUILD_COMMAND_SINGLE_ENDED[0] | uni_bipolar;
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Throws out last reading and starts CH0 conversion
for (x = startcount; x <= endcount; x++)
{
adc_command = BUILD_COMMAND_SINGLE_ENDED[x % 8] | uni_bipolar; // Send channel config for the NEXT conversion to take place
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Throws out last reading and starts CH0 conversion
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Read previous channel conversion (x-1) and start next one (x)
display_code = adc_code >> (16 - LTC2309_bits);
display_code = display_code & 0xFFF;
Serial.print(F(" Received Code: b"));
Serial.println(display_code, BIN);
adc_voltage = LTC2309_code_to_voltage(adc_code, LTC2309_vref, uni_bipolar);
Serial.print(F(" Voltage read on "));
Serial.print(F("Ch"));
Serial.print(x);
Serial.print(F(": "));
Serial.print(adc_voltage, 4);
Serial.println(F("V"));
Serial.println();
}
}
else //read differential
{
adc_command = BUILD_COMMAND_DIFF[x % 8] | uni_bipolar; // Send channel config for the NEXT conversion to take place
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Read previous channel conversion (x-1) and start next one (x)
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Read previous channel conversion (x-1) and start next one (x)
display_code = adc_code >> (16 - LTC2309_bits);
display_code = display_code & 0xFFF;
Serial.print(F(" Received Code: b"));
Serial.println(display_code, BIN);
adc_voltage = LTC2309_code_to_voltage(adc_code, LTC2309_vref, uni_bipolar);
Serial.print(F(" Voltage read between Chs "));
print_channel_selection(x + y);
Serial.print(adc_voltage, 4);
Serial.println(F("V"));
Serial.println();
}
return(acknowledge);
}
//! Sets LTC2309 to Single-Ended or Differential
void menu_2_select_single_ended_differential()
{
uint8_t user_command;
Serial.println(F("\n 0 = Single-Ended"));
Serial.println(F(" 1 = Differential"));
Serial.print(F(" Enter a Command: "));
user_command = read_int(); // Read user input for uni_bipolar
Serial.println(user_command);
switch (user_command)
{
case 0:
Serial.println(F(" Single-Ended mode selected"));
single_ended_differential = LTC2309_SINGLE_ENDED_MODE;
break;
case 1:
Serial.println(F(" Differential mode selected"));
single_ended_differential = LTC2309_DIFFERENTIAL_MODE;
break;
default:
{
Serial.println(" Invalid Option");
return;
}
break;
}
}
//! Sets LTC2309 to Bipolar or Unipolar
void menu_3_select_uni_bipolar()
{
uint8_t user_command;
Serial.println(F("\n 0 = Unipolar"));
Serial.println(F(" 1 = Bipolar"));
Serial.print(F(" Enter a Command: "));
user_command = read_int(); // Read user input for uni_bipolar
Serial.println(user_command);
switch (user_command)
{
case 0:
Serial.println(F(" Unipolar mode selected"));
uni_bipolar = LTC2309_UNIPOLAR_MODE;
break;
case 1:
Serial.println(F(" Bipolar mode selected"));
uni_bipolar = LTC2309_BIPOLAR_MODE;
break;
default:
{
Serial.println(" Invalid Option");
return;
}
break;
}
}
//! Set the I2C 7 bit address
void menu_4_set_address()
{
int16_t user_command;
Serial.print(F(" Enter the I2C address of the part in decimal format, from 0 to 127 (default is 8)\n"));
user_command = read_int();
Serial.print(F(" Address entered: "));
Serial.println(user_command);
i2c_address = user_command&0x7F;
}
//! Sets LTC2309 Sleep Mode
//! @return 1 if successful, 0 if not
int8_t menu_5_sleep()
{
int8_t acknowledge = 0; // I2C acknowledge bit
uint16_t user_command;
uint16_t adc_code; // The LTC2309 code
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, LTC2309_SLEEP_MODE, &adc_code);
Serial.println();
Serial.print(F(" ADC Command: b"));
Serial.println(LTC2309_SLEEP_MODE, BIN);
Serial.println(F(" LTC2309 is now in sleep mode"));
Serial.println(F(" Enter RETURN to exit Sleep Mode"));
user_command = read_int();
acknowledge |= LTC2309_read(LTC2309_I2C_ADDRESS, LTC2309_EXIT_SLEEP_MODE, &adc_code);
return(acknowledge);
}
//! Prints the title block when the program first starts.
void print_title()
{
Serial.println();
Serial.println(F("*****************************************************************"));
Serial.println(F("* DC1337A Demonstration Program *"));
Serial.println(F("* This program demonstrates how to send data and receive data *"));
Serial.println(F("* from the LTC2309 12-bit ADC. *"));
Serial.println(F("* *"));
Serial.println(F("* *"));
Serial.println(F("* Set the baud rate to 115200 and select the newline terminator.*"));
Serial.println(F("* *"));
Serial.println(F("*****************************************************************"));
}
//! Prints main menu.
void print_prompt()
{
Serial.println(F("1-Read ADC Input "));
Serial.println(F("2-Select Single-Ended / Differential measurement (default is Single_Ended)"));
Serial.println(F("3-Select Unipolar / Bipolar measurement (default is Unipolar)"));
Serial.println(F("4-Sleep Mode"));
Serial.println(F("5-Set I2C address (default is 8)"));
Serial.println();
Serial.print(F("Enter a command: "));
}
//! Display selected differential channels. Displaying single-ended channels is
//! straightforward; not so with differential because the inputs can take either polarity.
uint8_t print_user_command_differential()
{
uint8_t user_command;
Serial.println(F(" *************************"));
Serial.println(F(" 0 = 0P-1N"));
Serial.println(F(" 1 = 2P-3N"));
Serial.println(F(" 2 = 4P-5N"));
Serial.println(F(" 3 = 6P-7N"));
Serial.println(F(" 4 = 1P-0N"));
Serial.println(F(" 5 = 3P-2N"));
Serial.println(F(" 6 = 5P_4N"));
Serial.println(F(" 7 = 7P = 6N"));
Serial.println(F(" 8 = ALL Even_P-Odd_N"));
Serial.println(F(" m = Main Menu"));
Serial.println();
Serial.print(F(" Enter a Command: "));
user_command = read_int(); // Read the menu command
Serial.println(user_command);
switch (user_command) //check for invalid selection
{
case 0:
Serial.println(F(" 0P-1N selected"));
break;
case 1:
Serial.println(F(" 2P-3N selected"));
break;
case 2:
Serial.println(F(" 4P-5N selected"));
break;
case 3:
Serial.println(F(" 6P-7N selected"));
break;
case 4:
Serial.println(F(" 1P-0N selected"));
break;
case 5:
Serial.println(F(" 3P-2N selected"));
break;
case 6:
Serial.println(F(" 5P-4N selected"));
break;
case 7:
Serial.println(F(" 7P-6N selected"));
break;
case 8:
Serial.println(F(" ALL Even_P-Odd_N selected"));
break;
default:
Serial.println(F(" Invalid Option"));
break;
}
return(user_command);
}
//! Display selected differential channels. Displaying single-ended channels is
//! straightforward; not so with differential because the inputs can take either polarity.
void print_channel_selection(uint8_t menu)
{
switch (menu)
{
case 0:
Serial.print(F(" 0P-1N:"));
break;
case 1:
Serial.print(F(" 2P-3N:"));
break;
case 2:
Serial.print(F(" 4P-5N:"));
break;
case 3:
Serial.print(F(" 6P-7N:"));
break;
case 4:
Serial.print(F(" 1P-0N:"));
break;
case 5:
Serial.print(F(" 3P-2N:"));
break;
case 6:
Serial.print(F(" 5P-4N:"));
break;
case 7:
Serial.print(F(" 7P-6N:"));
break;
}
}
//! Display selected differential channels. Displaying single-ended channels is
//! straightforward; not so with differential because the inputs can take either polarity.
uint8_t print_user_command_single_ended()
{
uint8_t user_command;
Serial.println(F("*************************"));
Serial.println(F(" 0 = CH0"));
Serial.println(F(" 1 = CH1"));
Serial.println(F(" 2 = CH2"));
Serial.println(F(" 3 = CH3"));
Serial.println(F(" 4 = CH4"));
Serial.println(F(" 5 = CH5"));
Serial.println(F(" 6 = CH6"));
Serial.println(F(" 7 = CH7"));
Serial.println(F(" 8 = ALL"));
Serial.println(F(" m = Main Menu"));
Serial.println();
Serial.print(F(" Enter a Command: "));
user_command = read_int(); // Read the single-ended menu command
Serial.println(user_command);
if (user_command == 'm')
return(0);
switch (user_command) //check for invalid selection
{
case 0:
Serial.println(F(" CH0 selected"));
break;
case 1:
Serial.println(F(" CH1 selected"));
break;
case 2:
Serial.println(F(" CH2 selected"));
break;
case 3:
Serial.println(F(" CH3 selected"));
break;
case 4:
Serial.println(F(" CH4 selected"));
break;
case 5:
Serial.println(F(" CH5 selected"));
break;
case 6:
Serial.println(F(" CH6 selected"));
break;
case 7:
Serial.println(F(" CH7 selected"));
break;
case 8:
Serial.println(F(" All selected"));
break;
default:
Serial.println(F(" Invalid Option"));
break;
}
return(user_command);
}
Download LTC2309 Linduino .CPP File
/*!
LTC2309: 8-channel, 12-Bit SAR ADC with I2C interface
LTC2301: 1-Channel, 12-Bit ADCs with I2C Compatible Interface
@verbatim
The LTC2309 is a low noise, low power, 8-channel, 12-bit successive
approximation ADC with an I2C compatible serial interface. This ADC includes an
internal reference and a fully differential sample-and-hold circuit to reduce
common mode noise. The LTC2309 operates from an internal clock to achieve a fast
1.3 microsecond conversion time.
The LTC2309 operates from a single 5V supply and draws just 300 microamps at a
throughput rate of 1ksps. The ADC enters nap mode when not converting, reducing
the power dissipation.
@endverbatim
http://www.linear.com/product/LTC2309
http://www.linear.com/product/LTC2301
http://www.linear.com/product/LTC2309#demoboards
http://www.linear.com/product/LTC2301#demoboards
REVISION HISTORY
$Revision: 4775 $
$Date: 2016-03-14 10:38:42 -0700 (Mon, 14 Mar 2016) $
Copyright (c) 2013, Linear Technology Corp.(LTC)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of Linear Technology Corp.
The Linear Technology Linduino is not affiliated with the official Arduino team.
However, the Linduino is only possible because of the Arduino team's commitment
to the open-source community. Please, visit http://www.arduino.cc and
http://store.arduino.cc , and consider a purchase that will help fund their
ongoing work.
*/
//! @defgroup LTC2309 LTC2309: 8-channel, 12-Bit SAR ADC with I2C interface
/*! @file
@ingroup LTC2309
Library for LTC2309: 8-channel, 12-Bit SAR ADC with I2C interface
*/
#include <Arduino.h>
#include <stdint.h>
#include "Linduino.h"
#include "LT_I2C.h"
#include "LTC2309.h"
#include <Wire.h>
// Commands
// Construct a channel / uni/bipolar by bitwise ORing one choice from the channel configuration
// and one choice from the command.
// Example - read channel 3 single-ended
// adc_command = LTC2309_CH3 | LTC2309_UNIPOLAR_MODE;
// Example - read voltage between channels 5 and 4 with 4 as positive polarity and in bipolar mode.
// adc_command = LTC2309_P4_N5 | LTC2309_BIPOLAR_MODE;
// Reads 12 bits in binary format
int8_t LTC2309_read(uint8_t i2c_address, uint8_t adc_command, uint16_t *ptr_adc_code)
{
int8_t ack = 0;
LT_union_int16_2bytes data;
data.LT_byte[1] = 0;
data.LT_byte[0] = 0;
ack = i2c_read_word_data(i2c_address, adc_command, &data.LT_uint16);
*ptr_adc_code = data.LT_uint16; //note the 12 bits of data are left justified
return(ack);
}
// Calculates the LTC2309 input unipolar voltage.
float LTC2309_code_to_voltage(uint16_t adc_code, float vref, uint8_t uni_bipolar)
{
float voltage;
float sign = 1;
if (uni_bipolar == LTC2309_UNIPOLAR_MODE)
{
voltage = (float)adc_code;
voltage = voltage / (pow(2,16)-1); //! 2) This calculates the input as a fraction of the reference voltage (dimensionless)
}
else
{
vref = vref/2;
if ((adc_code & 0x8000) == 0x8000) //adc code is < 0
{
adc_code = (adc_code ^ 0xFFFF)+1; //! Convert ADC code from two's complement to binary
sign = -1;
}
voltage = sign*(float)adc_code;
voltage = voltage / (pow(2,15)-1); //! 2) This calculates the input as a fraction of the reference voltage (dimensionless)
}
voltage = voltage * vref; //! 3) Multiply fraction by Vref to get the actual voltage at the input (in volts)
return(voltage);
}
Download LTC2309 Linduino Header File
/*!
LTC2309: 8-channel, 12-Bit SAR ADC with I2C interface
LTC2301: 1-Channel, 12-Bit ADCs with I2C Compatible Interface
@verbatim
The LTC2309 is a low noise, low power, 8-channel, 12-bit successive
approximation ADC with an I2C compatible serial interface. This ADC includes an
internal reference and a fully differential sample-and-hold circuit to reduce
common mode noise. The LTC2309 operates from an internal clock to achieve a fast
1.3 microsecond conversion time.
The LTC2309 operates from a single 5V supply and draws just 300 microamps at a
throughput rate of 1ksps. The ADC enters nap mode when not converting, reducing
the power dissipation.
I2C DATA FORMAT (MSB First):
Byte #1 Byte #2
START SA6 SA5 SA4 SA3 SA2 SA1 SA0 W SACK SD OS S1 S0 UNI SLP X X SACK
Byte #3 Byte #4 Byte #5
Repeat Start SA6 SA5 SA4 SA3 SA2 SA1 SA0 R SACK D11 D10 D9 D8 D7 D6 D5 D4 MACK D3 D2 D1 D0 X X X X MNACK STOP
SACK : Slave Acknowledge
MACK : Master Acknowledge
MNACK : Master Not Acknowledge
SD : Single, Differential# Bit
OS : ODD, Sign# Bit
Sx : Address Select Bit
COM : CH7/COM Configuration Bit
UNI : Unipolar, Bipolar# Bit
SLP : Sleep Mode Bit
Dx : Data Bits
X : Don't care
Example Code:
Read Channel 0 in Single-Ended Unipolar mode
adc_command = LTC2309_CH0 | LTC2309_UNIPOLAR_MODE; // Build ADC command for channel 0
ack |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Throws out last reading
ack |= LTC2309_read(LTC2309_I2C_ADDRESS, adc_command, &adc_code); // Obtains the current reading and stores to adc_code variable
// Convert adc_code to voltage
adc_voltage = LTC2309_unipolar_code_to_voltage(adc_code, LTC2309_lsb, LTC2309_offset_code);
@endverbatim
http://www.linear.com/product/LTC2309
http://www.linear.com/product/LTC2301
http://www.linear.com/product/LTC2309#demoboards
http://www.linear.com/product/LTC2301#demoboards
REVISION HISTORY
$Revision: 4775 $
$Date: 2016-03-14 10:38:42 -0700 (Mon, 14 Mar 2016) $
Copyright (c) 2013, Linear Technology Corp.(LTC)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of Linear Technology Corp.
The Linear Technology Linduino is not affiliated with the official Arduino team.
However, the Linduino is only possible because of the Arduino team's commitment
to the open-source community. Please, visit http://www.arduino.cc and
http://store.arduino.cc , and consider a purchase that will help fund their
ongoing work.
*/
/*! @file
@ingroup LTC2309
Header for LTC2309: 8-channel, 12-Bit SAR ADC with I2C interface
*/
#ifndef LTC2309_H
#define LTC2309_H
#include <Wire.h>
//! @name I2C addresses
//! @{
//! Un-comment the address corresponding to the LTC2309's address
// // Pin State
// LTC2309 I2C Address // AD1 AD0
#define LTC2309_I2C_ADDRESS 0x08 // LOW LOW
// #define LTC2309_I2C_ADDRESS 0x09 // LOW Float
// #define LTC2309_I2C_ADDRESS 0x0A // LOW HIGH
// #define LTC2309_I2C_ADDRESS 0x0B // Float HIGH
// #define LTC2309_I2C_ADDRESS 0x18 // Float Float
// #define LTC2309_I2C_ADDRESS 0x19 // Float LOW
// #define LTC2309_I2C_ADDRESS 0x1A // HIGH LOW
// #define LTC2309_I2C_ADDRESS 0x1B // HIGH Float
// #define LTC2309_I2C_ADDRESS 0x14 // High HIGH
//!@}
//! @name Single-Ended Channel Configuration
//! @{
// Single-Ended Channel Configuration
#define LTC2309_CH0 0x80
#define LTC2309_CH1 0xC0
#define LTC2309_CH2 0x90
#define LTC2309_CH3 0xD0
#define LTC2309_CH4 0xA0
#define LTC2309_CH5 0xE0
#define LTC2309_CH6 0xB0
#define LTC2309_CH7 0xF0
//!@}
//! @name Differential Channel Configuration
//! @{
// Differential Channel Configuration
#define LTC2309_P0_N1 0x00
#define LTC2309_P1_N0 0x40
#define LTC2309_P2_N3 0x10
#define LTC2309_P3_N2 0x50
#define LTC2309_P4_N5 0x20
#define LTC2309_P5_N4 0x60
#define LTC2309_P6_N7 0x30
#define LTC2309_P7_N6 0x70
//!@}
//! @name LTC2309 Configuration Bits
//! @{
// LTC1867 Configuration Bits
#define LTC2309_SLEEP_MODE 0x04
#define LTC2309_EXIT_SLEEP_MODE 0x00
#define LTC2309_UNIPOLAR_MODE 0x08
#define LTC2309_BIPOLAR_MODE 0x00
#define LTC2309_SINGLE_ENDED_MODE 0x80
#define LTC2309_DIFFERENTIAL_MODE 0x00
//!@}
// Commands
// Construct a channel / uni/bipolar by bitwise ORing one choice from the channel configuration
// and one choice from the command.
// Example - read channel 3 single-ended
// adc_command = LTC2309_CH3 | LTC2309_UNIPOLAR_MODE;
// Example - read voltage between channels 5 and 4 with 4 as positive polarity and in bipolar mode.
// adc_command = LTC2309_P4_N5 | LTC2309_BIPOLAR_MODE;
//! Reads 12-bit code from LTC2309, programs channel and mode for next conversion.
//! @return Returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
int8_t LTC2309_read(uint8_t i2c_address, //!< I2C address of device
uint8_t adc_command, //!< ADC command / address bits
uint16_t *ptr_adc_code //!< Returns code read from ADC
);
//! Calculates the LTC2309 input voltage.
//! @return Calculated voltage
float LTC2309_code_to_voltage(uint16_t adc_code, //!< Code read from ADC
float LTC2309_vref, //!< LSB value (volts)
uint8_t uni_bipolar
);
#endif // LTC2309_H
Technical Support
- For immediate technical assistance, contact your local sales office or distributor or call 1-800-4-LINEAR (US customers only) or 408-432-1900.
- For less urgent requests, please complete our Technical Support Request Form. Please allow 2-3 business days for reply.
