The SmoothAnalogIn class provides a smoothed ADC reading; simply setup pin, sample rate, smoothing factor and scaling factor. Useful for processing signals from temperature or pressure sensors etc.

Dependencies:   mbed

SmoothAnalogIn.cpp

Committer:
stoppsm
Date:
2010-06-18
Revision:
0:d252aa8196fc

File content as of revision 0:d252aa8196fc:

// SmoothAnalogIn.cpp: Martyn Stopps / Taneli Holtta : 18-06-10

// Source file: contains implementation that generates the code (the definition)

#include "SmoothAnalogIn.h"
#include "mbed.h"                                                  // tested with revision 23

// Constructor - A class that takes arguments PinName, adc sample rate, smoothing factor and scaling factor

SmoothAnalogIn::SmoothAnalogIn(PinName pin, float sampleRate, int smoothingFactor, int adcScaling) : _adc(pin)  {   // _adc(pin) means pass pin to the AnalogIn constructor 
        
    _ticker.attach(this, &SmoothAnalogIn::sampleAdc, sampleRate);  // attach ticker to member function (delivers adc sampleRate)
    
// initialize variables
    
    _smoothingFactor = smoothingFactor;                            // mask in the smoothing factor value
    _adcScaling = adcScaling;                                      // mask in the adc scaling factor (adc returns 0 to 1 representing 0  to 3.3V)

                                                                                                                }
        

// function - sampleAdc   : gets current adc value.

void SmoothAnalogIn::sampleAdc(void)    {

    double adc_value = _adc.read()*_adcScaling;     // read _adc pin analog value * _adcScaling 
    SmoothAnalogIn::smoothValue(adc_value);         // call smoothing function passing in current scaled adc_value
                                        }

                                             
// function - smoothValue : Smoothing algorithm
      
void SmoothAnalogIn::smoothValue(double newValue)   {
                   
    if (newValue > smoothed)  smoothed = smoothed + ((newValue - smoothed)/_smoothingFactor);      // rawValue > smoothed value
    else if (newValue < smoothed) smoothed = smoothed - ((smoothed - newValue)/_smoothingFactor);  // rawValue < smoothed value
                                                    }
                                                    
                                                    
 // function - read   : returns smoothed adc value      
        
double SmoothAnalogIn::read(void)   {
    
    return(smoothed);                               
                                    }