Read voltage and other details from HV battery?
#1
Hi,

is there a way to read the raw HV battery voltage, or even individual cell voltages and other details from the HV battery?

Orbit already displays a SoH and SoC percentage, so I assume it might be an adjacent feature.

These diagnostic features would incredibly valuable for independent analysis and repairs on the HV system, e.g. identifying damaged cells.
I'm also curious how Volvo treats the cells, i.e. where it sets the 0% and 100% SoC voltages, and how that differs for the SoC the dashboard shows, what's "actually" left at 0%, etc.

There's very little info about that, and it is hard to judge what it really means for the cell voltages when Orbit shows e.g. 83% SoC while the car shows 100%.

I found this picture, which suggests that at least the pack voltage is available via OBD using a generic OBD dongle:

[Image: 2023-volvo-v90-t8-recharge-plug-in-hybrid.jpg]
https://insideevs.com/photos/918920/2023...-in-hybrid



There's also this Volvo Service Manual (?) that shows the individual cell voltages are available to VIDA



https://static.nhtsa.gov/odi/tsbs/2025/M...0-0001.pdf
Reply
#2
Try these
ECU Tools > BECM > Send CMD > 22 DA 02 - all cell SoC or 22 FD 73 - cell delta voltage

i suspect you'll need to be in a diagnostic session.

Can't test as don't have those electrical things in my car Smile
Reply
#3
(04-17-2026, 08:35 PM)x119 Wrote: Try these
ECU Tools > BECM > Send CMD > 22 DA 02 - all cell SoC or 22 FD 73 - cell delta voltage


Thanks for the hint Smile

I selected "BECM" as the ECU first and then via "Send Cmd" sent "22DA02", with session = 3 and SA level = 00.

This seems promising:
Quote:Command sent to ECU: 22DA02
Response from ECU: 62da02166516631664167716701675167e1677166e16751683166a167716681674166015fa15cf15c115fb15ee15f51609160315c515ef15f715fb1605160215c915ee163c163f16311632163a163616341634162f16371631162e162e1631162f162d16381637163a16391638163916351636163b16311635163d163816351631163415d515cc15ba15c315ca15d915a815af15c615b015c015c415be15ab15e315ee16171615160f161c161916151611160e16161618161d1616161c1618161e160e

I assume it decodes like this:

62da02 is the positive response header and then there's 96x4 characters, so 96 2-byte words, which makes sense, since I have a 2020 PHEV, which has a 6x16S 11.6 kWh battery afaik.

E.g. cell 1 would be 1665 hex = 5733 dec or 57.33% SoC, which seem roughly right, since the car shows 60% SoC for the HV battery.

The remaining cells are between 

Min: cell 71 = 55.44%
Max: cell 11 = 57.63%
Average: 56.59%

So this is interesting data, but I'd still like to get raw voltage values.

The other command gets me this response:

Quote:Command sent to ECU: 22FD73
Response from ECU: 62fd730010

or sometimes 62fd73000e
So again a positive response header "62fd73" and then 0010 or 000e, but that just means "16" or "14" in decimal, so...  Undecided
Reply
#4
Ok, I found these using the Orbit Parameter Monitor

[Image: image.png]

Orbit displays 4856 as ~353V in the parameter monitor, and it drops by ~2V if I put some strain on the electric motor.  Smile

353V divided by 96 cells = 3.677V per cell, which seems reasonable at the current ~55% SoC displayed in the car.

If I query it using Send Cmd, I get

Quote:Command sent to ECU: 224856
Response from ECU: 6248560b30

Not entirely sure how to decode this.
Closest I can get to is assuming I have to divide by 8. 0b30 hex is 2864 dec. 2864/8 would be 358V.

Not far off 353V, but a bit too much to ignore it...

How does Orbit calculate the voltage value from what the car sends? Is there some ADC reference correction thing taken into account, or is there some more crooked factor instead of 1/8?
Reply
#5
I fully charged my car and collected a few more values:

PHP Code:
+------+---------+---------------------------+
RAW  Orbit   | (hex->dec)/8              |
+------+---------+---------------------------+
0c46 387.48  392.75                    |
0c45 387.35  392.625                   |
0c44 387.23  392.5                     |
| ...
  | ...     | ...                       |
0b30 353.29  358.0                     |
+------+---------+---------------------------+ 

So fitting a line to that to that it seems Orbit calculates the voltage as

PHP Code:
Voltage = (0.12395 x raw-value) - 1.02 


which seems a bit arbitrary

Assuming 392.75 V (0c46 / 8) is the "true" voltage that would mean the pack has stopped charging at an avg. 4.091 V/cell, which would make sense if it stops charging at a nice and round 4.1 V/cell for the highest voltage cell.

Assuming 387.48 V (Orbits displayed value) is the "true" voltage that would mean the pack has stopped charging at an avg, 4.036 V/cell, which seems a bit low.
Reply
#6
Hey kbauer let me see if I can help you sort things out. First I want to clear some things up, you may already know but for others following along it may be helpful, then I will get into this specific case. It might be long reading. Skip over what you like. BTW I enjoy this type of question! It shows the capability of OrBit that is just below the surface of "click a button"...we may not have a specific button for something, but there is much more you can do that is already there.

In general the answer to "is there a way to read the..." is YES. We are always using data read from the car in the various displays and dialogs, service procedures etc. To make a new display, we would code it in as an enhancement or as part of a feature. But outside of what is there in a display like the HV batt SoC and SoH on the main Shortcuts tab for example, there is an entire generic system for reading module data driven by a catalog of module information. You found it already, just to the right of the Send Cmd and just above the Parameters Monitor...the list of Data IDs (DIDs) you can read, from the currently selected module in the Active Diag ECU dropdown, is shown there, you can click any one and read from the car. Parameters monitor is a further enhancement to fill the need when you want to monitor and display some of that same DID data over time, rather than just read it once.


The displayed data is translated from raw data with Volvo info. When we read the data, the raw result is translated through the module information that we have to display the result. That includes field names, units used and the factor information to do the math or bit shifting, if the input data is a float or integer etc. This information is ultimately sourced from Volvo. We wouldn't have any other way to know it. some data fields may be obvious to translate to a readable result and guess the units used, and others can be quite complicated. We will come back to your specific case.


The source data comes from the car. Maybe everybody knows this and it's my personal issues since I make OrBit ;-) I just like to call it out when I see example "battery charge is 100% in the car and OrBit displays 83%". It's true, but we just display what the car is reporting from the DID we read. Hopefully the correct DID, in this case when I added that display I chose the DID 4028 from the BECM "Vehicle Battery State of Charge - Estimated" if you are curious. I chose that because that DID 4028 is a common one to battery SoC data across modules in the car. It did turn out, that field displays the "actual SoC" not the SoC that is displayed via the battery meter in the car. As you probably know those are different things in the car, te hybrid battery is managed between a limited min and max SoC that it uses for charging and discharging to preserve the service life of the battery. I've not found any data to read to see what that is for a particular car, that may not exist. From observation of my Extended Range T8 PHEV, the range of "empty" and "full" by the dash display is between 15% and 95% SoC in the HV battery, in my car. If the SoC displayed is 83%, that is what the car reports. 


Could the data displayed in OrBit be wrong? Yes it can...if we don't have the correct module information. What we have is extensive but not complete. We may not have every specific part number module info. In those cases OrBit goes through a background process to find the closest match and load that module data. Most cases that process works out fine. Very few data fields vary over module variants, the results calculation, units, labels etc. are usually very consistent. If there is a discrepancy we have found and handled a few cases, by refining the process of loading the closest match of module data, or sometimes we are able to get new data for new module parts and I add it to the catalog OrBit loads from. If you have a case where you think it's "wrong" data, we would make an investigation into the specific case, the data field, your specific car, what specific module you have like the particular BECM part number etc. We would take that as a support case and look into it, and we have an interest in it if it would solve a case for many other cars, if there is an actual problem. We must also consider there can always be a bug as well, where some data forumla is not processed correctly. 


The above does happen, but most cases, there is no problem if you just "think" some data read should be something else. You have to consider, maybe you are not reading the correct data field? Maybe things don't work exactly how you think they work? I find there are multiple DIDs for many things, actual voltage, adjusted voltage, estimated, it may not be obvious what is the correct data to read for what you want to know. This is the level that DID reading is at, we have all of the module information so you can read things, but it may require some learning or observation to find what you want to know. 


Finally, Send Cmd is not the best tool here. There is no sense in sending raw commands to read a DID you can read via clicking on the DID field in the list. OrBit even reports the raw hex return in the DID result window so you can see it. Send Cmd is an experts tool, if you know what you are doing and you want to send some UDS command, it's there and you are welcome to use it, translating any results is up to you.


Now lets look at your case (if you have not fallen asleep by now!)....

As far as the data you read, to find what you want to know, best way is scroll the DID list, or narrow it down by search. X119 may have led you astray by suggesting some random DIDs ;-) There is a filter above the list, you can free-text search and filter the list to find what might be useful. I have a 2022 S60 T8 (extended range) and I have a different BECM for sure on the newer battery. But the fields are all very similar or the same. I don't have an FD73 available, but on some older BECMs I check and it's "Cell Delta Voltage". I have a Cell Delta Voltage that is DID DD10 on my BECM model. For me it returns "0". I think we can guess what delta voltage is...and that doesn't seem related to what you want to know. 

   

The other data field you read is 4856 which is available on my BECM as well, with a slightly different label "HV Bat Pos Breaking Element A". Lets address the formula, I looked it up in the module info (and also confirmed it's the same in all BECM cases we have info for). It is "X/8.10891". Given that formula the math is correct in OrBit:

0x0c46 = 3142
3142/8.10891 = 387.475012055
result 387.48V 
(NOTE: this may not be totally correct in that the result should actually be 387V, there is a 'result precision' field that we currently don't deal with, but we will in the future)

So it looks like the voltage readout is correct. That does seem arbitrary formula for sure, but it's what we got from Volvo, this is how they did it. Who are we to question it? ;-)

The next question here is... is this the data you want to know? If you know that the "breaking element A voltage" is exactly what you want to know, then that should do. I don't even know what the "breaking element" is. I would look through the DIDs for a different DID. I easily find 4803 - HV Battery Pack Voltage, that seems like it would be the one. I am not sure that is available on all of the BECMs by the data we have. But FYI both the "breaking voltage" and the "pack voltage" return the same result (418V) on my car. The data scaling formula is actually different on those, so it confirms we are handling the result correctly, as the final result matches. 

I don't think you can make any conclusions about it by just change the math until it matches what you like ;-) We should find where you can read the cell voltages.

I find a DID 4806 - All Cell Voltages to read out individual cell voltages. As you note, looks like they are all around 4.1V or just under. 

   

If you don't find the cell voltages available in a DID listed that you can find (and I think the "default" BECM module info does not have one if OrBit doesn't load up a better match of module data for your BECM) then send a message into support. I will look at your case specifically, we can do some things to figure out if the data is available, confirm how to read it and process the result, and make it available for all cars with the same BECM part.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)