Class Header
/*
PowerSignal.h - A simplistic way to represent a power signal for AC power monitoring
Author: peter c
*/
#ifndef PowerSignal_h
#define PowerSignal_h
#include "WProgram.h"
#include "ACSignal.h"
#define PS_DEGREES 1
#define PS_RADIANS 2
class PowerSignal
{
public:
PowerSignal(ACSignal& aVoltageSignal, ACSignal& aCurrentSignal);
float computeApparentPower();
float computeAveragePower();
float computePowerFactor();
float computePowerFactorAngle( int aMode );
float computeReactivePower();
void reset();
void updateAccumulator();
private:
ACSignal& mVoltageSignal;
ACSignal& mCurrentSignal;
float mSumVoltageTimesCurrent;
};
#endif
Class Body
/*
PowerSignal.cpp - Library doing basic signal calculations
Created by Peter Chrapchynski, December 11, 2009
*/
#include "WProgram.h"
#include "ACSignal.h"
#include "PowerSignal.h"
PowerSignal::PowerSignal(ACSignal& aVoltageSignal, ACSignal& aCurrentSignal):mVoltageSignal( aVoltageSignal ), mCurrentSignal( aCurrentSignal )
{
}
float PowerSignal::computeApparentPower()
{
return ( mVoltageSignal.getRMSValue() * mCurrentSignal.getRMSValue() );
}
float PowerSignal::computePowerFactor()
{
float l_powerFactor = 1.0;
float l_apparentPower = computeApparentPower();
if( l_apparentPower > 0.01 )
l_powerFactor = computeAveragePower() / l_apparentPower;
return( l_powerFactor );
}
float PowerSignal::computePowerFactorAngle( int aMode )
{
float l_PowerFactorAngle = acos( computePowerFactor() );
if( aMode == PS_DEGREES )
l_PowerFactorAngle *= 180 / PI;
return( l_PowerFactorAngle );
}
float PowerSignal::computeReactivePower()
{
return( computeApparentPower() * sin( computePowerFactorAngle( PS_RADIANS ) ) );
}
void PowerSignal::reset()
{
mSumVoltageTimesCurrent = 0;
}
void PowerSignal::updateAccumulator()
{
mSumVoltageTimesCurrent += mVoltageSignal.getInstantaneousValue() * mCurrentSignal.getInstantaneousValue();
}
float PowerSignal::computeAveragePower()
{
return( mSumVoltageTimesCurrent / mVoltageSignal.getSampleCount() );
}
[...] PowerSignal [...]