Skip to content

Commit 93418fc

Browse files
committed
Fixed basic nanogrid port implementation
Instead of SOLAR_TERMINAL, GRID_TERMINAL has to be defined in config.h (see also template).
1 parent 53ae6d4 commit 93418fc

File tree

8 files changed

+63
-21
lines changed

8 files changed

+63
-21
lines changed

src/config.h_template

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,27 @@
77
#ifndef CONFIG_H
88
#define CONFIG_H
99

10+
#include "pcb.h"
11+
1012
/** @file
1113
*
1214
* @brief
1315
* Used to define personal settings, e.g. which type of interface at the UEXT port should be used.
1416
*/
1517

18+
// typical MPPT buck mode / PWM charge controller
1619
#define DCDC_MODE_INIT MODE_MPPT_BUCK
20+
#if FEATURE_PWM_SWITCH
21+
#define SOLAR_TERMINAL pwm_terminal
22+
#else
23+
#define SOLAR_TERMINAL hv_terminal
24+
#endif
25+
26+
// Nanogrid mode
1727
//#define DCDC_MODE_INIT MODE_NANOGRID
28+
//#define GRID_TERMINAL hv_terminal
1829

19-
#define SOLAR_TERMINAL hv_terminal
30+
// battery always assumed to be at low-voltage terminal (might need to be changed for boost mode)
2031
#define BATTERY_TERMINAL lv_terminal
2132

2233
// basic battery configuration

src/data_objects.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ const data_object_t data_objects[] = {
115115

116116
// battery related data objects
117117
{0x70, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(bat_terminal.voltage), "Bat_V"},
118+
#ifdef SOLAR_TERMINAL
118119
{0x71, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(solar_terminal.voltage), "Solar_V"},
120+
#endif
119121
{0x72, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(bat_terminal.current), "Bat_A"},
120122
{0x73, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(load_terminal.current), "Load_A"},
121123
{0x74, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 1, (void*) &(charger.bat_temperature), "Bat_degC"},
@@ -128,11 +130,15 @@ const data_object_t data_objects[] = {
128130
#if FEATURE_DCDC_CONVERTER
129131
{0x79, TS_OUTPUT, TS_READ_ALL, TS_T_UINT16, 0, (void*) &(dcdc.state), "DCDCState"},
130132
#endif
133+
#ifdef SOLAR_TERMINAL
131134
{0x7A, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(solar_terminal.current), "Solar_A"},
135+
#endif
132136
{0x7B, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(bat_terminal.sink_voltage_max), "BatTarget_V"},
133137
{0x7C, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(bat_terminal.pos_current_limit), "BatTarget_A"},
134138
{0x7D, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(bat_terminal.power), "Bat_W"},
139+
#ifdef SOLAR_TERMINAL
135140
{0x7E, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(solar_terminal.power), "Solar_W"},
141+
#endif
136142
{0x7F, TS_OUTPUT, TS_READ_ALL, TS_T_FLOAT32, 2, (void*) &(load_terminal.power), "Load_W"},
137143

138144
{0x90, TS_OUTPUT, TS_READ_ALL, TS_T_UINT32, 0, (void*) &(dev_stat.error_flags), "ErrorFlags"},
@@ -151,7 +157,9 @@ const data_object_t data_objects[] = {
151157
{0x10, TS_REC, TS_READ_ALL | TS_WRITE_MAKER, TS_T_UINT16, 0, (void*) &(dev_stat.load_power_max_day), "LoadMaxDay_W"},
152158

153159
// accumulated data
160+
#ifdef SOLAR_TERMINAL
154161
{0xA0, TS_REC, TS_READ_ALL | TS_WRITE_MAKER, TS_T_FLOAT32, 2, (void*) &(solar_terminal.neg_energy_Wh), "SolarInDay_Wh"},
162+
#endif
155163
{0xA1, TS_REC, TS_READ_ALL | TS_WRITE_MAKER, TS_T_FLOAT32, 2, (void*) &(load_terminal.pos_energy_Wh), "LoadOutDay_Wh"},
156164
{0xA2, TS_REC, TS_READ_ALL | TS_WRITE_MAKER, TS_T_FLOAT32, 2, (void*) &(bat_terminal.pos_energy_Wh), "BatChgDay_Wh"},
157165
{0xA3, TS_REC, TS_READ_ALL | TS_WRITE_MAKER, TS_T_FLOAT32, 2, (void*) &(bat_terminal.neg_energy_Wh), "BatDisDay_Wh"},

src/dcdc.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,16 @@ int Dcdc::duty_cycle_delta()
7777
out->sink_voltage_max, out->pos_current_limit, half_bridge_get_duty_cycle() * 100.0,
7878
state);
7979

80-
if (time(NULL) - power_good_timestamp > 10 || // more than 10s low power
81-
out->power < -1.0) // or already generating negative power
82-
{
83-
pwr_inc_goal = 0; // switch off
80+
if ((time(NULL) - power_good_timestamp > 10 || out->power < -1.0) && mode != MODE_NANOGRID) {
81+
// swith off after 10s low power or negative power (if not in nanogrid mode)
82+
pwr_inc_goal = 0;
8483
}
85-
else if (out->voltage > (out->sink_voltage_max - out->pos_droop_res * out->current))
86-
{
87-
// output voltage target reached
84+
else if (out->voltage > (out->sink_voltage_max - out->pos_droop_res * out->current)) {
85+
// output voltage target reached
8886
state = DCDC_STATE_CV;
8987
pwr_inc_goal = -1; // decrease output power
9088
}
91-
else if (out->current > out->pos_current_limit)
92-
{
89+
else if (out->current > out->pos_current_limit) {
9390
// output charge current limit reached
9491
state = DCDC_STATE_CC;
9592
pwr_inc_goal = -1; // decrease output power
@@ -103,8 +100,7 @@ int Dcdc::duty_cycle_delta()
103100
state = DCDC_STATE_DERATING;
104101
pwr_inc_goal = -1; // decrease output power
105102
}
106-
else if (out->power < output_power_min && out->voltage < out->src_voltage_start)
107-
{
103+
else if (out->power < output_power_min && out->voltage < out->src_voltage_start) {
108104
// no load condition (e.g. start-up of nanogrid) --> raise voltage
109105
pwr_inc_goal = 1; // increase output power
110106
}

src/device_status.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ void DeviceStatus::update_energy()
2727
static uint32_t bat_chg_total_Wh_prev = bat_chg_total_Wh;
2828
static uint32_t bat_dis_total_Wh_prev = bat_dis_total_Wh;
2929

30+
#ifdef SOLAR_TERMINAL
3031
if (solar_terminal.voltage < bat_terminal.voltage) {
3132
seconds_zero_solar += 1;
3233
}
@@ -47,13 +48,16 @@ void DeviceStatus::update_energy()
4748
}
4849
seconds_zero_solar = 0;
4950
}
51+
#endif
5052

5153
bat_chg_total_Wh = bat_chg_total_Wh_prev +
5254
(bat_terminal.pos_energy_Wh > 0 ? bat_terminal.pos_energy_Wh : 0);
5355
bat_dis_total_Wh = bat_dis_total_Wh_prev +
5456
(bat_terminal.neg_energy_Wh > 0 ? bat_terminal.neg_energy_Wh : 0);
57+
#ifdef SOLAR_TERMINAL
5558
solar_in_total_Wh = solar_in_total_Wh_prev +
5659
(solar_terminal.neg_energy_Wh > 0 ? solar_terminal.neg_energy_Wh : 0);
60+
#endif
5761
load_out_total_Wh = load_out_total_Wh_prev +
5862
(load_terminal.pos_energy_Wh > 0 ? load_terminal.pos_energy_Wh : 0);
5963
}
@@ -64,9 +68,11 @@ void DeviceStatus::update_min_max_values()
6468
battery_voltage_max = bat_terminal.voltage;
6569
}
6670

71+
#ifdef SOLAR_TERMINAL
6772
if (solar_terminal.voltage > solar_voltage_max) {
6873
solar_voltage_max = solar_terminal.voltage;
6974
}
75+
#endif
7076

7177
#if FEATURE_DCDC_CONVERTER
7278
if (dcdc.lvs->current > dcdc_current_max) {
@@ -82,12 +88,14 @@ void DeviceStatus::update_min_max_values()
8288
load_current_max = load_terminal.current;
8389
}
8490

91+
#ifdef SOLAR_TERMINAL
8592
if (-solar_terminal.power > solar_power_max_day) {
8693
solar_power_max_day = -solar_terminal.power;
8794
if (solar_power_max_day > solar_power_max_total) {
8895
solar_power_max_total = solar_power_max_day;
8996
}
9097
}
98+
#endif
9199

92100
if (load_terminal.power > load_power_max_day) {
93101
load_power_max_day = load_terminal.power;

src/ext/oled.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ void ExtOled::process_1s()
7575
char buf[30];
7676
unsigned int len;
7777

78+
#ifdef SOLAR_TERMINAL
79+
PowerPort &in_terminal = solar_terminal;
80+
#elif defined(GRID_TERMINAL)
81+
PowerPort &in_terminal = grid_terminal;
82+
#endif
83+
7884
oled.clear();
7985

8086
oled.drawBitmap(6, 0, bmp_pv_panel, 16, 16, 1);
@@ -121,7 +127,7 @@ void ExtOled::process_1s()
121127
#endif
122128
oled.setTextCursor(0, 18);
123129
len = snprintf(buf, sizeof(buf), "%4.0fW",
124-
(abs(solar_terminal.power) < 1) ? 0 : -solar_terminal.power); // remove negative zeros
130+
(abs(in_terminal.power) < 1) ? 0 : -in_terminal.power); // remove negative zeros
125131
oled.writeString(buf, len);
126132
}
127133
else {
@@ -130,11 +136,11 @@ void ExtOled::process_1s()
130136
oled.writeString(buf, len);
131137
}
132138
#ifndef CHARGER_TYPE_PWM
133-
if (solar_terminal.voltage > bat_terminal.voltage)
139+
if (in_terminal.voltage > bat_terminal.voltage)
134140
#endif
135141
{
136142
oled.setTextCursor(0, 26);
137-
len = snprintf(buf, sizeof(buf), "%4.1fV", solar_terminal.voltage);
143+
len = snprintf(buf, sizeof(buf), "%4.1fV", in_terminal.voltage);
138144
oled.writeString(buf, len);
139145
}
140146

@@ -159,7 +165,7 @@ void ExtOled::process_1s()
159165

160166
oled.setTextCursor(0, 36);
161167
len = snprintf(buf, sizeof(buf), "Day +%5.0fWh -%5.0fWh",
162-
solar_terminal.neg_energy_Wh, fabs(load_terminal.pos_energy_Wh));
168+
in_terminal.neg_energy_Wh, fabs(load_terminal.pos_energy_Wh));
163169
oled.writeString(buf, len);
164170
len = snprintf(buf, sizeof(buf), "Tot +%4.1fkWh -%4.1fkWh",
165171
dev_stat.solar_in_total_Wh / 1000.0, fabs(dev_stat.load_out_total_Wh) / 1000.0);

src/main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern PwmSwitch pwm_switch;
3333

3434
extern PowerPort &bat_terminal;
3535
extern PowerPort &solar_terminal;
36+
extern PowerPort &grid_terminal;
3637

3738
extern DeviceStatus dev_stat;
3839
extern Charger charger;

src/main_mbed.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,21 @@ Dcdc dcdc(&hv_terminal, &dcdc_lv_port, DCDC_MODE_INIT);
4646
PowerPort pwm_terminal; // external terminal of PWM switch port (normally solar)
4747
PowerPort pwm_port_int; // internal side of PWM switch
4848
PwmSwitch pwm_switch(&pwm_terminal, &pwm_port_int);
49-
PowerPort &solar_terminal = pwm_terminal;
50-
#else
51-
PowerPort &solar_terminal = SOLAR_TERMINAL; // defined in config.h
5249
#endif
5350

5451
#if FEATURE_LOAD_OUTPUT
5552
PowerPort load_terminal; // load terminal (also connected to lv_bus)
5653
LoadOutput load(&load_terminal);
5754
#endif
5855

56+
#ifdef SOLAR_TERMINAL
57+
PowerPort &solar_terminal = SOLAR_TERMINAL; // defined in config.h
58+
#endif
59+
5960
PowerPort &bat_terminal = BATTERY_TERMINAL; // defined in config.h
61+
6062
#ifdef GRID_TERMINAL
61-
PowerPort &grid_terminal = GRID_TERMINAL;
63+
PowerPort &grid_terminal = GRID_TERMINAL; // defined in config.h
6264
#endif
6365

6466
Charger charger(&bat_terminal);
@@ -106,7 +108,9 @@ int main()
106108

107109
init_watchdog(10); // 10s should be enough for communication ports
108110

111+
#ifdef SOLAR_TERMINAL
109112
solar_terminal.init_solar();
113+
#endif
110114

111115
#ifdef GRID_TERMINAL
112116
grid_terminal.init_nanogrid();
@@ -191,8 +195,16 @@ void system_control()
191195
// see also here: https://github.com/ARMmbed/mbed-os/issues/9065
192196
timestamp++;
193197
counter = 0;
198+
194199
// energy + soc calculation must be called exactly once per second
200+
#ifdef SOLAR_TERMINAL
195201
solar_terminal.energy_balance();
202+
#endif
203+
204+
#ifdef GRID_TERMINAL
205+
grid_terminal.energy_balance();
206+
#endif
207+
196208
bat_terminal.energy_balance();
197209
load_terminal.energy_balance();
198210
dev_stat.update_energy();

src/power_port.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void PowerPort::init_nanogrid()
2626

2727
// also initialize the connected bus
2828
src_voltage_start = 30.0; // starting buck mode above this point
29-
src_voltage_stop = 20.0; // stopping buck mode below this point
29+
src_voltage_stop = 30.0; // stopping buck mode below this point
3030

3131
sink_voltage_max = 28.0; // starting idle mode above this point
3232
sink_voltage_min = 10.0;

0 commit comments

Comments
 (0)