Unverified Commit bf974ab8 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

arduino nano adc: add getPin_mV function

parent 56dc720d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ class AVRADC {

		int16_t getTemp_mdegC(int16_t offset = 205);
		uint16_t getVCC_mV();
		uint16_t getPin_mV(uint8_t pin, uint16_t avcc = 0);
};

extern AVRADC adc;
+36 −0
Original line number Diff line number Diff line
@@ -8,6 +8,42 @@
#include "arch.h"
#include "driver/adc.h"

uint16_t AVRADC::getPin_mV(uint8_t pin, uint16_t avcc)
{
	if (avcc) {
		// measure with AVCC reference
		ADMUX = _BV(REFS0) | pin;
	} else {
		// measure with internal 1.1V bandgap refernce
		ADMUX = _BV(REFS1) | _BV(REFS0) | pin;
	}

	// Enable ADC with /64 prescaler
	ADCSRA = _BV(ADEN) | _BV(ADPS2);

	// Wait for bandgap to stabilise (70us according to datasheet table 28-3)
	arch.delay_ms(1);

	// Start conversion
	ADCSRA |= _BV(ADSC);

	// wait until conversion is complete
	while (ADCSRA & _BV(ADSC)) ;

	uint8_t adcr_l = ADCL;
	uint8_t adcr_h = ADCH;
	uint16_t adcr = adcr_l + (adcr_h << 8);

	// Disable ADC
	ADCSRA &= ~_BV(ADEN);

	if (avcc) {
		return (uint32_t)avcc * adcr / 1023L;
	} else {
		return 1100L * adcr / 1023L;
	}
}

int16_t AVRADC::getTemp_mdegC(int16_t offset)
{
	// Measure temperature probe with 1.1V bandgap reference