Measurement of low frequencys based on timing between pulses

Dependents:   Energy_Meter_S0_Example

Committer:
jocis
Date:
Thu Nov 08 07:25:41 2012 +0000
Revision:
1:6eb686d7d16a
Parent:
0:ef402fb370c5
Child:
2:fc21262db17a
added min, max; added function get()

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 1:6eb686d7d16a 5 Pulses::Pulses(PinName inPin, PulseType type, unsigned int timeout, unsigned int counter) : _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 1:6eb686d7d16a 10 _MinTime = 0;
jocis 1:6eb686d7d16a 11 _MaxTime = 0;
jocis 1:6eb686d7d16a 12 _AvrTimeSum = 0;
jocis 1:6eb686d7d16a 13 _AvrTimeCount = 0;
jocis 1:6eb686d7d16a 14 _Counter = counter;
jocis 0:ef402fb370c5 15 _Factor = 1.0f;
jocis 0:ef402fb370c5 16 _bFirst = true;
jocis 0:ef402fb370c5 17
jocis 0:ef402fb370c5 18 if ( timeout > 900 ) timeout = 900; // not more than 15 minutes
jocis 0:ef402fb370c5 19 _Timeout = timeout;
jocis 0:ef402fb370c5 20 _TimeoutCount = 0;
jocis 0:ef402fb370c5 21
jocis 1:6eb686d7d16a 22
jocis 0:ef402fb370c5 23 _type = type;
jocis 1:6eb686d7d16a 24 if ( type & RISE ) {
jocis 0:ef402fb370c5 25 _in.rise(this, &Pulses::callback_in);
jocis 1:6eb686d7d16a 26 _in.mode(PullDown);
jocis 1:6eb686d7d16a 27 }
jocis 1:6eb686d7d16a 28 if ( type & FALL ) {
jocis 0:ef402fb370c5 29 _in.fall(this, &Pulses::callback_in);
jocis 1:6eb686d7d16a 30 _in.mode(PullUp);
jocis 1:6eb686d7d16a 31 }
jocis 0:ef402fb370c5 32
jocis 0:ef402fb370c5 33 _timeout.attach(this, &Pulses::callback_timeout, 1);
jocis 0:ef402fb370c5 34 }
jocis 0:ef402fb370c5 35
jocis 0:ef402fb370c5 36 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 37
jocis 0:ef402fb370c5 38 float Pulses::getAct() {
jocis 0:ef402fb370c5 39 if ( _ActTime == 0 ) return 0.0f;
jocis 0:ef402fb370c5 40
jocis 1:6eb686d7d16a 41 return 1000000.0f * _Factor / (float)_ActTime;
jocis 0:ef402fb370c5 42 }
jocis 0:ef402fb370c5 43
jocis 0:ef402fb370c5 44 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 45
jocis 0:ef402fb370c5 46 float Pulses::getAverage() {
jocis 1:6eb686d7d16a 47 unsigned int avrTimeSum = 0;
jocis 1:6eb686d7d16a 48 unsigned int avrTimeCount = 0;
jocis 1:6eb686d7d16a 49
jocis 1:6eb686d7d16a 50 __disable_irq(); // Disable Interrupts for atomic copy
jocis 1:6eb686d7d16a 51 avrTimeSum = _AvrTimeSum;
jocis 1:6eb686d7d16a 52 avrTimeCount = _AvrTimeCount;
jocis 1:6eb686d7d16a 53 _AvrTimeSum = 0;
jocis 1:6eb686d7d16a 54 _AvrTimeCount = 0;
jocis 1:6eb686d7d16a 55 __enable_irq(); // Enable Interrupts
jocis 1:6eb686d7d16a 56
jocis 1:6eb686d7d16a 57 if ( avrTimeCount == 0 ) return -1.0f;
jocis 1:6eb686d7d16a 58
jocis 1:6eb686d7d16a 59 return 1000000.0f * _Factor / ( (float)avrTimeSum / (float)avrTimeCount );
jocis 1:6eb686d7d16a 60 }
jocis 1:6eb686d7d16a 61
jocis 1:6eb686d7d16a 62 //////////////////////////////////////////////////////////////////////////////////
jocis 1:6eb686d7d16a 63
jocis 1:6eb686d7d16a 64 void Pulses::get(float *pAverage, float *pMin, float *pMax, float *pSum) {
jocis 1:6eb686d7d16a 65 unsigned int minTime = 0;
jocis 1:6eb686d7d16a 66 unsigned int maxTime = 0;
jocis 1:6eb686d7d16a 67 unsigned int avrTimeSum = 0;
jocis 1:6eb686d7d16a 68 unsigned int avrTimeCount = 0;
jocis 0:ef402fb370c5 69
jocis 0:ef402fb370c5 70 __disable_irq(); // Disable Interrupts for atomic copy
jocis 1:6eb686d7d16a 71 minTime = _MinTime;
jocis 1:6eb686d7d16a 72 maxTime = _MaxTime;
jocis 1:6eb686d7d16a 73 avrTimeSum = _AvrTimeSum;
jocis 1:6eb686d7d16a 74 avrTimeCount = _AvrTimeCount;
jocis 1:6eb686d7d16a 75 _MinTime = 0;
jocis 1:6eb686d7d16a 76 _MaxTime = 0;
jocis 1:6eb686d7d16a 77 _AvrTimeSum = 0;
jocis 1:6eb686d7d16a 78 _AvrTimeCount = 0;
jocis 0:ef402fb370c5 79 __enable_irq(); // Enable Interrupts
jocis 0:ef402fb370c5 80
jocis 1:6eb686d7d16a 81 if ( pAverage ) {
jocis 1:6eb686d7d16a 82 if ( avrTimeCount == 0 )
jocis 1:6eb686d7d16a 83 *pAverage = -1.0f;
jocis 1:6eb686d7d16a 84 else
jocis 1:6eb686d7d16a 85 *pAverage = 1000000.0f * _Factor / ( (float)avrTimeSum / (float)avrTimeCount );
jocis 1:6eb686d7d16a 86 }
jocis 0:ef402fb370c5 87
jocis 1:6eb686d7d16a 88 if ( pMin ) {
jocis 1:6eb686d7d16a 89 if ( minTime == 0 )
jocis 1:6eb686d7d16a 90 *pMin = -1.0f;
jocis 1:6eb686d7d16a 91 else
jocis 1:6eb686d7d16a 92 *pMin = 1000000.0f * _Factor / (float)minTime;
jocis 1:6eb686d7d16a 93 }
jocis 1:6eb686d7d16a 94
jocis 1:6eb686d7d16a 95 if ( pMax ) {
jocis 1:6eb686d7d16a 96 if ( maxTime == 0 )
jocis 1:6eb686d7d16a 97 *pMax = -1.0f;
jocis 1:6eb686d7d16a 98 else
jocis 1:6eb686d7d16a 99 *pMax = 1000000.0f * _Factor / (float)maxTime;
jocis 1:6eb686d7d16a 100 }
jocis 1:6eb686d7d16a 101
jocis 1:6eb686d7d16a 102 if ( pSum ) {
jocis 1:6eb686d7d16a 103 *pSum = _Factor * (float)_Counter;
jocis 1:6eb686d7d16a 104 }
jocis 1:6eb686d7d16a 105
jocis 1:6eb686d7d16a 106 return;
jocis 0:ef402fb370c5 107 }
jocis 0:ef402fb370c5 108
jocis 0:ef402fb370c5 109 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 110
jocis 0:ef402fb370c5 111 unsigned int Pulses::getCounter() {
jocis 0:ef402fb370c5 112 return _Counter;
jocis 0:ef402fb370c5 113 }
jocis 0:ef402fb370c5 114
jocis 0:ef402fb370c5 115 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 116
jocis 0:ef402fb370c5 117 void Pulses::setFactor(float factor) {
jocis 1:6eb686d7d16a 118 _Factor = factor;
jocis 0:ef402fb370c5 119 }
jocis 0:ef402fb370c5 120
jocis 0:ef402fb370c5 121 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 122
jocis 0:ef402fb370c5 123 void Pulses::callback_in() {
jocis 0:ef402fb370c5 124 unsigned int diff = _timer.readDiff_us();
jocis 0:ef402fb370c5 125
jocis 0:ef402fb370c5 126 _Counter++;
jocis 0:ef402fb370c5 127 _TimeoutCount = 0;
jocis 0:ef402fb370c5 128
jocis 0:ef402fb370c5 129 if ( _bFirst ) { // ignore first pulse to synchronize timer (maybe timer overflow)
jocis 0:ef402fb370c5 130 _bFirst = false;
jocis 0:ef402fb370c5 131 return;
jocis 0:ef402fb370c5 132 }
jocis 0:ef402fb370c5 133
jocis 0:ef402fb370c5 134 _ActTime = diff;
jocis 1:6eb686d7d16a 135 _AvrTimeSum += diff;
jocis 1:6eb686d7d16a 136 _AvrTimeCount++;
jocis 1:6eb686d7d16a 137
jocis 1:6eb686d7d16a 138 if ( _MinTime==0 || _MinTime<diff )
jocis 1:6eb686d7d16a 139 _MinTime = diff;
jocis 1:6eb686d7d16a 140 if ( _MaxTime==0 || _MaxTime>diff )
jocis 1:6eb686d7d16a 141 _MaxTime = diff;
jocis 0:ef402fb370c5 142 }
jocis 0:ef402fb370c5 143
jocis 0:ef402fb370c5 144 //////////////////////////////////////////////////////////////////////////////////
jocis 0:ef402fb370c5 145
jocis 0:ef402fb370c5 146 void Pulses::callback_timeout() {
jocis 0:ef402fb370c5 147 _TimeoutCount++;
jocis 0:ef402fb370c5 148 if ( _TimeoutCount >= _Timeout ) {
jocis 0:ef402fb370c5 149 _TimeoutCount = 0;
jocis 0:ef402fb370c5 150 _ActTime = 0;
jocis 0:ef402fb370c5 151 _bFirst = true;
jocis 0:ef402fb370c5 152 }
jocis 0:ef402fb370c5 153 }
jocis 0:ef402fb370c5 154
jocis 0:ef402fb370c5 155 //////////////////////////////////////////////////////////////////////////////////