# Hacking series - Chevy Volt HV charger



## eldis (Sep 3, 2013)

Hi guys,

A month ago I've received my Chevy Volt components (battery, charger, inverter). I'm going to slowly start a thread on each one of those components, to show how they can be reused for DIY (I've posted some info how to use the battery relays and control in the Chevy Volt battery thread already)

Chevy Volt charger:
According to this study http://www1.eere.energy.gov/vehicle...ciency_results_chevy_volt_onboard_charger.pdf
You can expect 3.3kW power from 240V socket and 1.2kW from 120V socket.
Strangely enough, this module also charges 12V battery (0.4kW), but only during the charging period. For alternator replacement, Chevy uses a dedicated DC/DC converter located in the rear trunk. 

Charger is composed of three modules:
- Main control board (AC->DC, capacitors, two processors, one mainly for data transfer and high-level planning, other one is for low level DC/DC switching and control)
- PFC section (the board with less magnetic cores)
- DC/DC converter (mounted on the bottom)

From external, there are very few "wires" to control this thing. You will find out that except for the usual (ignition start, 12V, HV cabling), everything is CAN controlled, so there is no way how anyone could reverse engineer the protocol on this thing without having an access to working Chevy Volt and its CAN bus.

Very unusual thing about this device is the use of embedded coils and magnetics - PCB acts as a coil, with ferrite cores clamped through from both sides. Also extensive use of heat-conductive glue/silicon. The whole thing is basically glued on a cold plate (watercooling). This explains how can they get away with such compact cores - a lot of thinking went into the thermal design of this thing.

After playing with this charger for a weekend, I'm pretty sure about how switching elements are controlled and which lines have to be controlled in which order. Protective PCB coating layer is making this rather annoying process.

It is definitely possible to reverse engineer enough of it to replace all control systems with a simple microcontroller. I'm not sure if making this work as open source is worth the time, so that's when you guys come in. Do you thing this is worth the effort? 

If someone could capture data on the CAN bus - car standing still, charging cable inserted and then later charging terminated), I might be able to come up with a simple way how to use this thing stand alone without HW modifications. Otherwise we are looking on board-level changes/hacks.

Michal


----------



## CKidder (Dec 12, 2009)

There are already people working on decoding the hardware from Volts and Leafs. You can go here to meet up: http://forums.evtv.me/?forum=403618

In fact, I do believe they've already got the protocol figured out and they're charging with it. But, information has not made it to the forum just yet.


----------



## eldis (Sep 3, 2013)

CKidder said:


> There are already people working on decoding the hardware from Volts and Leafs. You can go here to meet up: http://forums.evtv.me/?forum=403618
> 
> In fact, I do believe they've already got the protocol figured out and they're charging with it. But, information has not made it to the forum just yet.


Thanks! I'll try to investigate there and test it out. It's time we start reusing all these cool OEM components.


----------



## Markijohn (Feb 7, 2014)

Yes, they have the chargers functioning and doing the basics of charging. There are a lot of messages they have not decoded from the charger, but most of which are probably warning messages or other Chevy specific crap that is not needed for our purposes.


----------



## spartan081 (Jun 7, 2016)

eldis said:


> Thanks! I'll try to investigate there and test it out. It's time we start reusing all these cool OEM components.


Sorry to bring this thread back from the dead but I think it is also "time to start reusing all the cool OEM components"

Have you made any progress on your volt charger? I'm working on a Fiat 500e 6.6 kW charger. 

Richard


----------



## eldis (Sep 3, 2013)

spartan081 said:


> Sorry to bring this thread back from the dead but I think it is also "time to start reusing all the cool OEM components"
> 
> Have you made any progress on your volt charger? I'm working on a Fiat 500e 6.6 kW charger.
> 
> Richard


Yup, several people (including me) are using the Volt chargers. You can find the CAN packages required to operate them on http://forums.evtv.me/
Apparently I'm not on the friendly side with EVTV anymore, so it is better if you go there and read it there yourself.

Here are photos of Fiat 500e charger internals. They were kindly provided to my by one owner of a crashed 500e:
https://www.dropbox.com/sh/jg0re8ak9xxyx0p/AABjbBg6REkAdGPxWdWdB4IZa?dl=0

So what is your progress so far? Fiat 500e is a glued compliance car, with parts from different manufacturers. CAN bus communication will be rather trivial. You should be able to log&replay with decent success.


----------



## WolfTronix (Feb 8, 2016)

I am still working on my Nissan Leaf BMS hack, (so it can be used with different pack configurations):
http://www.wolftronix.com/E10_LithiumUpgrade/index.html

Got side tracked working on other customer projects...

And, I am also on Jack's unfriendly list.


----------



## eldis (Sep 3, 2013)

WolfTronix said:


> I am still working on my Nissan Leaf BMS hack, (so it can be used with different pack configurations):
> http://www.wolftronix.com/E10_LithiumUpgrade/index.html
> 
> Got side tracked working on other customer projects...
> ...


I'm a fan of your work, WolfTronix  Can't say I saw all your videos - but I like how descriptive they are, showing success as well as failures.

Out of my EV network I don't have anyone left on Jack's friendly list. It's simply too easy to piss him off (just try telling him that he's wrong with something, and you're done).


----------



## Tomdb (Jan 28, 2013)

I also got this charger working. All be it from a Opel Ampera (same car small plastic tweaks.) Im running it using a simple arduino sketch where I can set the voltage and current command.

however finding the connectors might be an issue if they are not included, had to resort to fitting new ones. 

But I cant complain for the price that I payed for it.


----------



## WolfTronix (Feb 8, 2016)

eldis said:


> I'm a fan of your work, WolfTronix  Can't say I saw all your videos - but I like how descriptive they are, showing success as well as failures.
> 
> Out of my EV network I don't have anyone left on Jack's friendly list. It's simply too easy to piss him off (just try telling him that he's wrong with something, and you're done).


Yeah, I have some how pissed him off by delivering what we had agreed upon, and then he changed his mind...

I did this for Jack, he sent me the DMOC controller:
http://www.diyelectriccar.com/forums/showthread.php/programming-air-cooled-dmoc645-173226.html

I was up front on how I was going to take the DMOC apart, read out the EEPROM and then change the "box type" recalculate the CRC and then write it back... 

He said he did not care how I did it, he just wanted to make them work (he has something like 100 of these DMOCs), promised me some money for the effort... 

Then, after I published my videos, the solution was no longer acceptable.
He did not want open them, He now wanted a software solution...

I told him that was out of scope and not what was agreed upon... and it all went down hill from there...


----------



## Hollie Maea (Dec 9, 2009)

WolfTronix said:


> Yeah, I have some how pissed him off by delivering what we had agreed upon


There's a common denominator here, and it's not you.

As far as I can tell, Colin Kidder is the only person left in the world who is able to regularly work with Jack.


----------



## spartan081 (Jun 7, 2016)

Thanks for the photos and link. I too have a crashed fiat 500e and can take pictures of components/internals and scan CAN messages as needed. I'll check out EVTV and what they have going on in terms of CAN packages. 

Do you know of anyone else working on Fiat 500e parts? Also, what do you mean by "glued" compliance? 

As for progress, I have all the parts and working to hook them all up on the bench to log CAN codes. The goal is to be able to use these parts independent of the vehicle system. 

Richard




eldis said:


> Yup, several people (including me) are using the Volt chargers. You can find the CAN packages required to operate them on http://forums.evtv.me/
> Apparently I'm not on the friendly side with EVTV anymore, so it is better if you go there and read it there yourself.
> 
> Here are photos of Fiat 500e charger internals. They were kindly provided to my by one owner of a crashed 500e:
> ...


----------



## Tesseract (Sep 27, 2008)

Hollie Maea said:


> There's a common denominator here, and it's not you.
> 
> As far as I can tell, Colin Kidder is the only person left in the world who is able to regularly work with Jack.


LOL... I was going to post the exact same thing, even down to pointing out that CK appears to be the only technically-minded person still in JR's good graces.


----------



## WolfTronix (Feb 8, 2016)

"Evnetics"...

I think I talked to you about the WizNet Ethernet module back at EVCON, the first one.

I got an Evnetics T-shirt from your booth.


----------



## eldis (Sep 3, 2013)

spartan081 said:


> Thanks for the photos and link. I too have a crashed fiat 500e and can take pictures of components/internals and scan CAN messages as needed. I'll check out EVTV and what they have going on in terms of CAN packages.
> 
> Do you know of anyone else working on Fiat 500e parts? Also, what do you mean by "glued" compliance?
> 
> ...


Cool, please do take pictures and document your progress. Many people here will appreciate it, I'm sure.

By compliance I mean that the car was released only for certain markets in order to be able to sell other cars there (California has such rules?) Such cars are usually quite rare in other places of the world - but I believe that the Fiat 500e is now being sold in more countries. I'm sure that google will know better than me on this.

Glued - it is using components from different sources and is not designed ground up. Each module will have logo of a different company inside. This is not necessarily a bad thing. Usually this makes the communication protocols much simpler (integration engineers have to circle through their suppliers for each tiny CAN specification change). Just look on Tesla, they are making most modules themselves and therefore have the luxury of an ultra-complex communication between modules (there are things talking to each other that you would not really expect to do so).


----------



## iak78612 (Jan 2, 2017)

Hey guys, 

I got the Volt Charger powered up. It is sending me CAN messages. I sent the charger CAN Messages I found on the EVTV forums, unsuccessfully. 

It seems the issue is that there are two versions of the Lear charger. The Volt version and the Coda version. The guys on the EVTV forums reverse engineered the CODA version. 

Has anyone successfully figured out the CAN commands to use on the Volt charger?

Thanks!


----------



## Tomdb (Jan 28, 2013)

My control messages below for the Chevy Volt or Coda Lear charger.

Also Volt message structure attached in PDF


```
if (settings.chargertype == ChevyVolt)
  {
    msg.id  = 0x30E;
    msg.len = 1;
    msg.buf[0] = 0x02; //only HV charging , 0x03 hv and 12V charging
    Can0.write(msg);

    msg.id  = 0x304;
    msg.len = 4;
    msg.buf[0] = 0x40; //fixed
    if ((chargecurrent * 2) > 255)
    {
      msg.buf[1] = 255;
    }
    else
    {
      msg.buf[1] = (chargecurrent * 2);
    }
      msg.buf[2] = highByte(uint16_t((settings.ChargeVsetpoint * settings.Scells ) * 2));
      msg.buf[3] = lowByte(uint16_t((settings.ChargeVsetpoint * settings.Scells ) * 2));
    Can0.write(msg);
  }

  if (settings.chargertype == Coda)
  {
    msg.id  = 0x050;
    msg.len = 8;
    msg.buf[0] = 0x00;
    msg.buf[1] = 0xDC;
      msg.buf[2] = highByte(uint16_t((settings.ChargeVsetpoint * settings.Scells ) * 10));
      msg.buf[3] = lowByte(uint16_t((settings.ChargeVsetpoint * settings.Scells ) * 10));

    msg.buf[4] = 0x00;
    if ((settings.ChargeVsetpoint * settings.Scells)*chargecurrent < 3300)
    {
      msg.buf[5] = highByte(uint16_t(((settings.ChargeVsetpoint * settings.Scells) * chargecurrent) / 240));
      msg.buf[6] = highByte(uint16_t(((settings.ChargeVsetpoint * settings.Scells) * chargecurrent) / 240));
    }
    else //15 A AC limit
    {
      msg.buf[5] = 0x00;
      msg.buf[6] = 0x96;
    }
    msg.buf[7] = 0x01; //HV charging
    Can0.write(msg);
  }
}
```


----------



## arber333 (Dec 13, 2010)

See here: 
https://leafdriveblog.wordpress.com/2018/12/28/ampera-charger/

I am currently loaning charger to my friend who is using it to charge his Mazda RX8 at 200Vdc.
Thanks Tom for your sheet, much more engineering like .


----------



## iak78612 (Jan 2, 2017)

TomB and Arber333, 



You guys are AWESOME. You're help is *so* greatly appreciated. Arber333, I was super excited to see your article on the 5kW heater, as well. Please keep up the good work.

I used Damiens board to get my Tesla SDU up and running! Currently, I'm working on charging my Volt Batteries. 

I'm using Socketcan to send the CAN messages below:



While True; do cansend can0 30E#02; sleep .03; done


while true; do cansend can0 304#40A00320; sleep .5; done


I ran candump to confirm the above is being transmitted


CAN ID 212 is returning "212 [6] 00 05 4A 00 F4 00". 



Any idea's what I might be doing wrong? Also, just for context, Im a total noob, so please consider the dumbest possibilities. 



Thanks!


----------



## arber333 (Dec 13, 2010)

Well i couldnt get the Volt heater to work yet i admit. I now have a SW CAN shield for Arduino Due, but i have put this on hold in interest of getting the car out. Later on i will work on heater and A/C compressor some more.

I think your problem may be in nature of charger communication. 

1. every 30ms you have to send heartbeat msg with ID 030E 
data field itself is 03, (charge HV and 12V battery) only a single byte. If you miss that, charger wont function 

2. every 500ms you then send command msg ID 0304 
data field is 4 bytes 40 C8 03 34 to command 10A up to 410Vdc 

Charger has to be connected to 12V battery (not just PSU) as well as HV battery. Then when you send command msg, you hear relay inside click and charger starts in relation of power. If you command 410Vdc and battery is close it will reduce amps to charge at 3kW.

Also you can command say [email protected] charge with data field 40 A0 03 16.

Also beware! There are TWO CAN lines on Volt charger. Maybe for pairing? If you are sending on the wrong channel (pins 10 and 11)charger will ignore you. See my blog for correct pinout.


----------



## iak78612 (Jan 2, 2017)

I saw your question on the other guy's blog, so i figured the 5kW heater is still work in progress. I might be able to mail you a heater if you think your current heater is fried. LMK. 



I triple checked your wiring diagram (and others) to make sure my setup is wired correctly. 



Using candump, I verified that I am sending the proper CAN messages at the correct intervals. I have attached my candump log file in txt format. 



You think my charger may be dead?


Thanks again for your help.


----------



## arber333 (Dec 13, 2010)

Hm, maybe you are confusing charger with 3x different heartbeat msg?
So you have 400Vdc battery connected as well as 12V battery?
I see your charger responding online with status. So enable and interlock lines are connected to 12V.

Try sending only one HB msg
ID 030E 
data 03, at 30ms intervals. Only send msg length of 1 byte, if you have option of selecting.

then asynchronus from that you send your command 
ID 0304
data 40 A0 03 20, at 500ms or 800ms intervals. Set msg length of 4 bytes if you can, otherwise write 00 00 00 00 at the end of data field. 

Try again, it was messing with my head too.
Edited my blog to make it clearer...


----------



## iak78612 (Jan 2, 2017)

Currently, I am connected to the following before sending CAN commands to initiate charging:


120V AC (I tried 240V AC as well). 

12V Battery (no PSU at all). I did previously have a 12V PSU. 

355 Volt Battery. 

CANtact hardware with SocketCAN. 


I tried sending ONLY the 0x30E ID with Data 0 set to 3 in the different combinations you suggested @ 30 ms

I also tried sending the 0x304 ID with the Data you said at 500 and 800 ms. 

Lastly, I tried the different formats for the data bytes. SocketCAN doesn't let you set the DLC to my knowledge. 


If you're out of idea's, I might just buy another charger, and see if my charger is the actual problem. What do you think?


----------



## arber333 (Dec 13, 2010)

iak78612 said:


> Currently, I am connected to the following before sending CAN commands to initiate charging:
> 
> 
> 120V AC (I tried 240V AC as well).
> ...


First try to increase frequency of command msg. I remember i even used 100ms succesfully. 

Well i also used Canalyst II to record CAN communication. However it cant send two nonsynchronised messages. So i programmed Arduino DUE that i got from EVTV. It already has CAN interface and 12V supply and eeprom installed. Software is also from them.

I think you can get it to run with other Arduino chips too. see here is software i used...


----------



## kennybobby (Aug 10, 2012)

Does the CAN protocol require calculation of a CRC checksum that also must be sent as part of the message? 

If you change the voltage or current values then the CRC would also change and need to be recalc' for it to be accepted?


----------



## arber333 (Dec 13, 2010)

kennybobby said:


> Does the CAN protocol require calculation of a CRC checksum that also must be sent as part of the message?
> 
> If you change the voltage or current values then the CRC would also change and need to be recalc' for it to be accepted?


CAN chip has the handshake protocol burned in hardware. There is a lot of traffic going on even before main data is sent. If you connect scope you may be able to see this.


----------



## grizzliz (May 21, 2018)

Tomdb, 
I bought all the parts I could from a crashed Chevy Volt (battery, charger, DC/DC converter) for my electric car conversion, and after several years and a medical procedure, all I have left to do is get my charger and DC/DC converter to work. I'm attempting to use the code you wrote, and I'm having nothing but problems, the first of which is my ignorance of computer code. I have an arduino uno and a chinese CAN shield, and I'm guessing that's part of the problem. Will the code you wrote only work with the CAN due module? It seems I only need to get a couple values transmitted to the charger and DC/DC converter, but I can't get your code to compile. I'm at my wits end, and any help would be greatly appreciated!


----------



## rgjones (Nov 22, 2016)

Does the Volt charger CAN msgs work with the 7.2KW charger that came with the 2019 Volt? 
Is that the same as Bolt perhaps?
Looking for a 6KW+ (Full L2) J1772 single charger for my conversions I can entirely control via CANbus or possibly with some 12V digital IO.
Perhaps Leaf wrecks with 6KW+ chargers are more available.


----------

