Amazing 2.2KW OEM DC/DC Convertor

Most DC/DC converters on the market are cheap Chinese made solutions, with relatively low power output (400-800W), and low voltage capabilities (~150-350V).

I put off purchasing a DC/DC converter for quite some time because I really wasn’t happy with any solutions that I could purchase. I just didn’t have any confidence that they would last, or really even meet my needs, until I stumbled across this perfect OEM solution.

This is a Delphi, liquid cooled, IP67 rated, 420V max operation, 2.2kW DC/DC converter used in the Chevrolet Volt. It blows away all of my requirements, and is absolutely perfect except for one small detail… although this is the same unit used in the Volt, the particular unit I found was used in the Coda (A product with very limited production) and the high voltage connector used on this unit is a very unique military grade connector that I can’t really find a source for.

The second small hurdle is that this unit is 100% CAN controlled, which wouldn’t be an issue if they published the CAN specs, but of course OEMs don’t really do that. Luckily I’ve stumbled across a group of pretty smart guys trying to reverse engineer a lot of great OEM components and I think they’ve cracked enough of what I need to get this up and running. So right now its just a difficult hunt for the mating connector (Fall back plan is to open the unit up and replace the current HV connector with one I can source a mating connector for)

From the EVTV Forum:

The command line needed is message address 1D7(h) which will consist of 8 bytes.
The First byte is the 64-58th bit and etc and is structured as:
1D7 8 80 77 00 00 00 00 00 00
For 13.0 vdc output.

To request 14.0 vdc, the message was:
1D7 8 80 A5 00 00 00 00 00 00

It is repeated at 25ms intervals, and has response at 25ms intervals from 1D5
Stats reported include HV input voltage, current, and LV output volts and current, along with coolant temperature and coldplate temperature (but check the attached doc to verify what all is reported by the status messages).
There are additional status messages from 48A every 250ms
It does require that a 12vdc battery be connected to the output terminal and there is an enable line that must be brought to 12vdc to turn it on too.

The CAN bus is 500Kbps for the Delphi.

The Coda CAN capture shows that their message is:

1D7 8 80 85 00 00 00 00 00 00

______________________________________________________________

 

function msg = DCDC(msgnam)

% =========================================================================
% Notes:
% – To select a message from a list, use syntax: ‘CANExample(”MsgName”)’
% – Little Endian == Intel, Big Endian == Motorola
% – Defaults: IDMask:0xffffffff, PayLoadSize:8, Interval:-1
% – Defaults: BIG_ENDIAN, UNSIGNED, Scale:1, Offset:0, Min:-Inf, Max:Inf
% – Defaults: DataTypeModel:double

global EnumLst;
Protocol = ‘Delphi’;
CANBus = ‘CAN1’;

% =========================================================================

msg.name = ‘DCDC1D5’;
msg.idext = ‘STANDARD’;
msg.id = hex2dec(‘1D5’);
msg.interval = 25;
cnt = 0;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCMstrFlt’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 63;
msg.fields{cnt}.bit_length = 1;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCHVCurVld’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 60;
msg.fields{cnt}.bit_length = 1;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCHVCur’;
msg.fields{cnt}.units = ‘A’;
msg.fields{cnt}.start_bit = 48;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.scale = 0.1;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCDTCIdx’;
msg.fields{cnt}.units = ‘-‘;
msg.fields{cnt}.start_bit = 43;
msg.fields{cnt}.bit_length = 5;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCDTCStat’;
msg.fields{cnt}.units = ‘-‘;
msg.fields{cnt}.start_bit = 40;
msg.fields{cnt}.bit_length = 3;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCLVVlt’;
msg.fields{cnt}.units = ‘V’;
msg.fields{cnt}.start_bit = 32;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.scale = 0.078431;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCVltCondMet’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 31;
msg.fields{cnt}.bit_length = 1;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCLVCur’;
msg.fields{cnt}.units = ‘A’;
msg.fields{cnt}.start_bit = 8;
msg.fields{cnt}.bit_length = 7;
msg.fields{cnt}.scale = 2;

eval([‘Msg.’ msg.name ‘ = msg;’]); Msg1 = msg;
clear msg

% =========================================================================

msg.name = ‘DCDC48A’;
msg.idext = ‘STANDARD’;
msg.id = hex2dec(’48A’);
msg.payload_size = 6;
msg.interval = 250;
cnt = 0;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCHVLoFlt’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 63;
msg.fields{cnt}.bit_length = 1;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCPwrLoss’;
msg.fields{cnt}.units = ‘W’;
msg.fields{cnt}.start_bit = 40;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.scale = 2;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDC14VCirctTmp’;
msg.fields{cnt}.units = ‘C’;
msg.fields{cnt}.start_bit = 24;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.offset = -40;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCHeatPlateTmp’;
msg.fields{cnt}.units = ‘C’;
msg.fields{cnt}.start_bit = 16;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.offset = -40;

eval([‘Msg.’ msg.name ‘ = msg;’]); Msg1 = msg;
clear msg

% =========================================================================

msg.name = ‘DCDC1D7’;
msg.idext = ‘STANDARD’;
msg.id = hex2dec(‘1D7’);
msg.interval = 25;
cnt = 0;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCBuckEnblReq’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 63;
msg.fields{cnt}.bit_length = 1;
msg.fields{cnt}.data_type_mdl = ‘boolean’;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCVNCEnblReq’;
msg.fields{cnt}.units = ‘Bool’;
msg.fields{cnt}.start_bit = 61;
msg.fields{cnt}.bit_length = 1;
msg.fields{cnt}.data_type_mdl = ‘boolean’;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCVltSetptReq’;
msg.fields{cnt}.units = ‘V’;
msg.fields{cnt}.start_bit = 48;
msg.fields{cnt}.bit_length = 8;
msg.fields{cnt}.scale = 0.022059;
msg.fields{cnt}.offset = 10.4375;

cnt = cnt + 1;
msg.fields{cnt}.name = ‘DCDCBoostEnblReq’;
msg.fields{cnt}.units = ”;
msg.fields{cnt}.start_bit = 13;
msg.fields{cnt}.bit_length = 3;
msg.fields{cnt}.enumeration = EnumLst.DCDCBoostEnblReq; % {‘Inactv’, ‘Rqrd’, ‘Rdy’, ‘Actv’, ‘Cmplt’, ‘Abrtd’}
msg.fields{cnt}.data_type_mdl = ‘uint8’;

eval([‘Msg.’ msg.name ‘ = msg;’]); Msg1 = msg;
clear msg

% =========================================================================

if nargin == 0
msg = Msg1;
elseif nargin == 1
eval(‘msg = Msg.(msgnam);’);
end
msg.protocol = Protocol;
msg.bus_name = CANBus;