170 lines
6.0 KiB
C++
170 lines
6.0 KiB
C++
/*************************************************************************
|
|
Title: LTC2493 / LTC2499 library
|
|
Authors: Nathan D. Holmes <maverick@drgw.net>
|
|
File: $Id: $
|
|
License: GNU General Public License v3
|
|
|
|
LICENSE:
|
|
Copyright (C) 2013 Nathan D. Holmes & Michael D. Petersen
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
*************************************************************************/
|
|
|
|
#ifndef LTC2499_H
|
|
#define LTC2499_H
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "Arduino.h"
|
|
#include "Wire.h"
|
|
|
|
#ifndef _BV
|
|
#define _BV(a) (1<<(a))
|
|
#define _UNDEFINE_BV
|
|
#endif
|
|
|
|
#define FAKE_CONFIG1_TEMPERATURE 6
|
|
#define CONFIG1_ENABLE 5
|
|
#define CONFIG1_SINGLE_END 4
|
|
#define CONFIG1_ODD 3
|
|
#define CONFIG1_A2 2
|
|
#define CONFIG1_A1 1
|
|
#define CONFIG1_A0 0
|
|
|
|
#define CHAN_DIFF_0P_1N (0)
|
|
#define CHAN_DIFF_2P_3N (_BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_4P_5N (_BV(CONFIG1_A1))
|
|
#define CHAN_DIFF_6P_7N (_BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_8P_9N (_BV(CONFIG1_A2))
|
|
#define CHAN_DIFF_10P_11N (_BV(CONFIG1_A2) | _BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_12P_13N (_BV(CONFIG1_A2) | _BV(CONFIG1_A1))
|
|
#define CHAN_DIFF_14P_15N (_BV(CONFIG1_A2) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
|
|
#define CHAN_DIFF_1P_0N (_BV(CONFIG1_ODD))
|
|
#define CHAN_DIFF_3P_2N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_5P_4N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A1))
|
|
#define CHAN_DIFF_7P_6N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_9P_8N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A2))
|
|
#define CHAN_DIFF_11P_10N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A0))
|
|
#define CHAN_DIFF_13P_12N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1))
|
|
#define CHAN_DIFF_15P_14N (_BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
|
|
#define CHAN_SINGLE_0P (_BV(CONFIG1_SINGLE_END))
|
|
#define CHAN_SINGLE_1P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD))
|
|
#define CHAN_SINGLE_2P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_3P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_4P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A1))
|
|
#define CHAN_SINGLE_5P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A1))
|
|
#define CHAN_SINGLE_6P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_7P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_8P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A2))
|
|
#define CHAN_SINGLE_9P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A2))
|
|
#define CHAN_SINGLE_10P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A2) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_11P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_12P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1))
|
|
#define CHAN_SINGLE_13P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1))
|
|
#define CHAN_SINGLE_14P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CHAN_SINGLE_15P (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
|
|
// The temperature channel is actually fake - we manipulate things internally
|
|
#define CHAN_TEMPERATURE (_BV(FAKE_CONFIG1_TEMPERATURE))
|
|
|
|
#define CONFIG2_ENABLE2 7
|
|
#define CONFIG2_IM 6
|
|
#define CONFIG2_FA 5
|
|
#define CONFIG2_FB 4
|
|
#define CONFIG2_SPD 3
|
|
|
|
#define CONFIG2_50HZ_REJ (_BV(CONFIG2_FB))
|
|
#define CONFIG2_60HZ_REJ (_BV(CONFIG2_FA))
|
|
#define CONFIG2_60_50HZ_REJ (0)
|
|
#define CONFIG2_SPEED_2X (_BV(CONFIG2_SPD))
|
|
|
|
#define CONFIG1_CHANBITS (_BV(CONFIG1_SINGLE_END) | _BV(CONFIG1_ODD) | _BV(CONFIG1_A2) | _BV(CONFIG1_A1) | _BV(CONFIG1_A0))
|
|
#define CONFIG2_CONFBITS (_BV(CONFIG2_FA) | _BV(CONFIG2_FB) | _BV(CONFIG2_SPD))
|
|
|
|
#define SUCCESS 0
|
|
#define ERR 1
|
|
|
|
#define ADDR_000 0x14
|
|
#define ADDR_00Z 0x15
|
|
#define ADDR_001 0x16
|
|
#define ADDR_0Z0 0x17
|
|
#define ADDR_0ZZ 0x24
|
|
#define ADDR_0Z1 0x25
|
|
#define ADDR_010 0x26
|
|
#define ADDR_01Z 0x27
|
|
#define ADDR_011 0x28
|
|
#define ADDR_Z00 0x35
|
|
#define ADDR_Z01 0x37
|
|
#define ADDR_Z0Z 0x36
|
|
#define ADDR_ZZ0 0x44
|
|
#define ADDR_ZZZ 0x45
|
|
#define ADDR_ZZ1 0x46
|
|
#define ADDR_Z10 0x47
|
|
#define ADDR_Z1Z 0x54
|
|
#define ADDR_Z11 0x55
|
|
#define ADDR_100 0x56
|
|
#define ADDR_10Z 0x57
|
|
#define ADDR_101 0x64
|
|
#define ADDR_1Z0 0x65
|
|
#define ADDR_1ZZ 0x66
|
|
#define ADDR_1Z1 0x67
|
|
#define ADDR_110 0x74
|
|
#define ADDR_111 0x76
|
|
#define ADDR_11Z 0x75
|
|
|
|
#define TEMP_DEG_F 0x01
|
|
|
|
#define TEMP_K 0x00
|
|
#define TEMP_F 0x01
|
|
#define TEMP_C 0x02
|
|
|
|
#define RAW_READ_ERROR 0xFFFFFFFF
|
|
|
|
#define READ_ERROR 0x01000001
|
|
#define OVERRANGE_POSITIVE 0x01000000
|
|
#define OVERRANGE_NEGATIVE 0x11000000
|
|
|
|
class Ltc2499
|
|
{
|
|
public:
|
|
Ltc2499();
|
|
Ltc2499(TwoWire& wire);
|
|
|
|
byte begin(byte Address, uint16_t referenceMillivolts = 4096);
|
|
|
|
long read(); // 24-bit plus sign
|
|
long readAndChangeChannel(byte nextChannel); // 24-bit plus sign
|
|
float readVoltage();
|
|
float readVoltageAndChangeChannel(byte nextChannel);
|
|
|
|
unsigned long readRaw();
|
|
unsigned long readRawAndChangeChannel(byte nextChannel);
|
|
|
|
byte changeChannel(byte channel);
|
|
byte changeConfiguration(byte config);
|
|
unsigned int readTemperatureDeciK();
|
|
float readTemperature(byte temperatureUnits);
|
|
|
|
private:
|
|
byte changeChannel(byte channel, bool addStop);
|
|
uint8_t init_status;
|
|
uint8_t i2cAddr_;
|
|
uint8_t currentConfig;
|
|
uint8_t currentChannel;
|
|
uint16_t referenceMillivolts;
|
|
TwoWire* wireInterface;
|
|
};
|
|
|
|
#endif
|