Skip to content

Commit f645adc

Browse files
committed
AC charger: make CAN controller frequency configurable
1 parent b461aff commit f645adc

11 files changed

+49
-4
lines changed

include/Configuration.h

+1
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ struct CONFIG_T {
177177
uint8_t Battery_JkBmsPollingInterval;
178178

179179
bool Huawei_Enabled;
180+
uint32_t Huawei_CAN_Controller_Frequency;
180181
bool Huawei_Auto_Power_Enabled;
181182
float Huawei_Auto_Power_Voltage_Limit;
182183
float Huawei_Auto_Power_Enable_Voltage_Limit;

include/Huawei_can.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ typedef struct RectifierParameters {
9090

9191
class HuaweiCanCommClass {
9292
public:
93-
bool init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk, uint8_t huawei_irq, uint8_t huawei_cs);
93+
bool init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk,
94+
uint8_t huawei_irq, uint8_t huawei_cs, uint32_t frequency);
9495
void loop();
9596
bool gotNewRxDataFrame(bool clear);
9697
uint8_t getErrorCode(bool clear);

include/defaults.h

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
#define BATTERY_JKBMS_POLLING_INTERVAL 5
138138

139139
#define HUAWEI_ENABLED false
140+
#define HUAWEI_CAN_CONTROLLER_FREQUENCY 8000000UL
140141
#define HUAWEI_AUTO_POWER_VOLTAGE_LIMIT 42.0
141142
#define HUAWEI_AUTO_POWER_ENABLE_VOLTAGE_LIMIT 42.0
142143
#define HUAWEI_AUTO_POWER_LOWER_POWER_LIMIT 150

src/Configuration.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ bool ConfigurationClass::write()
190190

191191
JsonObject huawei = doc.createNestedObject("huawei");
192192
huawei["enabled"] = config.Huawei_Enabled;
193+
huawei["can_controller_frequency"] = config.Huawei_CAN_Controller_Frequency;
193194
huawei["auto_power_enabled"] = config.Huawei_Auto_Power_Enabled;
194195
huawei["voltage_limit"] = config.Huawei_Auto_Power_Voltage_Limit;
195196
huawei["enable_voltage_limit"] = config.Huawei_Auto_Power_Enable_Voltage_Limit;
@@ -413,6 +414,7 @@ bool ConfigurationClass::read()
413414

414415
JsonObject huawei = doc["huawei"];
415416
config.Huawei_Enabled = huawei["enabled"] | HUAWEI_ENABLED;
417+
config.Huawei_CAN_Controller_Frequency = huawei["can_controller_frequency"] | HUAWEI_CAN_CONTROLLER_FREQUENCY;
416418
config.Huawei_Auto_Power_Enabled = huawei["auto_power_enabled"] | false;
417419
config.Huawei_Auto_Power_Voltage_Limit = huawei["voltage_limit"] | HUAWEI_AUTO_POWER_VOLTAGE_LIMIT;
418420
config.Huawei_Auto_Power_Enable_Voltage_Limit = huawei["enable_voltage_limit"] | HUAWEI_AUTO_POWER_ENABLE_VOLTAGE_LIMIT;

src/Huawei_can.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ void HuaweiCanCommunicationTask(void* parameter) {
3030
}
3131
}
3232

33-
bool HuaweiCanCommClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk, uint8_t huawei_irq, uint8_t huawei_cs) {
33+
bool HuaweiCanCommClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk,
34+
uint8_t huawei_irq, uint8_t huawei_cs, uint32_t frequency) {
3435
SPI = new SPIClass(HSPI);
3536
SPI->begin(huawei_clk, huawei_miso, huawei_mosi, huawei_cs);
3637
pinMode(huawei_cs, OUTPUT);
@@ -39,8 +40,14 @@ bool HuaweiCanCommClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t
3940
pinMode(huawei_irq, INPUT_PULLUP);
4041
_huaweiIrq = huawei_irq;
4142

43+
auto mcp_frequency = MCP_8MHZ;
44+
if (16000000UL == frequency) { mcp_frequency = MCP_16MHZ; }
45+
else if (8000000UL != frequency) {
46+
MessageOutput.printf("Huawei CAN: unknown frequency %d Hz, using 8 MHz\r\n", mcp_frequency);
47+
}
48+
4249
_CAN = new MCP_CAN(SPI, huawei_cs);
43-
if (!_CAN->begin(MCP_STDEXT, CAN_125KBPS, MCP_8MHZ) == CAN_OK) {
50+
if (!_CAN->begin(MCP_STDEXT, CAN_125KBPS, mcp_frequency) == CAN_OK) {
4451
return false;
4552
}
4653

@@ -198,7 +205,7 @@ void HuaweiCanClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huaw
198205
return;
199206
}
200207

201-
if (!HuaweiCanComm.init(huawei_miso, huawei_mosi, huawei_clk, huawei_irq, huawei_cs)) {
208+
if (!HuaweiCanComm.init(huawei_miso, huawei_mosi, huawei_clk, huawei_irq, huawei_cs, config.Huawei_CAN_Controller_Frequency)) {
202209
MessageOutput.println("[HuaweiCanClass::init] Error Initializing Huawei CAN communication...");
203210
return;
204211
};

src/WebApi_Huawei.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ void WebApiHuaweiClass::onAdminGet(AsyncWebServerRequest* request)
190190
const CONFIG_T& config = Configuration.get();
191191

192192
root[F("enabled")] = config.Huawei_Enabled;
193+
root[F("can_controller_frequency")] = config.Huawei_CAN_Controller_Frequency;
193194
root[F("auto_power_enabled")] = config.Huawei_Auto_Power_Enabled;
194195
root[F("voltage_limit")] = static_cast<int>(config.Huawei_Auto_Power_Voltage_Limit * 100) / 100.0;
195196
root[F("enable_voltage_limit")] = static_cast<int>(config.Huawei_Auto_Power_Enable_Voltage_Limit * 100) / 100.0;
@@ -240,6 +241,7 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request)
240241
}
241242

242243
if (!(root.containsKey("enabled")) ||
244+
!(root.containsKey("can_controller_frequency")) ||
243245
!(root.containsKey("auto_power_enabled")) ||
244246
!(root.containsKey("voltage_limit")) ||
245247
!(root.containsKey("lower_power_limit")) ||
@@ -253,6 +255,7 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request)
253255

254256
CONFIG_T& config = Configuration.get();
255257
config.Huawei_Enabled = root[F("enabled")].as<bool>();
258+
config.Huawei_CAN_Controller_Frequency = root[F("can_controller_frequency")].as<uint32_t>();
256259
config.Huawei_Auto_Power_Enabled = root[F("auto_power_enabled")].as<bool>();
257260
config.Huawei_Auto_Power_Voltage_Limit = root[F("voltage_limit")].as<float>();
258261
config.Huawei_Auto_Power_Enable_Voltage_Limit = root[F("enable_voltage_limit")].as<float>();
@@ -267,6 +270,14 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request)
267270
response->setLength();
268271
request->send(response);
269272

273+
// TODO(schlimmchen): HuaweiCan has no real concept of the fact that the
274+
// config might change. at least not regarding CAN parameters. until that
275+
// changes, the ESP must restart for configuration changes to take effect.
276+
yield();
277+
delay(1000);
278+
yield();
279+
ESP.restart();
280+
270281
const PinMapping_t& pin = PinMapping.get();
271282
// Properly turn this on
272283
if (config.Huawei_Enabled) {

webapp/src/locales/de.json

+1
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,7 @@
777777
"ChargerSettings": "AC Ladegerät Einstellungen",
778778
"Configuration": "AC Ladegerät Konfiguration",
779779
"EnableHuawei": "Huawei R4850G2 an CAN Bus Interface aktiv",
780+
"CanControllerFrequency": "Frequenz des Quarzes am CAN Controller",
780781
"EnableAutoPower": "Automatische Leistungssteuerung",
781782
"Limits": "Limits",
782783
"VoltageLimit": "Ladespannungslimit",

webapp/src/locales/en.json

+1
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,7 @@
787787
"ChargerSettings": "AC Charger Settings",
788788
"Configuration": "AC Charger Configuration",
789789
"EnableHuawei": "Enable Huawei R4850G2 on CAN Bus Interface",
790+
"CanControllerFrequency": "CAN controller quarz frequency",
790791
"EnableAutoPower": "Automatic power control",
791792
"Limits": "Limits",
792793
"VoltageLimit": "Charge Voltage limit",

webapp/src/locales/fr.json

+1
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,7 @@
743743
"ChargerSettings": "AC Charger Settings",
744744
"Configuration": "AC Charger Configuration",
745745
"EnableHuawei": "Enable Huawei R4850G2 on CAN Bus Interface",
746+
"CanControllerFrequency": "CAN controller quarz frequency",
746747
"EnableAutoPower": "Automatic power control",
747748
"Limits": "Limits",
748749
"VoltageLimit": "Charge Voltage limit",

webapp/src/types/AcChargerConfig.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export interface AcChargerConfig {
22
enabled: boolean;
3+
can_controller_frequency: number;
34
auto_power_enabled: boolean;
45
voltage_limit: number;
56
enable_voltage_limit: number;

webapp/src/views/AcChargerAdminView.vue

+18
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@
99
<InputElement :label="$t('acchargeradmin.EnableHuawei')"
1010
v-model="acChargerConfigList.enabled"
1111
type="checkbox" wide/>
12+
13+
<div class="row mb-3" v-show="acChargerConfigList.enabled">
14+
<label class="col-sm-4 col-form-label">
15+
{{ $t('acchargeradmin.CanControllerFrequency') }}
16+
</label>
17+
<div class="col-sm-8">
18+
<select class="form-select" v-model="acChargerConfigList.can_controller_frequency">
19+
<option v-for="frequency in frequencyTypeList" :key="frequency.key" :value="frequency.value">
20+
{{ frequency.key }} MHz
21+
</option>
22+
</select>
23+
</div>
24+
</div>
25+
1226
<InputElement v-show="acChargerConfigList.enabled"
1327
:label="$t('acchargeradmin.EnableAutoPower')"
1428
v-model="acChargerConfigList.auto_power_enabled"
@@ -89,6 +103,10 @@ export default defineComponent({
89103
alertMessage: "",
90104
alertType: "info",
91105
showAlert: false,
106+
frequencyTypeList: [
107+
{ key: 8, value: 8000000 },
108+
{ key: 16, value: 16000000 },
109+
],
92110
};
93111
},
94112
created() {

0 commit comments

Comments
 (0)