ADC  8.0
ADC.h
1 /* Teensy 3.x, LC ADC library
2  * https://github.com/pedvide/ADC
3  * Copyright (c) 2017 Pedro Villanueva
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25 
26 /* ADC.h: Control for one (Teensy 3.0, LC) or two ADC modules (Teensy 3.1).
27  *
28  */
29 
30 /* TODO
31 * - Function to measure more that 1 pin consecutively (stream?)
32 *
33 * bugs:
34 * - comparison values in 16 bit differential mode are twice what they should be
35 */
36 
37 #ifndef ADC_H
38 #define ADC_H
39 
40 #define ADC_0 0
41 #define ADC_1 1
42 //enum class ADC_NUM {ADC_0, ADC_1}; // too verbose, but it'd avoid some mistakes
43 
44 // include ADC module class
45 #include "ADC_Module.h"
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
54 class ADC
55 {
56  protected:
57  private:
58 
59  // ADCs objects
60  ADC_Module adc0_obj;
61  #if ADC_NUM_ADCS>1
62  ADC_Module adc1_obj;
63  #endif
64 
66  const uint8_t num_ADCs = ADC_NUM_ADCS;
67 
68 
69  public:
70 
72  ADC();
73 
74 
75  // create both adc objects
76 
78  ADC_Module *const adc0 = &adc0_obj; // adc object pointer
79  #if ADC_NUM_ADCS>1
80  ADC_Module *const adc1 = &adc1_obj; // adc object pointer
82  #endif
83 
84  #if ADC_NUM_ADCS==1
85  ADC_Module *const adc[ADC_NUM_ADCS] = {adc0};
86  #else
87  ADC_Module *const adc[ADC_NUM_ADCS] = {adc0, adc1};
88  #endif
89 
90 
92 
94 
98  void setReference(ADC_REFERENCE type, int8_t adc_num = -1);
99 
100 
102 
111  void setResolution(uint8_t bits, int8_t adc_num = -1);
112 
114 
118  uint8_t getResolution(int8_t adc_num = -1);
119 
121 
125  uint32_t getMaxValue(int8_t adc_num = -1);
126 
127 
129 
147  void setConversionSpeed(ADC_CONVERSION_SPEED speed, int8_t adc_num = -1);
148 
149 
151 
161  void setSamplingSpeed(ADC_SAMPLING_SPEED speed, int8_t adc_num = -1);
162 
163 
165 
169  void setAveraging(uint8_t num, int8_t adc_num = -1);
170 
171 
173 
177  void enableInterrupts(int8_t adc_num = -1);
178 
180 
183  void disableInterrupts(int8_t adc_num = -1);
184 
185 
187 
191  void enableDMA(int8_t adc_num = -1);
192 
194 
197  void disableDMA(int8_t adc_num = -1);
198 
199 
201 
209  void enableCompare(int16_t compValue, bool greaterThan, int8_t adc_num = -1);
210 
212 
223  void enableCompareRange(int16_t lowerLimit, int16_t upperLimit, bool insideRange, bool inclusive, int8_t adc_num = -1);
224 
226 
229  void disableCompare(int8_t adc_num = -1);
230 
231 
233 
238  void enablePGA(uint8_t gain, int8_t adc_num = -1);
239 
241 
245  uint8_t getPGA(int8_t adc_num = -1);
246 
248 
251  void disablePGA(int8_t adc_num = -1);
252 
253 
254 
256 
258 
262  bool isConverting(int8_t adc_num = -1);
263 
265 
270  bool isComplete(int8_t adc_num = -1);
271 
273 
277  bool isDifferential(int8_t adc_num = -1);
278 
280 
284  bool isContinuous(int8_t adc_num = -1);
285 
286 
287 
289 
291 
300  int analogRead(uint8_t pin, int8_t adc_num = -1);
301 
303 
314  int analogRead(ADC_INTERNAL_SOURCE pin, int8_t adc_num = -1) __attribute__((always_inline)) {
315  return analogRead(static_cast<uint8_t>(pin), adc_num);
316  }
317 
319 
329  int analogReadDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num = -1);
330 
331 
333 
335 
341  bool startSingleRead(uint8_t pin, int8_t adc_num = -1);
342 
344 
351  bool startSingleDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num = -1);
352 
354 
358  int readSingle(int8_t adc_num = -1);
359 
360 
361 
363 
365 
370  bool startContinuous(uint8_t pin, int8_t adc_num = -1);
371 
373 
379  bool startContinuousDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num = -1);
380 
382 
388  int analogReadContinuous(int8_t adc_num = -1);
389 
391 
394  void stopContinuous(int8_t adc_num = -1);
395 
396 
397 
400  #if ADC_NUM_ADCS>1
401 
403 
405  struct Sync_result{
406  int32_t result_adc0, result_adc1;
407  };
408 
410 
412 
420  Sync_result analogSynchronizedRead(uint8_t pin0, uint8_t pin1);
421 
423 
428  Sync_result analogSyncRead(uint8_t pin0, uint8_t pin1) __attribute__((always_inline)) {return analogSynchronizedRead(pin0, pin1);}
429 
431 
441  Sync_result analogSynchronizedReadDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N);
442 
444 
451  Sync_result analogSyncReadDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N) __attribute__((always_inline)) {
452  return analogSynchronizedReadDifferential(pin0P, pin0N, pin1P, pin1N);
453  }
454 
456 
458 
464  bool startSynchronizedSingleRead(uint8_t pin0, uint8_t pin1);
465 
467 
475  bool startSynchronizedSingleDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N);
476 
478 
482 
483 
485 
487 
492  bool startSynchronizedContinuous(uint8_t pin0, uint8_t pin1);
493 
495 
502  bool startSynchronizedContinuousDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N);
503 
505 
509 
512 
513  #endif
514 
515 
518  void printError() {
519  for(int i=0; i< ADC_NUM_ADCS; i++) {
520  adc[i]->printError();
521  }
522  }
523 
525  void resetError() {
526  for(int i=0; i< ADC_NUM_ADCS; i++) {
527  adc[i]->resetError();
528  }
529  }
530 
531 
533  // should this be a constexpr?
534  static const uint8_t channel2sc1aADC0[ADC_MAX_PIN+1];
535  #if ADC_NUM_ADCS>1
536  static const uint8_t channel2sc1aADC1[ADC_MAX_PIN+1];
538  #endif
539 
541  static const uint8_t sc1a2channelADC0[ADC_MAX_PIN+1];
542  #if ADC_NUM_ADCS>1
543  static const uint8_t sc1a2channelADC1[ADC_MAX_PIN+1];
545  #endif
546 
547 
549  static const ADC_Module::ADC_NLIST diff_table_ADC0[ADC_DIFF_PAIRS];
550  #if ADC_NUM_ADCS>1
551  static const ADC_Module::ADC_NLIST diff_table_ADC1[ADC_DIFF_PAIRS];
553  #endif
554 
555 
556 };
557 
558 
559 
560 
561 #ifdef __cplusplus
562 }
563 #endif
564 
565 
566 #endif // ADC_H
void disableCompare(int8_t adc_num=-1)
Disable the compare function.
Definition: ADC.cpp:455
void disableDMA(int8_t adc_num=-1)
Disable ADC DMA request.
Definition: ADC.cpp:401
Sync_result readSynchronizedContinuous()
Returns the values of both ADCs.
Definition: ADC.cpp:1299
bool isDifferential(int8_t adc_num=-1)
Is the ADC in differential mode?
Definition: ADC.cpp:549
Dictionary with the differential pins as keys and the SC1A number as values.
Definition: ADC_Module.h:483
ADC_Module *const adc1
Object to control the ADC1.
Definition: ADC.h:81
uint8_t getResolution(int8_t adc_num=-1)
Returns the resolution of the ADC_Module.
Definition: ADC.cpp:260
void stopSynchronizedContinuous()
Stops synchronous continuous conversion.
Definition: ADC.cpp:1309
int analogReadDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num=-1)
Reads the differential analog value of two pins (pinP - pinN).
Definition: ADC.cpp:636
ADC()
Definition: ADC.cpp:198
bool isConverting(int8_t adc_num=-1)
Is the ADC converting at the moment?
Definition: ADC.cpp:518
ADC_Module *const adc0
Object to control the ADC0.
Definition: ADC.h:78
Struct for synchronous measurements.
Definition: ADC.h:405
void stopContinuous(int8_t adc_num=-1)
Stops continuous conversion.
Definition: ADC.cpp:919
bool startContinuous(uint8_t pin, int8_t adc_num=-1)
Starts continuous conversion on the pin.
Definition: ADC.cpp:805
static const uint8_t channel2sc1aADC0[ADC_MAX_PIN+1]
Translate pin number to SC1A nomenclature.
Definition: ADC.h:534
ADC_SAMPLING_SPEED
Definition: ADC_Module.h:387
int readSingle(int8_t adc_num=-1)
Reads the analog value of a single conversion.
Definition: ADC.cpp:789
void setConversionSpeed(ADC_CONVERSION_SPEED speed, int8_t adc_num=-1)
Sets the conversion speed (changes the ADC clock, ADCK)
Definition: ADC.cpp:293
bool startSingleDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num=-1)
Start a differential conversion between two pins (pinP - pinN) and enables interrupts.
Definition: ADC.cpp:741
bool isComplete(int8_t adc_num=-1)
Is an ADC conversion ready?
Definition: ADC.cpp:536
bool startContinuousDifferential(uint8_t pinP, uint8_t pinN, int8_t adc_num=-1)
Starts continuous conversion between the pins (pinP-pinN).
Definition: ADC.cpp:856
int analogRead(uint8_t pin, int8_t adc_num=-1)
Returns the analog value of the pin.
Definition: ADC.cpp:582
Definition: ADC_Module.h:476
bool startSynchronizedSingleDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N)
Start a differential conversion between two pins (pin0P - pin0N) and (pin1P - pin1N) ...
Definition: ADC.cpp:1174
Definition: ADC.h:54
void enableInterrupts(int8_t adc_num=-1)
Enable interrupts.
Definition: ADC.cpp:355
ADC_INTERNAL_SOURCE
Definition: ADC_Module.h:190
void resetError()
Resets all errors from the ADC, if any.
Definition: ADC_Module.h:978
Sync_result analogSynchronizedReadDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N)
Returns the differential analog values of both sets of pins, measured at the same time by the two ADC...
Definition: ADC.cpp:1030
bool startSingleRead(uint8_t pin, int8_t adc_num=-1)
Starts an analog measurement on the pin and enables interrupts.
Definition: ADC.cpp:688
static const ADC_Module::ADC_NLIST diff_table_ADC0[ADC_DIFF_PAIRS]
Translate differential pin number to SC1A nomenclature.
Definition: ADC.h:549
static const uint8_t sc1a2channelADC1[ADC_MAX_PIN+1]
Translate pin number to SC1A nomenclature for differential pins.
Definition: ADC.h:544
ADC_CONVERSION_SPEED
Definition: ADC_Module.h:370
void enableCompareRange(int16_t lowerLimit, int16_t upperLimit, bool insideRange, bool inclusive, int8_t adc_num=-1)
Enable the compare function to a range.
Definition: ADC.cpp:441
bool startSynchronizedContinuousDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N)
Starts a continuous differential conversion in both ADCs simultaneously.
Definition: ADC.cpp:1269
void setResolution(uint8_t bits, int8_t adc_num=-1)
Change the resolution of the measurement.
Definition: ADC.cpp:246
Sync_result readSynchronizedSingle()
Reads the analog value of a single conversion.
Definition: ADC.cpp:1221
void enablePGA(uint8_t gain, int8_t adc_num=-1)
Enable and set PGA.
Definition: ADC.cpp:475
bool startSynchronizedSingleRead(uint8_t pin0, uint8_t pin1)
Starts an analog measurement at the same time on the two ADC modules.
Definition: ADC.cpp:1123
void disablePGA(int8_t adc_num=-1)
Disable PGA.
Definition: ADC.cpp:504
bool startSynchronizedContinuous(uint8_t pin0, uint8_t pin1)
Starts a continuous conversion in both ADCs simultaneously.
Definition: ADC.cpp:1237
void setAveraging(uint8_t num, int8_t adc_num=-1)
Set the number of averages.
Definition: ADC.cpp:337
void setSamplingSpeed(ADC_SAMPLING_SPEED speed, int8_t adc_num=-1)
Sets the sampling speed.
Definition: ADC.cpp:318
static const ADC_Module::ADC_NLIST diff_table_ADC1[ADC_DIFF_PAIRS]
Translate differential pin number to SC1A nomenclature.
Definition: ADC.h:552
uint8_t getPGA(int8_t adc_num=-1)
Returns the PGA level.
Definition: ADC.cpp:491
uint32_t getMaxValue(int8_t adc_num=-1)
Returns the maximum value for a measurement: 2^res-1.
Definition: ADC.cpp:274
void disableInterrupts(int8_t adc_num=-1)
Disable interrupts.
Definition: ADC.cpp:369
int analogReadContinuous(int8_t adc_num=-1)
Reads the analog value of a continuous conversion.
Definition: ADC.cpp:906
void enableCompare(int16_t compValue, bool greaterThan, int8_t adc_num=-1)
Enable the compare function to a single value.
Definition: ADC.cpp:421
Sync_result analogSynchronizedRead(uint8_t pin0, uint8_t pin1)
Returns the analog values of both pins, measured at the same time by the two ADC modules.
Definition: ADC.cpp:945
void enableDMA(int8_t adc_num=-1)
Enable DMA request.
Definition: ADC.cpp:387
static const uint8_t channel2sc1aADC1[ADC_MAX_PIN+1]
Translate pin number to SC1A nomenclature.
Definition: ADC.h:537
static const uint8_t sc1a2channelADC0[ADC_MAX_PIN+1]
Translate pin number to SC1A nomenclature for differential pins.
Definition: ADC.h:541
bool isContinuous(int8_t adc_num=-1)
Is the ADC in continuous mode?
Definition: ADC.cpp:562
void resetError()
Resets all errors from all ADCs, if any.
Definition: ADC.h:525
int analogRead(ADC_INTERNAL_SOURCE pin, int8_t adc_num=-1)
Returns the analog value of the special internal source, such as the temperature sensor.
Definition: ADC.h:314
ADC_REFERENCE
Definition: ADC_Module.h:129
void printError()
Definition: ADC.h:518
Sync_result analogSyncReadDifferential(uint8_t pin0P, uint8_t pin0N, uint8_t pin1P, uint8_t pin1N)
Same as analogSynchronizedReadDifferential.
Definition: ADC.h:451
void setReference(ADC_REFERENCE type, int8_t adc_num=-1)
Set the voltage reference you prefer, default is vcc.
Definition: ADC.cpp:221
Sync_result analogSyncRead(uint8_t pin0, uint8_t pin1)
Same as analogSynchronizedRead.
Definition: ADC.h:428
void printError()
Prints the human-readable error, if any.
Definition: ADC_Module.h:935