-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLTC2499.h
169 lines (141 loc) · 6.14 KB
/
LTC2499.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*************************************************************************
Title: LTC2493 / LTC2499 library
Authors: Nathan D. Holmes <[email protected]>
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