From: Kevin Townsend Date: Tue, 29 May 2012 19:36:45 +0000 (+0200) Subject: Added oversampling (courtesy miceuz) X-Git-Url: https://git.rohieb.name/hackover2013-badge-firmware.git/commitdiff_plain/d5b134a6437719d3471277c1ef1da33b5d45c612 Added oversampling (courtesy miceuz) --- diff --git a/core/adc/adc.c b/core/adc/adc.c index 5728545..0a6dd39 100644 --- a/core/adc/adc.c +++ b/core/adc/adc.c @@ -162,6 +162,48 @@ uint32_t adcReadSingle (uint8_t channelNum) return (adcData); } +/**************************************************************************/ +/*! + @brief Returns the oversampled conversion results on the specified ADC channel. + + This function will manually start A/D conversions on a single + channel sum and divide results to get a value of increased resolution. + + Read more: AVR121: Enhancing ADC resolution by oversampling [http://www.atmel.com/Images/doc8003.pdf] + + @param[in] channelNum + The A/D channel [0..7] that will be used during the A/D + conversion. (Note that only A/D channel's 0..3 are + configured by default in adcInit.) + + @param[in] extraBits + Additional bits you want to add to resolution. Hardware resolution is + 10bits, if 6 is psecified as extraBits, the resolution will be increated to + 16 bit. + + @return 0 if an overrun error occured, otherwise a 10-bit value + containing the A/D conversion results. + + @warning Only AD channels 0..3 are configured for A/D in adcInit. + If you wish to use A/D pins 4..7 they will also need to + be added to the adcInit function. + */ +/**************************************************************************/ + +uint32_t adcReadOversampled (uint8_t channelNum, uint8_t extraBits) { + uint32_t sampleCount = 1 << (extraBits * 2); + uint16_t i; + uint32_t adcOversampled = 0; + + for(i = 0; i < sampleCount; i++) { + uint16_t adcValue = adcReadSingle(channelNum); + adcOversampled += adcValue; + } + + adcOversampled = adcOversampled >> extraBits; + return adcOversampled; +} + /**************************************************************************/ /*! @brief Returns the conversion results on the specified ADC channel. diff --git a/core/adc/adc.h b/core/adc/adc.h index 29e168d..a1c3879 100644 --- a/core/adc/adc.h +++ b/core/adc/adc.h @@ -42,6 +42,8 @@ #include "projectconfig.h" uint32_t adcRead (uint8_t channelNum); -void adcInit (void); +uint32_t adcReadOversampled (uint8_t channelNum, uint8_t extraBits); +uint32_t adcReadSingle(uint8_t channelNum); +void adcInit (void); #endif