40 #include <settings_defines.h>
58 #if ADC_DIFF_PAIRS > 0
70 #if ADC_DIFF_PAIRS > 0
79 const uint8_t*
const a_channel2sc1a,
80 const ADC_NLIST*
const a_diff_table,
81 ADC_REGS_t &a_adc_regs);
90 const uint8_t*
const a_channel2sc1a,
91 ADC_REGS_t &a_adc_regs);
129 void setResolution(uint8_t bits);
135 uint8_t getResolution();
141 uint32_t getMaxValue();
184 void setAveraging(uint8_t num);
193 void enableInterrupts(
void (*isr)(
void), uint8_t priority=255);
196 void disableInterrupts();
219 void enableCompare(int16_t compValue,
bool greaterThan);
232 void enableCompareRange(int16_t lowerLimit, int16_t upperLimit,
bool insideRange,
bool inclusive);
235 void disableCompare();
244 void enablePGA(uint8_t gain);
260 atomic::setBitFlag(adc_regs.GC, ADC_GC_ADCO);
262 atomic::setBitFlag(adc_regs.SC3, ADC_SC3_ADCO);
268 atomic::clearBitFlag(adc_regs.GC, ADC_GC_ADCO);
270 atomic::clearBitFlag(adc_regs.SC3, ADC_SC3_ADCO);
279 atomic::clearBitFlag(adc_regs.SC1A, ADC_SC1_DIFF);
282 #if ADC_DIFF_PAIRS > 0
283 void differentialMode() __attribute__((always_inline)) {
285 atomic::setBitFlag(adc_regs.SC1A, ADC_SC1_DIFF);
292 atomic::clearBitFlag(adc_regs.CFG, ADC_CFG_ADTRG);
294 atomic::clearBitFlag(adc_regs.SC2, ADC_SC2_ADTRG);
301 atomic::setBitFlag(adc_regs.CFG, ADC_CFG_ADTRG);
303 atomic::setBitFlag(adc_regs.SC2, ADC_SC2_ADTRG);
316 return atomic::getBitFlag(adc_regs.GS, ADC_GS_ADACT);
319 return atomic::getBitFlag(adc_regs.SC2, ADC_SC2_ADACT);
332 return atomic::getBitFlag(adc_regs.HS, ADC_HS_COCO0);
335 return atomic::getBitFlag(adc_regs.SC1A, ADC_SC1_COCO);
340 #if ADC_DIFF_PAIRS > 0
345 volatile bool isDifferential() __attribute__((always_inline)) {
347 return atomic::getBitFlag(adc_regs.SC1A, ADC_SC1_DIFF);
357 return atomic::getBitFlag(adc_regs.GC, ADC_GC_ADCO);
360 return atomic::getBitFlag(adc_regs.SC3, ADC_SC3_ADCO);
370 volatile bool isPGAEnabled() __attribute__((always_inline)) {
371 return atomic::getBitFlag(adc_regs.PGA, ADC_PGA_PGAEN);
383 bool checkPin(uint8_t pin);
391 bool checkDifferentialPins(uint8_t pinP, uint8_t pinN);
401 void startReadFast(uint8_t pin);
403 #if ADC_DIFF_PAIRS > 0
410 void startDifferentialFast(uint8_t pinP, uint8_t pinN);
423 int analogRead(uint8_t pin);
437 return analogRead(
static_cast<uint8_t
>(pin));
441 #if ADC_DIFF_PAIRS > 0
450 int analogReadDifferential(uint8_t pinP, uint8_t pinN);
462 bool startSingleRead(uint8_t pin);
464 #if ADC_DIFF_PAIRS > 0
472 bool startSingleDifferential(uint8_t pinP, uint8_t pinN);
480 return analogReadContinuous();
491 bool startContinuous(uint8_t pin);
493 #if ADC_DIFF_PAIRS > 0
500 bool startContinuousDifferential(uint8_t pinP, uint8_t pinN);
511 return (int16_t)(int32_t)adc_regs.R0;
513 return (int16_t)(int32_t)adc_regs.RA;
518 void stopContinuous();
529 #if defined(ADC_USE_PDB)
537 void startTimer(uint32_t freq) __attribute__((always_inline)) { startPDB(freq); }
543 void startPDB(uint32_t freq);
546 void stopTimer() __attribute__((always_inline)) { stopPDB(); }
554 uint32_t getTimerFrequency() __attribute__((always_inline)) {
return getPDBFrequency(); }
559 uint32_t getPDBFrequency();
563 #elif defined(ADC_USE_QUAD_TIMER)
570 void startTimer(uint32_t freq) __attribute__((always_inline)) { startQuadTimer(freq); }
576 void startQuadTimer(uint32_t freq);
579 void stopTimer() __attribute__((always_inline)) { stopQuadTimer(); }
581 void stopQuadTimer();
592 uint32_t getQuadTimerFrequency();
605 uint32_t savedSC1A, savedSC2, savedSC3, savedCFG1, savedCFG2;
618 config->savedCFG = adc_regs.CFG;
619 config->savedGC = adc_regs.GC;
620 config->savedGS = adc_regs.GS;
622 config->savedSC1A = adc_regs.SC1A;
623 config->savedCFG1 = adc_regs.CFG1;
624 config->savedCFG2 = adc_regs.CFG2;
625 config->savedSC2 = adc_regs.SC2;
626 config->savedSC3 = adc_regs.SC3;
636 adc_regs.CFG = config->savedCFG;
637 adc_regs.GC = config->savedGC;
638 adc_regs.GS = config->savedGS;
640 adc_regs.CFG1 = config->savedCFG1;
641 adc_regs.CFG2 = config->savedCFG2;
642 adc_regs.SC2 = config->savedSC2;
643 adc_regs.SC3 = config->savedSC3;
644 adc_regs.SC1A = config->savedSC1A;
660 ADC_Error::resetError(fail_flag);
678 uint8_t analog_res_bits;
681 uint32_t analog_max_val;
684 uint8_t analog_num_average;
687 ADC_REF_SOURCE analog_reference_internal;
701 const uint8_t*
const channel2sc1a;
704 bool interrupts_enabled;
708 #if ADC_DIFF_PAIRS > 0
709 const ADC_NLIST*
const diff_table;
712 uint8_t getDifferentialPair(uint8_t pin) {
713 for(uint8_t i=0; i<ADC_DIFF_PAIRS; i++) {
714 if(diff_table[i].pin == pin) {
715 return diff_table[i].sc1a;
718 return ADC_SC1A_PIN_INVALID;
728 #if defined(ADC_TEENSY_4)
730 CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON);
732 CCM_CCGR1 |= CCM_CCGR1_ADC2(CCM_CCGR_ON);
736 SIM_SCGC6 |= SIM_SCGC6_ADC0;
738 SIM_SCGC3 |= SIM_SCGC3_ADC1;
744 typedef volatile uint32_t& reg;
747 ADC_REGS_t &adc_regs;
755 uint8_t QTIMER4_INDEX;
756 uint8_t ADC_ETC_TRIGGER_INDEX;
758 const IRQ_NUMBER_t IRQ_ADC;
765 #endif // ADC_MODULE_H