11//
22// FILE: ACS712.cpp
33// AUTHOR: Rob Tillaart, Pete Thompson
4- // VERSION: 0.3.3
4+ // VERSION: 0.3.4
55// DATE: 2020-08-02
66// PURPOSE: ACS712 library - current measurement
77// URL: https://github.com/RobTillaart/ACS712
1414ACS712::ACS712 (uint8_t analogPin, float volts, uint16_t maxADC, float mVperAmpere )
1515{
1616 _pin = analogPin;
17+ _mVperAmpere = mVperAmpere ;
18+ _formFactor = ACS712_FF_SINUS;
19+ _noisemV = ACS712_DEFAULT_NOISE; // 21mV according to datasheet
20+
21+ // set in setADC()
22+ // keep it here until after experimental.
1723 _maxADC = maxADC;
1824 _mVperStep = 1000.0 * volts / maxADC; // 1x 1000 for V -> mV
19- _mVperAmpere = mVperAmpere ;
2025 _mAPerStep = 1000.0 * _mVperStep / _mVperAmpere;
21- _formFactor = ACS712_FF_SINUS;
2226 _midPoint = maxADC / 2 ;
23- _noisemV = ACS712_DEFAULT_NOISE; // 21mV according to datasheet
27+
28+ // default ADC is internal.
29+ setADC (_internalAnalog, volts, maxADC);
2430}
2531
2632
@@ -36,16 +42,16 @@ float ACS712::mA_peak2peak(float frequency, uint16_t cycles)
3642 {
3743 int minimum, maximum;
3844 // Better than using midPoint
39- minimum = maximum = analogRead (_pin);
45+ minimum = maximum = _readADC (_pin);
4046
4147 // find minimum and maximum
4248 uint32_t start = micros ();
43- while (micros () - start < period) // UNO ~180 samples...
49+ while (micros () - start < period) // UNO ~180 samples...
4450 {
45- int value = analogRead (_pin);
51+ int value = _readADC (_pin);
4652 if (_suppresNoise) // average 2 samples.
4753 {
48- value = (value + analogRead (_pin))/2 ;
54+ value = (value + _readADC (_pin))/2 ;
4955 }
5056 // determine extremes
5157 if (value < minimum) minimum = value;
@@ -76,17 +82,17 @@ float ACS712::mA_AC(float frequency, uint16_t cycles)
7682 uint16_t zeros = 0 ;
7783
7884 int _min, _max;
79- _min = _max = analogRead (_pin);
85+ _min = _max = _readADC (_pin);
8086
8187 // find minimum and maximum and count the zero-level "percentage"
8288 uint32_t start = micros ();
8389 while (micros () - start < period) // UNO ~180 samples...
8490 {
8591 samples++;
86- int value = analogRead (_pin);
92+ int value = _readADC (_pin);
8793 if (_suppresNoise) // average 2 samples.
8894 {
89- value = (value + analogRead (_pin))/2 ;
95+ value = (value + _readADC (_pin))/2 ;
9096 }
9197 // determine extremes
9298 if (value < _min) _min = value;
@@ -138,10 +144,10 @@ float ACS712::mA_AC_sampling(float frequency, uint16_t cycles)
138144 while (micros () - start < period)
139145 {
140146 samples++;
141- int value = analogRead (_pin);
147+ int value = _readADC (_pin);
142148 if (_suppresNoise) // average 2 samples.
143149 {
144- value = (value + analogRead (_pin))/2 ;
150+ value = (value + _readADC (_pin))/2 ;
145151 }
146152 float current = value - _midPoint;
147153 sumSquared += (current * current);
@@ -163,15 +169,15 @@ float ACS712::mA_AC_sampling(float frequency, uint16_t cycles)
163169float ACS712::mA_DC (uint16_t cycles)
164170{
165171 // read at least twice to stabilize the ADC
166- analogRead (_pin);
172+ _readADC (_pin);
167173 if (cycles == 0 ) cycles = 1 ;
168174 float sum = 0 ;
169175 for (uint16_t i = 0 ; i < cycles; i++)
170176 {
171- int value = analogRead (_pin);
177+ int value = _readADC (_pin);
172178 if (_suppresNoise) // average 2 samples.
173179 {
174- value = (value + analogRead (_pin))/2 ;
180+ value = (value + _readADC (_pin))/2 ;
175181 }
176182 sum += (value - _midPoint);
177183 }
@@ -227,7 +233,7 @@ uint16_t ACS712::autoMidPoint(float frequency, uint16_t cycles)
227233 uint32_t start = micros ();
228234 while (micros () - start < twoPeriods)
229235 {
230- uint16_t reading = analogRead (_pin);
236+ uint16_t reading = _readADC (_pin);
231237 subTotal += reading;
232238 samples++;
233239 // Delaying prevents overflow
@@ -323,14 +329,14 @@ float ACS712::detectFrequency(float minimalFrequency)
323329{
324330 int maximum = 0 ;
325331 int minimum = 0 ;
326- maximum = minimum = analogRead (_pin);
332+ maximum = minimum = _readADC (_pin);
327333
328334 // determine maxima
329335 uint32_t timeOut = round (1000000.0 / minimalFrequency);
330336 uint32_t start = micros ();
331337 while (micros () - start < timeOut)
332338 {
333- int value = analogRead (_pin);
339+ int value = _readADC (_pin);
334340 if (value > maximum) maximum = value;
335341 if (value < minimum) minimum = value;
336342 }
@@ -346,13 +352,13 @@ float ACS712::detectFrequency(float minimalFrequency)
346352 timeOut *= 10 ;
347353 start = micros ();
348354 // casting to int to keep compiler happy.
349- while ((int (analogRead (_pin)) > Q1) && ((micros () - start) < timeOut));
350- while ((int (analogRead (_pin)) <= Q3) && ((micros () - start) < timeOut));
355+ while ((int (_readADC (_pin)) > Q1) && ((micros () - start) < timeOut));
356+ while ((int (_readADC (_pin)) <= Q3) && ((micros () - start) < timeOut));
351357 start = micros ();
352358 for (int i = 0 ; i < 10 ; i++)
353359 {
354- while ((int (analogRead (_pin)) > Q1) && ((micros () - start) < timeOut));
355- while ((int (analogRead (_pin)) <= Q3) && ((micros () - start) < timeOut));
360+ while ((int (_readADC (_pin)) > Q1) && ((micros () - start) < timeOut));
361+ while ((int (_readADC (_pin)) <= Q3) && ((micros () - start) < timeOut));
356362 }
357363 uint32_t stop = micros ();
358364
@@ -380,13 +386,13 @@ float ACS712::getMicrosAdjust()
380386// DEBUG
381387uint16_t ACS712::getMinimum (uint16_t milliSeconds)
382388{
383- uint16_t minimum = analogRead (_pin);
389+ uint16_t minimum = _readADC (_pin);
384390
385391 // find minimum
386392 uint32_t start = millis ();
387393 while (millis () - start < milliSeconds)
388394 {
389- uint16_t value = analogRead (_pin);
395+ uint16_t value = _readADC (_pin);
390396 if (value < minimum) minimum = value;
391397 }
392398 return minimum;
@@ -395,18 +401,29 @@ uint16_t ACS712::getMinimum(uint16_t milliSeconds)
395401
396402uint16_t ACS712::getMaximum (uint16_t milliSeconds)
397403{
398- uint16_t maximum = analogRead (_pin);
404+ uint16_t maximum = _readADC (_pin);
399405
400406 // find minimum
401407 uint32_t start = millis ();
402408 while (millis () - start < milliSeconds)
403409 {
404- uint16_t value = analogRead (_pin);
410+ uint16_t value = _readADC (_pin);
405411 if (value > maximum) maximum = value;
406412 }
407413 return maximum;
408414}
409415
410416
417+ void ACS712::setADC (uint16_t (* f)(uint8_t ), float volts, uint16_t maxADC)
418+ {
419+ _readADC = f;
420+
421+ _maxADC = maxADC;
422+ _mVperStep = 1000.0 * volts / maxADC; // 1x 1000 for V -> mV
423+ _mAPerStep = 1000.0 * _mVperStep / _mVperAmpere;
424+ _midPoint = maxADC / 2 ;
425+ }
426+
427+
411428// -- END OF FILE --
412429
0 commit comments