Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New sampling and smoothing algorithm #7

Merged
merged 4 commits into from
Nov 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

### Get a smartpower3 source code including submodules
```
git clone --recursive https://github.com/leeseungcheol/smartpower3
git clone --recursive https://github.com/hardkernel/smartpower3
```

### Check again the submodule repository
Expand Down
287 changes: 12 additions & 275 deletions libraries/PAC193x/Microchip_PAC193x.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void Microchip_PAC193x::begin(TwoWire *_wire){

Write8(PAC1934_NEG_PWR_ADDR, 0);
Write8(PAC1934_CTRL_ADDR, 2);
Write8(PAC1934_CHANNEL_DIS_ADDR, 0);
//Write8(PAC1934_CHANNEL_DIS_ADDR, 0); // Use defaults
Write8(PAC1934_SLOW_ADDR, 20); //14h

Refresh();
Expand Down Expand Up @@ -174,276 +174,23 @@ int16_t Microchip_PAC193x::UpdateRevisionID(){
}

void Microchip_PAC193x::Refresh(){

Write8(PAC1934_REFRESH_CMD_ADDR, 1); //refresh
refresh_timestamp = micros();
}

void Microchip_PAC193x::update(uint8_t sense)
{
uint8_t reg;
unsigned long delay;

// ensure that 1ms has already passed since last refresh
delay = (1000 - micros() + refresh_timestamp);
// do a delay if result is not nagtive (note it's an unsinged variable)
if (delay < 1000) delayMicroseconds(delay);


reg = PAC1934_VBUS1_ADDR + sense;
updateVoltage(reg);

reg = PAC1934_VSENSE1_AVG_ADDR + sense;
updateCurrent(reg);

reg = PAC1934_VPOWER1_ADDR + sense;
updatePower(reg);

/*
reg = PAC1934_VPOWER1_ACC_ADDR + sense;
updatePowerAcc(reg);
*/
}

int16_t Microchip_PAC193x::UpdateVoltageSense1(void)
{
return UpdateVoltage(PAC1934_VBUS1_ADDR);
}

int16_t Microchip_PAC193x::UpdateVoltageSense2(void)
{
return UpdateVoltage(PAC1934_VBUS2_ADDR);
}

int16_t Microchip_PAC193x::UpdateVoltageSense3(void)
{
return UpdateVoltage(PAC1934_VBUS3_ADDR);
}

int16_t Microchip_PAC193x::UpdateVoltageRaw(uint8_t reg){
uint16_t VbusRaw;

errorCode = 0;
Write8(PAC1934_REFRESH_V_CMD_ADDR, 1); //refreshV
delay(2);
VbusRaw = Read16(reg);
VbusRaw = (VbusRaw << 8) | (VbusRaw >> 8);
VoltageRaw = VbusRaw;

return errorCode;
}
void Microchip_PAC193x::updateVoltage(uint8_t reg)
{
uint16_t VbusRaw;
float VbusReal;
float VbusLsb;

VbusRaw = Read16(reg);
VbusRaw = (VbusRaw << 8) | (VbusRaw >> 8);
VoltageRaw = VbusRaw;

VbusLsb = 32000 / 65536.0;
VbusReal = (float)VoltageRaw;
VbusReal = VbusReal * VbusLsb;
Voltage = VbusReal;
}

int16_t Microchip_PAC193x::UpdateVoltage(uint8_t reg){
float VbusReal;
float VbusLsb;

errorCode = 0;
UpdateVoltageRaw(reg);
VbusLsb = 32000 / 65536.0;
VbusReal = (float)VoltageRaw;
VbusReal = VbusReal * VbusLsb;
Voltage = VbusReal;

return errorCode;
}

int16_t Microchip_PAC193x::UpdateVsenseRaw(uint8_t reg){

errorCode = 0;
Write8(PAC1934_REFRESH_V_CMD_ADDR, 1); //refreshV
delay(2);
VsenseRaw = Read16(reg);
VsenseRaw = (VsenseRaw << 8) | (VsenseRaw >> 8 );
// Refesh needs only one byte with no data

return errorCode;
}

void Microchip_PAC193x::updateVsense(uint8_t reg){
float VsenseLsb;

VsenseRaw = Read16(reg);
VsenseRaw = (VsenseRaw << 8) | (VsenseRaw >> 8 );
VsenseLsb = 100 / 65536.0;

Vsense = (float)VsenseRaw;
Vsense = Vsense * VsenseLsb;
}


int16_t Microchip_PAC193x::UpdateVsense(uint8_t reg){
float VsenseLsb;

errorCode = 0;
UpdateVsenseRaw(reg);
VsenseLsb = 100 / 65536.0;
Vsense = (float)VsenseRaw;
Vsense = Vsense * VsenseLsb;

return errorCode;
}

int16_t Microchip_PAC193x::UpdateCurrentSense1(void)
{
return UpdateCurrent(PAC1934_VSENSE1_ADDR);
}

int16_t Microchip_PAC193x::UpdateCurrentSense2(void)
{
return UpdateCurrent(PAC1934_VSENSE2_ADDR);
}

int16_t Microchip_PAC193x::UpdateCurrentSense3(void)
{
return UpdateCurrent(PAC1934_VSENSE3_ADDR);
}

void Microchip_PAC193x::updateCurrent(uint8_t reg){

updateVsense(reg);
Current = (Vsense / rsense) * 1000000; //mA

if (rsense <= 0){
errorCode = (-3);
}
}

int16_t Microchip_PAC193x::UpdateCurrent(uint8_t reg){

errorCode = 0;
UpdateVsense(reg);
Current = (Vsense / rsense) * 1000000; //mA

if (rsense <= 0){
errorCode = (-3);
}

return errorCode;
}

int16_t Microchip_PAC193x::UpdatePowerSense1()
{
return UpdatePower(PAC1934_VPOWER1_ADDR);
}

int16_t Microchip_PAC193x::UpdatePowerSense2()
{
return UpdatePower(PAC1934_VPOWER2_ADDR);
}

int16_t Microchip_PAC193x::UpdatePowerSense3()
{
return UpdatePower(PAC1934_VPOWER3_ADDR);
}

int16_t Microchip_PAC193x::UpdatePowerRaw(uint8_t reg){

errorCode = 0;
Write8(PAC1934_REFRESH_V_CMD_ADDR, 1); //refreshV
delay(2);
PowerRaw = Read32(reg);
PowerRaw = ((PowerRaw << 8) & 0xFF00FF00 ) | ((PowerRaw >> 8) & 0xFF00FF );
PowerRaw = (PowerRaw << 16) | (PowerRaw >> 16);

return errorCode;
}

void Microchip_PAC193x::updatePower(uint8_t reg){
/*
uint32_t PowerRegScale = 0x10000000;
double PowerFSR;

PowerRaw = Read32(reg);
PowerRaw = ((PowerRaw << 8) & 0xFF00FF00 ) | ((PowerRaw >> 8) & 0xFF00FF );
PowerRaw = (PowerRaw << 16) | (PowerRaw >> 16);

Power = (double)PowerRaw / 16;
PowerFSR = (3.2 * 1000000) / rsense;
Power = (Power * PowerFSR);
Power = Power / PowerRegScale;

if (rsense <= 0){
errorCode = (-3);
}
*/
Power = Current * Voltage / 1000000;
}

int16_t Microchip_PAC193x::UpdatePower(uint8_t reg){
uint32_t PowerRegScale = 0x10000000;
double PowerFSR;
_wire->beginTransmission(I2C_ADDRESS);
#if (ARDUINO >= 100)
_wire->write(PAC1934_REFRESH_CMD_ADDR);
#else
_wire->send(PAC1934_REFRESH_CMD_ADDR);
#endif
errorCode = _wire->endTransmission();

errorCode = 0;
UpdatePowerRaw(reg);
Power = (double)PowerRaw / 16;
PowerFSR = (3.2 * 1000000) / rsense;
Power = (Power * PowerFSR);
Power = Power / PowerRegScale;

if (rsense <= 0){
errorCode = (-3);
if (errorCode != 0){
errorCode = (-2);
}

return errorCode;
}

int16_t Microchip_PAC193x::UpdatePowerAccRaw(){

errorCode = 0;
Write8(PAC1934_REFRESH_V_CMD_ADDR, 1); //refreshV
delay(2);
PowerAccRaw = Read64(PAC1934_VPOWER1_ACC_ADDR);
PowerAccRaw = ((PowerAccRaw << 8) & 0xFF00FF00FF00FF00ULL ) | ((PowerAccRaw >> 8) & 0x00FF00FF00FF00FFULL );
PowerAccRaw = ((PowerAccRaw << 16) & 0xFFFF0000FFFF0000ULL ) | ((PowerAccRaw >> 16) & 0x0000FFFF0000FFFFULL );
PowerAccRaw = (PowerAccRaw << 32) | (PowerAccRaw >> 32);

return errorCode;
}

void Microchip_PAC193x::updatePowerAcc(uint8_t reg){
double PowerFSR;
uint32_t PowerRegScale = 0x10000000;

PowerAccRaw = Read64(reg);
PowerAccRaw = ((PowerAccRaw << 8) & 0xFF00FF00FF00FF00ULL ) | ((PowerAccRaw >> 8) & 0x00FF00FF00FF00FFULL );
PowerAccRaw = ((PowerAccRaw << 16) & 0xFFFF0000FFFF0000ULL ) | ((PowerAccRaw >> 16) & 0x0000FFFF0000FFFFULL );
PowerAccRaw = (PowerAccRaw << 32) | (PowerAccRaw >> 32);
PowerAcc = (double)PowerAccRaw;
PowerFSR = (3.2 * 1000000) / rsense;
PowerAcc = PowerAcc * PowerFSR;
PowerAcc = PowerAcc / PowerRegScale;
}

int16_t Microchip_PAC193x::UpdatePowerAcc(){
double PowerFSR;
uint32_t PowerRegScale = 0x10000000;
refresh_timestamp = micros();

errorCode = 0;
UpdatePowerAccRaw();
PowerAcc = (double)PowerAccRaw;
PowerFSR = (3.2 * 1000000) / rsense;
PowerAcc = PowerAcc * PowerFSR;
PowerAcc = PowerAcc / PowerRegScale;

if (rsense <= 0){
errorCode = (-3);
}

return errorCode;
}

int16_t Microchip_PAC193x::UpdateSampleRateLat(){
Expand Down Expand Up @@ -506,16 +253,6 @@ int16_t Microchip_PAC193x::setSampleRate(uint16_t value){
return errorCode;
}

int16_t Microchip_PAC193x::UpdateEnergy(){

errorCode = 0;
UpdatePowerAcc();
UpdateSampleRateLat();
Energy = (PowerAcc / SampleRateLat) / 3.6;

return errorCode;
}

int16_t Microchip_PAC193x::UpdateOverflowAlert(){
uint8_t temp_read;

Expand Down
Loading