Mitsubishi Outlander DCDC OBC: Difference between revisions
No edit summary |
|||
Line 80: | Line 80: | ||
- B1 = temp x 2? | - B1 = temp x 2? | ||
- B3 = EVSE Control Duty Cycle (granny cable ~26 = 26%) | - B3 = EVSE Control Duty Cycle (granny cable ~26 = 26%) | ||
[[Category:OEM]] [[Category:Mitsubishi]] [[Category:Charger]] [[Category:DC/DC]] | |||
'''Parallel charger control:''' | |||
One can use several chargers in parallel each on its own AC phase line. | |||
Charger works good with simple 12V square PWM signal derived from DUE. So to control chargers in parallel i just need to send fake CP signal into DUE and sense the square weave to output two identical square weaves on other PWM pins. Chargers will respond to 0x286 request. | |||
'''Charger voltage control:''' | |||
Charger voltage control is dependent on reading its voltage reports on telegram 0x | |||
First i request listening to CAN in main function. Of course variables need to be declared... | |||
<code>CAN_FRAME incoming;</code> | |||
<code> if (Can0.available() > 0) {</code> | |||
<code> Can0.read(incoming);</code> | |||
<code> if(incoming.id==0x389){</code> | |||
<code> voltage=incoming.data.bytes[0]; //HV voltage is compressed as a single byte at 1/2 value</code> | |||
<code> Ctemp=incoming.data.bytes[4]; //I want to also read charger temperature</code> | |||
<code> }</code> | |||
<code> if(incoming.id==0x377){</code> | |||
<code> aux1=incoming.data.bytes[0]; //aux voltage is a two byte value</code> | |||
<code> aux2=incoming.data.bytes[1]; </code> | |||
<code> auxvoltage=((aux1 * 256) + aux2); //recalculate two bit voltage value</code> | |||
<code> } </code> | |||
<code> }</code> | |||
I request charger command telegram function and within i condition for high voltage reduction and stop. | |||
<code>void sendCANframeA() {</code> | |||
<code>outframe.id = 0x286; // Set our transmission address ID</code> | |||
<code>outframe.length = 8; // Data payload 8 bytes</code> | |||
<code>outframe.extended = 0; // Extended addresses - 0=11-bit 1=29bit</code> | |||
<code>outframe.rtr=1; //No request</code> | |||
<code>outframe.data.bytes[0]=0x28;</code> | |||
<code>outframe.data.bytes[1]=0x0F; // 0F3C=3900, 0DDE=3550, 0,1V/bit</code> | |||
<code>if(voltage < 193) { // if Charger senses less than 386V</code> | |||
<code>outframe.data.bytes[2]=0x78; // 78=120 12A, 50=80 8A, 32=50 5A, 1E=30, 3A 14=20 2A at 0,1A/bit</code> | |||
<code>}</code> | |||
<code>else if(voltage <= 194) { // if Charger senses less than or equal 388V</code> | |||
<code>outframe.data.bytes[2]=0x1E; //If we are near the top i quest 3A only to taper the charge down</code> | |||
<code>}</code> | |||
<code>else { //any other case</code> | |||
<code>outframe.data.bytes[2]=0x00; //0A if reach the top</code> | |||
<code>}</code> | |||
<code>outframe.data.bytes[3]=0x37;</code> | |||
<code>outframe.data.bytes[4]=0x00;</code> | |||
<code>outframe.data.bytes[5]=0x00;</code> | |||
<code>outframe.data.bytes[6]=0x0A;</code> | |||
<code>outframe.data.bytes[7]=0x00;</code> | |||
<code>if(debug) {printFrame(&outframe,1); } //If the debug variable is set, show our transmitted frame</code> | |||
<code>if(myVars.CANport==0) Can0.sendFrame(outframe); //Mail it</code> | |||
<code>else Can1.sendFrame(outframe);</code> | |||
<code>}</code> | |||
'''DCDC aux voltage control''' | |||
I can also control 12V aux battery charging by reading DCDC report on 0x377. When aux voltage drops too much i can start DCDC or 3 minutes and 12V battery gets charged up. | |||
<code>if (auxvoltage < 1200) { // if aux voltage is low and DCDC is off</code> | |||
<code>auxState = true; // set the state flag to true </code> | |||
<code>elapsedtime=millis(); </code> | |||
<code>}</code> | |||
<code>DCDCauxcharge();</code> | |||
Within this function then i compare status and count down 3min for the charge event | |||
<code>void DCDCauxcharge()</code> | |||
<code>{</code> | |||
<code>if ((auxState == true) && (digitalRead(Enable_pin) == LOW)) { // auxvoltage went below 12.2V</code> | |||
<code>digitalWrite(DCDC_active,HIGH); // turn on DCDC</code> | |||
<code>if (millis() - elapsedtime >= ontime) { // if aux voltage is low and for 3min</code> | |||
<code>digitalWrite(DCDC_active,LOW); // turn off DCDC after time elapsed</code> | |||
<code>elapsedtime=millis();</code> | |||
<code>auxState = false;</code> | |||
<code><nowiki>}}</nowiki></code> | |||
<code>else { // if auxvoltage is OK</code> | |||
<code>auxState = false; // turn off DCDC_active relay</code> | |||
<code><nowiki>}}</nowiki></code> | |||
Lots of other functions can be prepared on basis of CAN report reading. Those are some functions that are usefull. | |||
[[Category:OEM]] | |||
[[Category:Mitsubishi]] | |||
[[Category:Charger]] | |||
[[Category:DC/DC]] |
Revision as of 16:13, 26 November 2022
The Mitsubishi Outlander PHEV (2012-2018 models) feature a compact CANBus controlled 3.7kw charger suitable for budget EV conversions. Units can be bought for under £200. Part numbers are: W005T70271 (pre 2018) [1], W005T70272 (post 2018) [2]
forum thread: https://openinverter.org/forum/viewtopic.php?t=628
3d scan cad file: https://grabcad.com/library/outlander-phev-charger-and-dcdc-1
Dimensions
* Length 370mm * Width 270mm * Height 150mm
DC-DC Converter
The charger has an integrated DC-DC converter outputting a fixed 14.5V. The converter requires battery voltage between 200V and 400V on the DC bus.
*at about 397v the dcdc appears to stop operating via the enable lines. currently untested if it continues via can. [3]
To start the DC-DC converter, first to apply 12V to pin 7 and GND to pin 10. You also need to have its casing connected to common GND and 12V at the Pin 8 IGCT main power pin.
Then apply 12V ENABLE signal to pin 4 and you will see 14.5Vdc on the power line.
The DCDC is capable of at least 1800W of power.
Connections
The charger is controlled via a 13-pin connector mounted on a short tail into the case. Connectors seem to be widely available to mate with this. Search for "Sumitomo 6189-1092 13-WAY CONNECTOR KIT Inc Terminals & seals [13-AC001]".
Pinout as as follows:
- Pin 1 (Orange) NC on outlander
- Pin 2 NC on outlander
- Pin 3 (Blue) NC on outlander
- Pin 4 Sense line for DC to DC converter
- Pin 5 CHIN (Serial protocol to EV Remote wifi module)
- Pin 6 CAN H (Black)
- Pin 7 DC SW enables the DC:DC converter
- Pin 8 IGCT main power to charger
- Pin 9 Control Pilot from charging cable
- Pin 10 GND
- Pin 11 NC
- Pin 12 CHOT (Serial protocol to EV Remote wifi module)
- Pin 13 CAN L (Red)
The AC power connector is Yakaza 90980-11413https://www.auto-click.co.uk/7283-7350-30?search=90980-11413
Charge Control
There is no voltage adjustment only current so your controller needs to monitor output voltage and step the charge current. Regardless of the set current the pilot signal will limit the charge current automatically. The pilot signal duty cycle is available on the can bus.
CANBus Messages
The CANBus interface operates at 500kbps/100ms.
Starting charging requires two messages:
0x285 alone will connect the EVSE but won't charge until you send 0x286. Byte 2 = 0xb6 pulls in the EVSE.
0x286 byte 2 sets the DC charge current, there is a voltage setting on byte 0 and 1. The charger reads this value only once. To update it, you have to first power cycle the 12V line "Pin 8 IGCT main power to charger".
- Byte 0-1 = Voltage setpoint (Big Endian e.g. 0x0E 0x74 = 3700 = 370v) - Byte 2 = Current in amps x 10
The charger also returns information over the CANbus:
0x377h 8bytes DC-DC converter status
- B0+B1 = 12V Battery voltage (h04DC=12,45V -> 0,01V/bit) - B2+B3 = 12V Supply current (H53=8,3A -> 0,1A/bit) - B4 = Temperature 1 (starts at -40degC, +1degC/bit) - B5 = Temperature 2 (starts at -40degC, +1degC/bit) - B6 = Temperature 3 (starts at -40degC, +1degC/bit) - B7 = Statusbyte (h20=standby, h21=error, h22=in operation) - - bit0(LSB) = Error - - bit1 = In Operation - - bit3 = - - bit4 = - - bit5 = Ready - - bit6 = - - bit7(MSB) =
0x389
- B0 = Battery Voltage (as seen by the charger), needs to be scaled x 2, so can represent up to 255*2V; used to monitor battery during charge - B1 = Charger supply voltage, no scaling needed - B6 = Charger Supply Current x 10
0x38A
- B0 = temp x 2? - B1 = temp x 2? - B3 = EVSE Control Duty Cycle (granny cable ~26 = 26%)
Parallel charger control:
One can use several chargers in parallel each on its own AC phase line.
Charger works good with simple 12V square PWM signal derived from DUE. So to control chargers in parallel i just need to send fake CP signal into DUE and sense the square weave to output two identical square weaves on other PWM pins. Chargers will respond to 0x286 request.
Charger voltage control:
Charger voltage control is dependent on reading its voltage reports on telegram 0x
First i request listening to CAN in main function. Of course variables need to be declared...
CAN_FRAME incoming;
if (Can0.available() > 0) {
Can0.read(incoming);
if(incoming.id==0x389){
voltage=incoming.data.bytes[0]; //HV voltage is compressed as a single byte at 1/2 value
Ctemp=incoming.data.bytes[4]; //I want to also read charger temperature
}
if(incoming.id==0x377){
aux1=incoming.data.bytes[0]; //aux voltage is a two byte value
aux2=incoming.data.bytes[1];
auxvoltage=((aux1 * 256) + aux2); //recalculate two bit voltage value
}
}
I request charger command telegram function and within i condition for high voltage reduction and stop.
void sendCANframeA() {
outframe.id = 0x286; // Set our transmission address ID
outframe.length = 8; // Data payload 8 bytes
outframe.extended = 0; // Extended addresses - 0=11-bit 1=29bit
outframe.rtr=1; //No request
outframe.data.bytes[0]=0x28;
outframe.data.bytes[1]=0x0F; // 0F3C=3900, 0DDE=3550, 0,1V/bit
if(voltage < 193) { // if Charger senses less than 386V
outframe.data.bytes[2]=0x78; // 78=120 12A, 50=80 8A, 32=50 5A, 1E=30, 3A 14=20 2A at 0,1A/bit
}
else if(voltage <= 194) { // if Charger senses less than or equal 388V
outframe.data.bytes[2]=0x1E; //If we are near the top i quest 3A only to taper the charge down
}
else { //any other case
outframe.data.bytes[2]=0x00; //0A if reach the top
}
outframe.data.bytes[3]=0x37;
outframe.data.bytes[4]=0x00;
outframe.data.bytes[5]=0x00;
outframe.data.bytes[6]=0x0A;
outframe.data.bytes[7]=0x00;
if(debug) {printFrame(&outframe,1); } //If the debug variable is set, show our transmitted frame
if(myVars.CANport==0) Can0.sendFrame(outframe); //Mail it
else Can1.sendFrame(outframe);
}
DCDC aux voltage control
I can also control 12V aux battery charging by reading DCDC report on 0x377. When aux voltage drops too much i can start DCDC or 3 minutes and 12V battery gets charged up.
if (auxvoltage < 1200) { // if aux voltage is low and DCDC is off
auxState = true; // set the state flag to true
elapsedtime=millis();
}
DCDCauxcharge();
Within this function then i compare status and count down 3min for the charge event
void DCDCauxcharge()
{
if ((auxState == true) && (digitalRead(Enable_pin) == LOW)) { // auxvoltage went below 12.2V
digitalWrite(DCDC_active,HIGH); // turn on DCDC
if (millis() - elapsedtime >= ontime) { // if aux voltage is low and for 3min
digitalWrite(DCDC_active,LOW); // turn off DCDC after time elapsed
elapsedtime=millis();
auxState = false;
}}
else { // if auxvoltage is OK
auxState = false; // turn off DCDC_active relay
}}
Lots of other functions can be prepared on basis of CAN report reading. Those are some functions that are usefull.