111 lines
3.1 KiB
C++
111 lines
3.1 KiB
C++
/**
|
|
* @file dcdcmbus.ino
|
|
* @brief usage of XY6020L DCDC for simple max power point tracking of
|
|
* a solar module driving a electrolytic cell
|
|
* Cells voltage start from ~3 V and current will rise up to ~3A at 4 V.
|
|
* At ~19 V the 20V pannel has its maximum power.
|
|
* Simple I-controler increases the cell voltage till the power consumption
|
|
* from the solar panel drives its voltage below 19 V.
|
|
Hardware: Arduino Pro Micro Clone from China
|
|
*
|
|
* @author Jens Gleissberg
|
|
* @date 2024
|
|
* @license GNU Lesser General Public License v3.0 or later
|
|
*/
|
|
|
|
#include "xy6020l.h"
|
|
#define PIN_SOFTWARE_SERIAL_RX2 25
|
|
#define PIN_SOFTWARE_SERIAL_TX2 26
|
|
// dcdc's MBus is connected to Serial2 of Arduino
|
|
xy6020l xy(Serial2, 0x01, 50, XY6020_OPT_SKIP_SAME_HREG_VALUE | XY6020_OPT_NO_HREG_UPDATE);
|
|
|
|
long ts;
|
|
byte MemIdx;
|
|
tMemory Mem;
|
|
|
|
void setup() {
|
|
// debug messages via USB
|
|
Serial.begin( 115200);
|
|
// MBus serial
|
|
// Serial2.begin( 115200);
|
|
Serial2.begin(115200, SERIAL_8N1, PIN_SOFTWARE_SERIAL_RX2, PIN_SOFTWARE_SERIAL_TX2); // Rx = 4, Tx = 5 will work for ESP32, S2, S3 and C3
|
|
|
|
|
|
|
|
ts = millis();
|
|
MemIdx = 0;
|
|
|
|
//18:51:25.551 -> V-SET = 1200 (Voltage setting)
|
|
//18:51:25.551 -> I-SET = 500 (Current setting)
|
|
//18:51:25.551 -> S-LVP = 1000 (Low voltage protection value)
|
|
//18:51:25.551 -> S-OVP = 1300 (Overvoltage protection value)
|
|
//18:51:25.551 -> S-OCP = 620 (Overcurrent protection value)
|
|
//18:51:25.551 -> S-OPP = 1040 (Over power protection value)
|
|
//18:51:25.551 -> S-OHP_H = 0 (Maximum output time - hours)
|
|
//18:51:25.551 -> S-OHP_M = 0 (Maximum output time - minutes)
|
|
//18:51:25.551 -> S-OAH = 0 (Maximum output charge Ah)
|
|
//18:51:25.551 -> S-OWH = 0 (Maximum output energy Wh)
|
|
//18:51:25.551 -> S-OTP = 110 (Over temperature protection)
|
|
//18:51:25.551 -> S-INI = 0 (Power-on output switch)
|
|
Mem.Nr = MemIdx;
|
|
Mem.VSet = 1200;
|
|
Mem.ISet = 500;
|
|
Mem.sLVP = 1000;
|
|
Mem.sOVP = 1300;
|
|
Mem.sOCP = 620;
|
|
Mem.sOPP = 1040;
|
|
Mem.sOHPh= 0;
|
|
Mem.sOHPm= 0;
|
|
Mem.sOAH = 0;
|
|
Mem.sOWH = 0;
|
|
Mem.sOTP = 110;
|
|
Mem.sINI = 1;
|
|
xy.SetMemory(Mem);
|
|
xy.PrintMemory(Mem);
|
|
|
|
// xy.setOutput(false);
|
|
// xy.setCV(0);
|
|
// xy.setCC(0);
|
|
xy.ReadAllHRegs();
|
|
while(!xy.HRegUpdated())
|
|
xy.task();
|
|
}
|
|
|
|
int cc=1;
|
|
int v = 100;
|
|
void loop() {
|
|
int vDiff;
|
|
char tmpBuf[30]; // text buffer for serial messages
|
|
word tmpW1, tmpW2;
|
|
|
|
xy.task();
|
|
|
|
// 100 ms control period
|
|
if (millis() > ts + 10000)
|
|
{
|
|
xy.setCC(100);
|
|
///v+=100;
|
|
xy.setCV(1100);
|
|
xy.setOutput(true);
|
|
Mem.sINI = 1;
|
|
xy.SetMemory(Mem);
|
|
Serial.print("Vin = "); Serial.println(xy.getInV());
|
|
|
|
Serial.print("V = "); Serial.print(xy.getCV()); Serial.print(" isV = "); Serial.println(xy.isCV());
|
|
|
|
Serial.print("C = "); Serial.print(xy.getCC());Serial.print(" isC = "); Serial.println(xy.isCC());
|
|
|
|
Serial.print("ActV = "); Serial.println(xy.getActV());
|
|
|
|
Serial.print("ActC = "); Serial.println(xy.getActC());
|
|
Serial.print("ActP = "); Serial.println(xy.getActP());
|
|
|
|
ts = millis();
|
|
// Mem.Nr=MemIdx;
|
|
// if( xy.GetMemory(&Mem) )
|
|
// {
|
|
// xy.PrintMemory(Mem);
|
|
// }
|
|
}
|
|
}
|