Measurement of low frequencys based on timing between pulses

Dependents:   Energy_Meter_S0_Example

Committer:
jocis
Date:
Wed Nov 07 18:38:59 2012 +0000
Revision:
0:ef402fb370c5
Child:
1:6eb686d7d16a
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jocis 0:ef402fb370c5 1 #include "Pulses.h"
jocis 0:ef402fb370c5 2
jocis 0:ef402fb370c5 3 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 4
jocis 0:ef402fb370c5 5 Pulses::Pulses(PinName inPin, PulseType type, unsigned int timeout) : _in(inPin) {
jocis 0:ef402fb370c5 6 _timer.reset();
jocis 0:ef402fb370c5 7 _timer.start();
jocis 0:ef402fb370c5 8
jocis 0:ef402fb370c5 9 _ActTime = 0;
jocis 0:ef402fb370c5 10 _SumTime = 0;
jocis 0:ef402fb370c5 11 _SumCount = 0;
jocis 0:ef402fb370c5 12 _Counter = 0;
jocis 0:ef402fb370c5 13 _Factor = 1.0f;
jocis 0:ef402fb370c5 14 _bFirst = true;
jocis 0:ef402fb370c5 15
jocis 0:ef402fb370c5 16 if ( timeout > 900 ) timeout = 900; // not more than 15 minutes
jocis 0:ef402fb370c5 17 _Timeout = timeout;
jocis 0:ef402fb370c5 18 _TimeoutCount = 0;
jocis 0:ef402fb370c5 19
jocis 0:ef402fb370c5 20 _in.mode(PullUp);
jocis 0:ef402fb370c5 21
jocis 0:ef402fb370c5 22 _type = type;
jocis 0:ef402fb370c5 23 if ( type & RISE )
jocis 0:ef402fb370c5 24 _in.rise(this, &Pulses::callback_in);
jocis 0:ef402fb370c5 25 if ( type & FALL )
jocis 0:ef402fb370c5 26 _in.fall(this, &Pulses::callback_in);
jocis 0:ef402fb370c5 27
jocis 0:ef402fb370c5 28 _timeout.attach(this, &Pulses::callback_timeout, 1);
jocis 0:ef402fb370c5 29 }
jocis 0:ef402fb370c5 30
jocis 0:ef402fb370c5 31 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 32
jocis 0:ef402fb370c5 33 float Pulses::getAct() {
jocis 0:ef402fb370c5 34 if ( _ActTime == 0 ) return 0.0f;
jocis 0:ef402fb370c5 35
jocis 0:ef402fb370c5 36 return _Factor / (float)_ActTime;
jocis 0:ef402fb370c5 37 }
jocis 0:ef402fb370c5 38
jocis 0:ef402fb370c5 39 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 40
jocis 0:ef402fb370c5 41 float Pulses::getAverage() {
jocis 0:ef402fb370c5 42 unsigned int sumTime = 0;
jocis 0:ef402fb370c5 43 unsigned int sumCount = 0;
jocis 0:ef402fb370c5 44
jocis 0:ef402fb370c5 45 __disable_irq(); // Disable Interrupts for atomic copy
jocis 0:ef402fb370c5 46 sumTime = _SumTime;
jocis 0:ef402fb370c5 47 sumCount = _SumCount;
jocis 0:ef402fb370c5 48 _SumTime = 0;
jocis 0:ef402fb370c5 49 _SumCount = 0;
jocis 0:ef402fb370c5 50 __enable_irq(); // Enable Interrupts
jocis 0:ef402fb370c5 51
jocis 0:ef402fb370c5 52 if ( sumCount == 0 ) return -1.0f;
jocis 0:ef402fb370c5 53
jocis 0:ef402fb370c5 54 float average = _Factor / ( (float)sumTime / (float)sumCount );
jocis 0:ef402fb370c5 55 return average;
jocis 0:ef402fb370c5 56 }
jocis 0:ef402fb370c5 57
jocis 0:ef402fb370c5 58 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 59
jocis 0:ef402fb370c5 60 unsigned int Pulses::getCounter() {
jocis 0:ef402fb370c5 61 return _Counter;
jocis 0:ef402fb370c5 62 }
jocis 0:ef402fb370c5 63
jocis 0:ef402fb370c5 64 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 65
jocis 0:ef402fb370c5 66 void Pulses::setFactor(float factor) {
jocis 0:ef402fb370c5 67 _Factor = factor * 1000000.0f;
jocis 0:ef402fb370c5 68 }
jocis 0:ef402fb370c5 69
jocis 0:ef402fb370c5 70 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 71
jocis 0:ef402fb370c5 72 void Pulses::callback_in() {
jocis 0:ef402fb370c5 73 unsigned int diff = _timer.readDiff_us();
jocis 0:ef402fb370c5 74
jocis 0:ef402fb370c5 75 _Counter++;
jocis 0:ef402fb370c5 76 _TimeoutCount = 0;
jocis 0:ef402fb370c5 77
jocis 0:ef402fb370c5 78 if ( _bFirst ) { // ignore first pulse to synchronize timer (maybe timer overflow)
jocis 0:ef402fb370c5 79 _bFirst = false;
jocis 0:ef402fb370c5 80 return;
jocis 0:ef402fb370c5 81 }
jocis 0:ef402fb370c5 82
jocis 0:ef402fb370c5 83 _ActTime = diff;
jocis 0:ef402fb370c5 84 _SumTime += diff;
jocis 0:ef402fb370c5 85 _SumCount++;
jocis 0:ef402fb370c5 86 }
jocis 0:ef402fb370c5 87
jocis 0:ef402fb370c5 88 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 89
jocis 0:ef402fb370c5 90 void Pulses::callback_timeout() {
jocis 0:ef402fb370c5 91 _TimeoutCount++;
jocis 0:ef402fb370c5 92 if ( _TimeoutCount >= _Timeout ) {
jocis 0:ef402fb370c5 93 _TimeoutCount = 0;
jocis 0:ef402fb370c5 94 _ActTime = 0;
jocis 0:ef402fb370c5 95 _bFirst = true;
jocis 0:ef402fb370c5 96 }
jocis 0:ef402fb370c5 97 }
jocis 0:ef402fb370c5 98
jocis 0:ef402fb370c5 99 //////////////////////////////////////////////////////////////////////////////////