ADC Library
MCP3424.cpp@0:a6ef27377050, 2016-04-14 (annotated)
- Committer:
- chrissnow
- Date:
- Thu Apr 14 09:52:09 2016 +0000
- Revision:
- 0:a6ef27377050
init;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chrissnow | 0:a6ef27377050 | 1 | /* MCP3424 library version 1.2 |
chrissnow | 0:a6ef27377050 | 2 | |
chrissnow | 0:a6ef27377050 | 3 | Writed by B@tto |
chrissnow | 0:a6ef27377050 | 4 | Contact : batto@hotmail.fr |
chrissnow | 0:a6ef27377050 | 5 | |
chrissnow | 0:a6ef27377050 | 6 | |
chrissnow | 0:a6ef27377050 | 7 | MCP3424.cpp - ADC 18 bits i2c library for Wiring & Arduino |
chrissnow | 0:a6ef27377050 | 8 | Copyright (c) 2012 Yann LEFEBVRE. All right reserved. |
chrissnow | 0:a6ef27377050 | 9 | |
chrissnow | 0:a6ef27377050 | 10 | This library is free software; you can redistribute it and/or |
chrissnow | 0:a6ef27377050 | 11 | modify it under the terms of the GNU Lesser General Public |
chrissnow | 0:a6ef27377050 | 12 | License as published by the Free Software Foundation; either |
chrissnow | 0:a6ef27377050 | 13 | version 2.1 of the License, or (at your option) any later version. |
chrissnow | 0:a6ef27377050 | 14 | |
chrissnow | 0:a6ef27377050 | 15 | This library is distributed in the hope that it will be useful, |
chrissnow | 0:a6ef27377050 | 16 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
chrissnow | 0:a6ef27377050 | 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
chrissnow | 0:a6ef27377050 | 18 | Lesser General Public License for more details. |
chrissnow | 0:a6ef27377050 | 19 | |
chrissnow | 0:a6ef27377050 | 20 | You should have received a copy of the GNU Lesser General Public |
chrissnow | 0:a6ef27377050 | 21 | License along with this library; if not, write to the Free Software |
chrissnow | 0:a6ef27377050 | 22 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
chrissnow | 0:a6ef27377050 | 23 | */ |
chrissnow | 0:a6ef27377050 | 24 | #include <MCP3424.h> |
chrissnow | 0:a6ef27377050 | 25 | #include "mbed.h" |
chrissnow | 0:a6ef27377050 | 26 | |
chrissnow | 0:a6ef27377050 | 27 | MCP3424::MCP3424(PinName SDA, PinName SCL, uint8_t adresse):i2c(SDA, SCL){ |
chrissnow | 0:a6ef27377050 | 28 | |
chrissnow | 0:a6ef27377050 | 29 | _adresse|=0x0D<<3; |
chrissnow | 0:a6ef27377050 | 30 | _adresse = _adresse<<1; |
chrissnow | 0:a6ef27377050 | 31 | //_adresse|=adresse; |
chrissnow | 0:a6ef27377050 | 32 | } |
chrissnow | 0:a6ef27377050 | 33 | |
chrissnow | 0:a6ef27377050 | 34 | MCP3424::~MCP3424(){ |
chrissnow | 0:a6ef27377050 | 35 | |
chrissnow | 0:a6ef27377050 | 36 | } |
chrissnow | 0:a6ef27377050 | 37 | |
chrissnow | 0:a6ef27377050 | 38 | |
chrissnow | 0:a6ef27377050 | 39 | void MCP3424::Configuration(char channel,char resolution,bool mode,char PGA){ |
chrissnow | 0:a6ef27377050 | 40 | _PGA=PGA; |
chrissnow | 0:a6ef27377050 | 41 | |
chrissnow | 0:a6ef27377050 | 42 | if(resolution!=12 && resolution!=14 && resolution!=16 && resolution!=18) { |
chrissnow | 0:a6ef27377050 | 43 | _resolution=12; |
chrissnow | 0:a6ef27377050 | 44 | } else _resolution=resolution; |
chrissnow | 0:a6ef27377050 | 45 | |
chrissnow | 0:a6ef27377050 | 46 | _mode=mode; |
chrissnow | 0:a6ef27377050 | 47 | _cfgbyte=0; |
chrissnow | 0:a6ef27377050 | 48 | _cfgbyte=_cfgbyte<<2; |
chrissnow | 0:a6ef27377050 | 49 | _cfgbyte|=(channel-1); |
chrissnow | 0:a6ef27377050 | 50 | _cfgbyte=_cfgbyte<<1; |
chrissnow | 0:a6ef27377050 | 51 | _cfgbyte|=mode; |
chrissnow | 0:a6ef27377050 | 52 | _cfgbyte=_cfgbyte<<2; |
chrissnow | 0:a6ef27377050 | 53 | _cfgbyte|=int((_resolution-12)/2); |
chrissnow | 0:a6ef27377050 | 54 | _cfgbyte=_cfgbyte<<2; |
chrissnow | 0:a6ef27377050 | 55 | switch(PGA) |
chrissnow | 0:a6ef27377050 | 56 | { |
chrissnow | 0:a6ef27377050 | 57 | case 1: |
chrissnow | 0:a6ef27377050 | 58 | _cfgbyte|=0x00; |
chrissnow | 0:a6ef27377050 | 59 | |
chrissnow | 0:a6ef27377050 | 60 | break; |
chrissnow | 0:a6ef27377050 | 61 | case 2: |
chrissnow | 0:a6ef27377050 | 62 | _cfgbyte|=0x01; |
chrissnow | 0:a6ef27377050 | 63 | |
chrissnow | 0:a6ef27377050 | 64 | break; |
chrissnow | 0:a6ef27377050 | 65 | case 4: |
chrissnow | 0:a6ef27377050 | 66 | _cfgbyte|=0x10; |
chrissnow | 0:a6ef27377050 | 67 | |
chrissnow | 0:a6ef27377050 | 68 | break; |
chrissnow | 0:a6ef27377050 | 69 | case 8: |
chrissnow | 0:a6ef27377050 | 70 | _cfgbyte|=0x11; |
chrissnow | 0:a6ef27377050 | 71 | |
chrissnow | 0:a6ef27377050 | 72 | break; |
chrissnow | 0:a6ef27377050 | 73 | } |
chrissnow | 0:a6ef27377050 | 74 | |
chrissnow | 0:a6ef27377050 | 75 | i2c.write(_adresse,&_cfgbyte,1); |
chrissnow | 0:a6ef27377050 | 76 | |
chrissnow | 0:a6ef27377050 | 77 | } |
chrissnow | 0:a6ef27377050 | 78 | |
chrissnow | 0:a6ef27377050 | 79 | void MCP3424::NewConversion(){ |
chrissnow | 0:a6ef27377050 | 80 | |
chrissnow | 0:a6ef27377050 | 81 | char byte = _cfgbyte|=128; |
chrissnow | 0:a6ef27377050 | 82 | i2c.write(_adresse,&byte,1); |
chrissnow | 0:a6ef27377050 | 83 | } |
chrissnow | 0:a6ef27377050 | 84 | |
chrissnow | 0:a6ef27377050 | 85 | bool MCP3424::IsConversionFinished(){ |
chrissnow | 0:a6ef27377050 | 86 | |
chrissnow | 0:a6ef27377050 | 87 | if(_resolution!=18){ |
chrissnow | 0:a6ef27377050 | 88 | _RequestedByte = 3; |
chrissnow | 0:a6ef27377050 | 89 | } else _RequestedByte = 4; |
chrissnow | 0:a6ef27377050 | 90 | |
chrissnow | 0:a6ef27377050 | 91 | i2c.read(_adresse, _Buffer,_RequestedByte); |
chrissnow | 0:a6ef27377050 | 92 | |
chrissnow | 0:a6ef27377050 | 93 | |
chrissnow | 0:a6ef27377050 | 94 | _testvariable = _Buffer[_RequestedByte-1]>>7; |
chrissnow | 0:a6ef27377050 | 95 | |
chrissnow | 0:a6ef27377050 | 96 | return _testvariable; |
chrissnow | 0:a6ef27377050 | 97 | |
chrissnow | 0:a6ef27377050 | 98 | } |
chrissnow | 0:a6ef27377050 | 99 | |
chrissnow | 0:a6ef27377050 | 100 | |
chrissnow | 0:a6ef27377050 | 101 | long MCP3424::Measure(){ |
chrissnow | 0:a6ef27377050 | 102 | |
chrissnow | 0:a6ef27377050 | 103 | _resultat=0; |
chrissnow | 0:a6ef27377050 | 104 | |
chrissnow | 0:a6ef27377050 | 105 | while(IsConversionFinished()==1); |
chrissnow | 0:a6ef27377050 | 106 | |
chrissnow | 0:a6ef27377050 | 107 | switch (_resolution){ |
chrissnow | 0:a6ef27377050 | 108 | |
chrissnow | 0:a6ef27377050 | 109 | case 12: |
chrissnow | 0:a6ef27377050 | 110 | _resultat = _Buffer[0]; |
chrissnow | 0:a6ef27377050 | 111 | _resultat &= 0x0f;//0b00001111; |
chrissnow | 0:a6ef27377050 | 112 | _resultat = _resultat << 8; |
chrissnow | 0:a6ef27377050 | 113 | _resultat |= _Buffer[1]; |
chrissnow | 0:a6ef27377050 | 114 | |
chrissnow | 0:a6ef27377050 | 115 | if(_resultat>2048-1) { |
chrissnow | 0:a6ef27377050 | 116 | _resultat=_resultat-4096-1; |
chrissnow | 0:a6ef27377050 | 117 | } |
chrissnow | 0:a6ef27377050 | 118 | |
chrissnow | 0:a6ef27377050 | 119 | _resultat = _resultat*1000/_PGA; |
chrissnow | 0:a6ef27377050 | 120 | |
chrissnow | 0:a6ef27377050 | 121 | break; |
chrissnow | 0:a6ef27377050 | 122 | |
chrissnow | 0:a6ef27377050 | 123 | case 14: |
chrissnow | 0:a6ef27377050 | 124 | _resultat = _Buffer[0]; |
chrissnow | 0:a6ef27377050 | 125 | _resultat &= 0x3f;//0b00111111; |
chrissnow | 0:a6ef27377050 | 126 | _resultat = _resultat << 8; |
chrissnow | 0:a6ef27377050 | 127 | _resultat |= _Buffer[1]; |
chrissnow | 0:a6ef27377050 | 128 | |
chrissnow | 0:a6ef27377050 | 129 | if(_resultat>8192-1) { |
chrissnow | 0:a6ef27377050 | 130 | _resultat=_resultat-16384-1; |
chrissnow | 0:a6ef27377050 | 131 | } |
chrissnow | 0:a6ef27377050 | 132 | |
chrissnow | 0:a6ef27377050 | 133 | _resultat = _resultat*250/_PGA; |
chrissnow | 0:a6ef27377050 | 134 | |
chrissnow | 0:a6ef27377050 | 135 | break; |
chrissnow | 0:a6ef27377050 | 136 | |
chrissnow | 0:a6ef27377050 | 137 | case 16: |
chrissnow | 0:a6ef27377050 | 138 | |
chrissnow | 0:a6ef27377050 | 139 | _resultat = _Buffer[0]; |
chrissnow | 0:a6ef27377050 | 140 | _resultat = _resultat << 8; |
chrissnow | 0:a6ef27377050 | 141 | _resultat |= _Buffer[1]; |
chrissnow | 0:a6ef27377050 | 142 | |
chrissnow | 0:a6ef27377050 | 143 | if(_resultat>32768-1) { |
chrissnow | 0:a6ef27377050 | 144 | _resultat=_resultat-65536-1; |
chrissnow | 0:a6ef27377050 | 145 | } |
chrissnow | 0:a6ef27377050 | 146 | |
chrissnow | 0:a6ef27377050 | 147 | _resultat = _resultat*62.5/_PGA; |
chrissnow | 0:a6ef27377050 | 148 | |
chrissnow | 0:a6ef27377050 | 149 | break; |
chrissnow | 0:a6ef27377050 | 150 | |
chrissnow | 0:a6ef27377050 | 151 | case 18: |
chrissnow | 0:a6ef27377050 | 152 | |
chrissnow | 0:a6ef27377050 | 153 | _resultat = _Buffer[0]; |
chrissnow | 0:a6ef27377050 | 154 | _resultat&=0x02;//0b00000011; |
chrissnow | 0:a6ef27377050 | 155 | _resultat = _resultat << 8; |
chrissnow | 0:a6ef27377050 | 156 | _resultat |= _Buffer[1]; |
chrissnow | 0:a6ef27377050 | 157 | _resultat = _resultat << 8; |
chrissnow | 0:a6ef27377050 | 158 | _resultat |= _Buffer[2]; |
chrissnow | 0:a6ef27377050 | 159 | |
chrissnow | 0:a6ef27377050 | 160 | if(_resultat>131072-1) { |
chrissnow | 0:a6ef27377050 | 161 | _resultat=_resultat-262144-1; |
chrissnow | 0:a6ef27377050 | 162 | } |
chrissnow | 0:a6ef27377050 | 163 | |
chrissnow | 0:a6ef27377050 | 164 | _resultat = _resultat*15.625/_PGA; |
chrissnow | 0:a6ef27377050 | 165 | |
chrissnow | 0:a6ef27377050 | 166 | break; |
chrissnow | 0:a6ef27377050 | 167 | } |
chrissnow | 0:a6ef27377050 | 168 | |
chrissnow | 0:a6ef27377050 | 169 | return _resultat; |
chrissnow | 0:a6ef27377050 | 170 | |
chrissnow | 0:a6ef27377050 | 171 | |
chrissnow | 0:a6ef27377050 | 172 | } |
chrissnow | 0:a6ef27377050 | 173 | |
chrissnow | 0:a6ef27377050 | 174 |