Prius PHEV TechInfo
|Click show for a short list of the current PHEV conversion and kit options for the Toyota Prius.|
- 1 Generations
- 2 Traction battery
- 3 CAN bus
- 4 Causes for errors
- 5 MFD (Multi Function Display)
- 6 12 V system
- 7 Limit to continuous EV operation
This is the original 4-door sedan:
- 1997 Japan only release, chassis NHW10 (Gen 1, referred to as Mk1 in Australia and the UK, where it has occasionally been privately imported)
- 2000 worldwide release, chassis NHW11 (Almost always called Gen 1 in North America, sometimes Gen 2)
This is the 5-door hatchback, often called Gen 2, sometimes called Gen 3:
- 2003 release in selected countries (as model year 2004), chassis NHW20.
This is the new 5-door hatchback, more angular body, usually called Gen 3:
- 2009 release as model year 2010, chassis ZVW30.
- Mass: 83 lb (37.5 kg)
- Dimensions: 33 x 15 x 7.5"
- Nominal Voltage: 201.6 V
- Nominal Capacity : 6.5Ah
- Module weight: 1040 g
- Module Form Factor: Prismatic
- No of Modules: 28
- Total no of Cells: 168
- Module specs: http://www.peve.jp/e/hevjyusi.html
The traction battery includes a Battery ECU (Electronic Control Unit). As the Battery Management System (BMS), this unit does the following:
- It calculates the battery's SOC by integrating the current ("Coulomb counting"). This value is corrected for State Of Charge Drift, self-discharge when the vehicle is not running, etc, by skewing the SOC upward when the open circuit battery voltage surpasses approx. 242V, and, presumably, by skewing it downward when the open circuit voltage is below an as-yet-unmeasured value.
- It reads the pack temperature using 3 thermistors, and the air intake temperature with a 4th thermistor
- It controls its cooling fan (variable speed).
- It calculates the battery dynamic resistance (delta voltage over delta current). This resistance increases with battery aging.
- It protects the battery by limiting its current (even down to 0), if the SOC or temperature are at their limits, or the dynamic resistance is too high, or if it detects a fault.
- It broadcasts to the rest of the vehicle, through the CAN bus, the following data:
- Current (positive for discharge, negative for charge)
- Minimum & maximum temperature
- Maximum current it's able to provide (Discharge Current Limit, or DCL)
- Maximum current it's able to accept (Charge Current Limit, or CCL)
- State Of Charge (SOC)
- Any fault codes (DTCs)
If you replace the stock battery, you need to know its voltage, because that's what the vehicle expects. If you add a pack to the stock battery, you need to know its voltage, in order to connect the two together, somehow.
The nominal pack voltage is: 168 cells x 1.2 V = 201.6 V
The pack voltage depends on SOC, temperature and current.
- The voltage depends on State of Charge and on temperature. It is affected by cold, but not much by heat; so, for temperatures abiove 20 C, use the 20 C curve.
- The voltage depends on State of Charge and on discharge current. The voltage is not affected by low currents; so, for current below 1.3 A, use the 1.3 A curve.
- The maximum charge voltage is 1.8 V / cell.
|Therefore, roughly, the estimate pack voltage range is:|
|Max brake||No current||Max drive|
|>=20 C, 0% DOD||302 V||237 V||168 V|
|-10 C, 80 % DOD||302 V||160 V||126 V|
|So, the estimated overall voltage range is:|
|126 V||202 V||302 V|
Though, Hybrid Interfaces reports a range of 165 to 270V, while Toyota specifies a normal range of 150 to 300 V (in READY mode) (Ref: "\Repair Manual\04priusf\05\21bpm\cidlitac.pdf"). However, Toyota's "normal" ranges, as reported in their repair manuals, are often misleading; either they are too generous, or the conditions under which they can be expected are not clearly stated.
See also Toyota Prius Battery Specs
The battery current ranges from > -100 to > + 100.
These graphs are from data from Argonne National Labs: 600610092_Data_D3.txt. In these data, positive means into the battery (braking).
During easy driving, the current is on the order of 20 A, but is more like 40 A during serious driving.
Battery heat dissipation
The battery power dissipation (assuming an internal resistance of 0.5 Ohm) peaks at 4.5 kW!
During easy driving, the dissipation is on the order of 200 W, but is more like 2000 W during serious driving.
AC components in battery voltage
When the system relays are off, the battery floats with respect to the car chassis.
When the system relays are engaged, there is a common AC voltage between the battery terminals and the chassis. Its frequency is 5 KHz. When the engine is charging, its amplitude is 90 Vpp and its shape is a square wave. In EV drive, its amplitude is 100 Vpp and its shape is a combination of 2 square waves, each at 5 KHz, but not synchronized, so that one drifts with respect to the other one. The differential mode voltage is 200 Vdc (or course) plus noise spikes at the edges of the common mode wave, on the order of 10 Vpp.
A PHEV conversion must deal with this significant common noise.
Reconnecting traction battery
- While working on the High Voltage section, ensure that the READY light is off and then remove the orange Service Plug on left end of the battery pack
- If you attempt to turn on the car while the orange Service Plug is removed, or the Battery ECU is disconnected, the Prius will generate a fault code (DTC) and light-up the /!\ (Red Exclamation in a Triangle) symbol on the dashboard, and show a car with an Exclamation point in it on the Multi-Function Display (MFD).
- To end the fault display
- Turn off the car (READY light OFF)
- Reconnect whatever is disconnected
- Turn on the car
- Turn off the car
- Now the DTC is still stored, but at least there is no fault display on the dashboard.
Cabling to traction battery
The harness to the traction battery has 3 tails, each with a connector
- To Battery ECU - power, communication, fan control
- To the orange Service Plug - to detect if the Service Plug is fully plugged-in
- To the System Relays - to drive the relays that connect the traction battery to the inverter
Battery ECU (electronic Control Unit)
- Gnd - to chassis
- AM - 12 V, always on, for memory retention
- IGCT - 12 V when the car is in the "READY" mode
- IG - 12 V when ignition is on
- CANH - CAN bus High
- CANL - CAN bus Low
- VM - monitors fan voltage, 2 to 12 V
- SI - variable duty cycle (PWM) square wave to control fan speed
- FCTL1 - drives the relay which in turn powers the fan
Service Plug disconnect/connect sensor.
A simple reed switch, which is integrated into the 2004-up Prius service plug, is opened during the service plug removal sequence, just BEFORE the service plug opens the battery circuit. Upon re-installation, the switch is closed (shorted) just AFTER the service plug completes the circuit. Two pins connect the reed switch to the battery ECU. The purpose of this switch is to tell the battery ECU that the service plug is being removed, so that the system main relays can be opened prior to disconnecting the battery in the event that the service plug is inadvertently being removed while the system is in READY mode. Toyota warns that the HV ECU can be damaged if the power switch is engaged with the service plug disconnected.
NOTE: If the service plug in not firmly pushed down after insertion, the switch will not close, the system will not ready up, and a DTC will be set. This is a common oversight.
The service plug disconnect/connect sensor is a failsafe that prevents arcing at the service plug. It is not present on the service plug used in 1997-2003 Prius vehicles, but is integrated into the receptacle for the plug.
- System relay K1 (precharge resistor)
- System relay K2 (traction pack +, bypassing precharge resistor)
- System relay K3 (traction pack -)
Toyota refers to this assembly as an SMR (System Main Relay). In truth, there are three separate System Main Relays, housed in the drivers' side end of the battery pack enclosure:
- a precharge relay in series with a precharge resistor
- 2 contactors, one on the positive circuit and one on the negative circuit.
The system relays (contactors) are turned on in this sequence:
At power up:
- The precharge relay is turned on first by itself (which results in no current, because there is no return path), and then turned off. This function checks for a stuck relay on the negative side. If that relay was stuck, current would be present. The HV ECU would then record a DTC before shutting itself down. The DTC would have to be cleared and the problem corrected before the vehicle will re-enter READY status.
- After a pause, the precharge relay and the negative contactors are turned on, to precharge the electronics in the vehicle slowly, through the system resistor.
- Then the positive contactor is turned on, to complete a direct path between the battery and the vehicle electronics.
- Then the precharge relay is turned off.
At power down:
- The positive contactor is turned off, removing power to the vehicle electronics. This is the only time when arcing may occur. Arcing on its contacts will affect its lifetime.
- Then the negative contactor is turned off.
There is a hump in the waveforms, as the voltage goes from 10 V to 12 V. This is probably due to the DC-DC converter (from the traction battery voltage to the 12 V battery) being on.
If the conversion will replace the stock Battery ECU, it must talk directly with the vehicle CAN bus.
The battery ECU is the last device on the CAN bus, and thus has one of the 2 termination resistors. The termination resistor in the stock ECU is 120 ohm split-termination (meaning there are 2 60 ohm resistors in series, with a small capacitor from the middle of the 2 resistors to ground.) Toyota also uses a common mode choke on the CAN bus for filtering.
- CAN-View - uses the vehicle's MFD (Multi Function Display). V1, V2, and V3 are only compatible with the 2004 and 2005 Prius. A new V4 will be compatible with the 2006+ Prius and perhaps other hybrid models.
- A generic adapter between the CAN-bus and a PC. It is convenient to use a USB port, though the serial or parallel or Ethernet port may be used as well. Examples of USB adapters:
- Peak's PCAN-USB also sold as the GridConnect's GC-CAN-USB
- Note: disconnecting this product's USB cable seems to create significant problems for Windows XP (immediate shut-down, or even the "blue screen of death"). You must use the system tray's "Remove hardware" icon first.
- The PCAN-View software comes free with this product. In theory, it can filter a range of message IDs. In reality, that doesn't work so well if you're filtering more than one ID. However, you can run multiple instances of PCAN-View, each using a different filter, one for each message that interests you.
- They charge extra for a logger. You can use a free logger instead:
- Grifo's CANUSB
- Systec's USB-CANmodul
- CAN232 is a CAN to RS232 device used by Attila Vass with his early My CAN Project.
- Communications with CAN232 via a terminal application:
- send "V" command. You'll see "V1220" version info received.
- send "N" command. You'll see "NB743" serial number.
- send "X1" command to enable AutoPoll function.
- send "S6" command to set 500 kbps CAN speed.
- send "O" command to open the CAN port. You'll see a lot of CAN messages.
- Communications with CAN232 via a terminal application:
- The CAN-View should not be confused with this CANview product (notice no dash in the name), which is a CAN to RS232 device.
- Peak's PCAN-USB also sold as the GridConnect's GC-CAN-USB
- These adapters have a DE-9 DSUB connector, so you'll also need an adapter to the Prius' OBD connector. For example:
- The Prius' OBD (On Board Diagnostics) connector is located under the dashboard, below and to the right of the steering wheel, facing down. A.k.a.: Data Link Connector 3 (DLC3)
- Alternatively, tap into the CAN bus directly. Use a short cable to the CAN adapter.
- CANH - black wire
- CANL - white wire
- GND - chassis
CAN bus protocol
- The CAN bus is active only when the vehicle is in READY mode, and for a few seconds after the end of the READY mode.
- baud rate: 500 kbits/s (if you use the wrong rate, the vehicle will complain and store a DTC fault until the DTC codes are cleared)
- Standard: CAN 2.0A ("standard CAN", 11-bit identifier)
- Remote frames: not used
- this means all the data are volunteered and none are requested; that is, that every component on the vehicle broadcasts its data periodically; no component puts out requests for data
All CAN messages
Battery ECU messages
The Battery ECU (Electronic Control Unit) broadcasts messages to the rest of the vehicle through the CAN bus.
It appears that broadcasting those messages is all the Battery ECU is expected to do. It appears that this ECU only needs to talk, and doesn't need to listen. That is, it doesn't appear that it is expected to do anything about any messages that are placed on the bus by other devices.
The battery ECU is able to protect itself by stating the maximum current it may accept or may provide. It may also protect itself by generating a Fault Code (DTC). In either case, the battery module is at the mercy of the rest of the vehicle to respect those requests and not draw or source too much current. Thanks to Jim Fell for coming up with the checksum algorithm first.
The following data were seen in a 2006 Prius.
The Battery ECU (Electronic Control Unit) broadcasts the following messages. In this table, numbers in parentesis (#) refer to the notes just below the table.
|byte 0||byte 1||byte 2||byte 3||byte 4||byte 5||byte 6||byte 7|
|03Bh||8||5||Current (2)||Voltage (3)||ChkSum (4)|
|3C9h||100||8||Y (14)||Z (15)||X (12)||X (12)||X (12)||X (12)||ChkSum (4)|
|3CBh||100||7||CDL (5)||CCL (6)||Delta SOC? (11)||SOC (7)||temp1 (8)||temp2 (9)||ChkSum (4)|
|3CDh||100||5||fault code (10)||Voltage (3)||ChkSum (4)|
|4D1h||1060||8||X (13)||X (13)||X (13)||X (13)||X (13)||X (13)||X (13)||X (13)|
- h = hex value; d = decimal value; b = binary value;
- A.V.: Attila Vaas (Attila Vass) believes...; D'de: Davide (Hybrids-Plus) believes...
1) How often this message is repeated
2) Pack current: 12-bit, signed (>0 = discharge, <0 = charge) [0.1 A], -256 to 254 A. Examples:
- 0F80h = -128d = charging at 12.8 Amps
- 0000h = 0d= no pack current
- 0080h = 128d = discharging at 12.8 Amps
3) Pack voltage: 16-bit, unsigned [V], 0 to 510 V. Note that 2 different messages have this data, though the 2 values can be off by 1 LSB. Examples:
- 00DCh = 220d = 220 Volts
- 0100h = 256d = 256 Volts
4) CheckSum: used to check for errors in the data. [Details] (xls) Calculated as follows:
- Add the message ID (low byte plus high byte), the individual data bytes (other than the check-sum itself) and the number of data bytes
- Take the mod 256 of that (that is, drop the high byte)
5) Maximum discharging current that the pack can handle: 8-bit unsigned, [A]. A.k.a.: CDL (Current Discharge Limit). From that and the pack voltage, the maximum dicharging power (WOUT) is calculated and reported in the Diagnostics Tool (Typically <= 21 kW). The battery reduces this value at cold temperatures (at around 5 C it is down to around 60A) and low SOC. Range seen: 46 to 105 Example:
- 69h = 105d = 105 Amps -> 21 kW @ 200 V
6) Maximum charging current that the pack can handle: 8-bit unsigned, [A]. A.k.a.: CCL (Current Charge Limit). From that and the pack voltage, the maximum charging power (WIN) is calculated and reported in the Diagnostics Tool (Typically <= 25 kW). The battery reduces this value at high SOC. Example:
- 7Ah = 122d = 122 Amps -> 24.4 kW @ 200 V. Range seen: 0 to 125 A, normally 115 A.
7) State of Charge: 8-bit, unsigned [0.5%]. Examples:
- 4Fh = 79d = 39.5 % full (stopped, this is when the motor turns on to start charging the pack)
- 64h = 100d = 50 % full (stopped, this is when the motor turns off after charging the pack)
- B4h = 180d = 90 % full
8) A.V.: Lowest temperature reading of any sensor.
D'de: Average temperature of the 3 sensors inside the battery. 8-bit signed, [?C] Example:
- 18h = 26d = 26 ?C
9) A.V.: Highest temperature reading of any sensor.
D'de: Temperature of the air intake. 8-bit signed, [?C]. Reads the same or *lower* than Temp 1, by 0 to 5 ?C. Example:
- FEh = -2d = -2 ?C
10) Fault Code (DTC = Diagnostic Trouble Code): 16-bit. The 2 Most Significant bits are the type of code (see below). The other 14 bits are the code. See table below for Fault codes. Examples:
- 0560h = 0000 0101 0110 0000b = DTC P0560 = No voltage at the "AM" contact
- 3056h = 0011 0000 0101 0110b = DTC P3056 = Problem with the battery current sensor
- C100h = 1100 0001 0000 0000b = DTC U0100 = No Communication with the Engine Control Module
11) Delta in State of Charge: 8-bit, unsigned [0.5%]. Difference between SOC of most charged block and SOC of least charged block. This is just a guess. Examples:
- 00h = 0d = 0 % = all block are equally charged
- 0Ah = 10d = 5 % = the most charged bloc's SOC is 5 % higher than the least charged block
12) Unknown data. (A.V.: related to release date ?) Typical values:
- 02 75 02 FA (Attila Vass)
- 02 99 03 1F (GEO car)
- 02 9A 03 21 (RG car)
13) Unknown, unchanging data. (A.V.: Batt -> HECU) Typical values:
- 11 00 01 02 00 00 00 00 (D'de)
- 11 00 01 00 00 00 00 00 (A.V.)
14) Reading (of what?) used only during calibration(?) at power up. 12 bits. Normally 3FFh. During calibration, about 1/2 scale (0180h). Typical values:
- 03 FF 01 (RG car, GEO car)
- 03 FF 05 (GEO car)
- 01 87 21 (GEO car)
- 03 FF 21 (GEO car, RG car, A.V.)
- 00 08 25 (RG car) at power-up
- 01 1D 25 (RG car) at power-up
- 01 1E 25 (RG car) at power-up
- 01 2A 25 (GEO car)
- 01 2B 25 (GEO car)
- 01 2C 25 (GEO car)
- 01 72 25 (GEO car)
- 01 D1 25 (GEO car)
- 01 D2 25 (GEO car)
- 03 FF 25 (GEO car)
- 03 FF 25 (GEO car)
- 03 FF 25 (GEO car)
- 03 FF 25 (RG car)
- 01 7D 27 (RG car) when engine first comes on
- 01 84 27 (RG car) when engine first comes on
- 01 D4 27 (GEO car)
- 03 FF 29 (GEO car)
15) Probably flags. Related to the calibration bytes above. Typical sequence of values:
- Power-up: 25h (0101b)
- After engine comes on, after a few seconds: 27h (0111b), during which time the 1st 2 bytes are something other than 3FFh.
- Engine still running, after a few seconds: 21h (0001b), and 1st 2 bytes go back to 3FFh
- Power down: 01h
Other values seen: 05, 29
It appears that the battery pack also sends the following data, though it's unclear in which messages:
|VMF FAN VOLTAGE||Battery blower motor voltage
Min.: 0 V, Max.: 25.4 V
|Actuation condition of battery blower motor|
|COOLING FAN SPD||Battery blower motor drive mode
Min.: 0, Max.: 6
Low to high speed actuation: 1 to 6
|ECU CTRL MODE||ECU control mode
Min.: 0, Max.: 4
|Operating condition of HV battery|
|SBLW RQST||Battery blower motor stop control request
|Presence of stop control request to battery|
|V1 to V14 BATT BLOCK||Battery block voltage
Min.: –327.68 V, Max.: 327.67 V
|Voltage variance among battery blocks|
Altering the SOC (SOC spoofing)
The OEM battery broadcasts a message on the CAN bus approximately every 100ms which includes the SOC. It has been discovered that the Prius's HV ECU listens to the last message received. Simply rebroadcasting that message immediately after it was originally sent with an altered value for the SOC (and altered checksum), causes the car to believe that the SOC is the altered value without intercepting the original message. This allows a conversion to spoof the SOC in a low cost and simple method which does not require altering the OEM battery's ECU or taps. The agent doing the rebroadcasting can be a computer with a device such as CANUSB or a small embedded system with a CAN interface.
Any system which uses SOC spoofing must be careful not to over discharge or overcharge the OEM battery.
CCL and CDL
The battery reports Charge and Discharge Current Limits depending on the SOC and the temperature. Based on very rough data, these graphs show their relationship.
- Note that the Discharge limit remains high even if the SOC is very low.
- The data were taken at a SOC range from 27 to 78 %, and a temperature range from 42 to 56 °C
- The data were taken just at the upper end of the temperatures. We still need data for the colder temperatures.
Current Charge Limit (CCL) [A] versus SOC [%] at various temperatures [°C]
Current Discharge Limit (CDL) [A] versus temperature [°C]
OBD-II Diagnostic Trouble Codes (DTCs)
The Battery ECU detects and reports many fault conditions.
- The Battery ECU places a Fault Code (DTC) in its message with an ID of 3CDh
- The Engine ECU receives such DTCs (from the Battery ECU and from other devices as well)
- The Engine ECU lights the Malfunction Indicator Lamp (MIL) (a.k.a. "Check Engine Lamp") on the dashboard. (In some cases it does so immediately, in some cases after it receives the same DTC twice.)
Fault codes begin with one of four letters, depending of the 2 Most Significant bits (MSb) of the hex code:
- Ltr MSBs
- P 00 Powertrain: Most faults start with this letter
- C 01 Chassis: steering, brakes, other chassis systems. Faults in the transmission control ECU or electric power steering system
- B 10 Body: Smart entry and Immobilizer malfunction. The only DTCs are B1294 and B2799
- U 11 Network: Faults in the CAN network as well as any other networks (The Hybrid Control System cannot communicate with other components on the CAN bus0
All OBD-II diagnostic codes have five digits.
The first digit in an OBD-II DTC is always a letter, narrowing the fault to one of four different sections of the on-board diagnostic system: a P for powertrain, B for body, C for chassis, or U for network. At present, no other letters are used.
The second digit will be a number; SAE-defined codes, known as generic codes, are identified by a 0 (as above), 2, or 3. Manufacturer-specific codes, which are not defined by SAE, must use a 1 for the second digit. They can mean anything within the system defined by the first digit of the DTC.
When a Prius sets a DTC, it also sets a proprietary three-digit diagnostic code that sometimes gives a bit more information. This is typically accessed with a factory scanner.
Common DTC codes that may be set during a conversion:
|P0AA6||High Voltage isolation fault - current is detected flowing from the HV system to the chassis of the car||(3)|
|P0AC0||Current Sensor fault|
HV Battery Diagnostic Trouble Codes (DTCs)
The battery ECU may generate the following Fault Codes (DTCs = Diagnostic Trouble Codes).
|P0560||There's no voltage at the "AM" contact of the battery ECU (it should be 12 V at all times)||(1)|
|P0A1F||Battery ECU is bad (many possible symptoms)||(2)|
|P0A7F||One of the blocks in the battery pack has deteriorated: its dynamic resistance is too high||(1)|
|P0A80||The difference in voltage between 2 of the blocks in the battery pack is too high||(1)|
|The fan cooling the battery pack has problems (motor voltage or expected battery temperature)||(1)|
|P0A95||Battery pack's fuse is blown (the Service Plug is still plugged in)||(3)|
|P0A9B||One of the temperature sensors in the battery pack is opened or shorted||(1)|
|P0AAC||The temperature sensors in the air intake is opened or shorted||(1)|
|P30xx||Battery block xx - 10 is weak||(2)(4)|
|P3030||One or more of the wires between the Battery ECU and the battery blocks is disconnected||(1)|
|P3056||There's a problem with the battery current sensor||(1)|
- Behavior: lets the vehicle go into the READY mode and drive normally
- Behavior: lets the vehicle go into the READY mode but limits driving to fail-safe mode
- Behavior: if the engine happened to be on at the time, the vehicle remains in the READY mode and continues driving with just the engine; if the engine happened to be off at the time, without a battery it can't be started, so the vehicle turns off the READY mode and stops
- There are 14 blocks in the battery pack (1 through 14); the last 2 digits of the code are the equal to the number of the bad block plus 10; so, if block 1 is bad, the code is P3011, if block 12 is bad, the code is P3022
The battery responds to the following PIDs.
|Function||REQUEST (e.g.: from ScanGauge)||RESPONSE (from battery)|
|PID||ScanGauge||Name||ID||Len||Data (1)||ID||Len||Data||Units / notes|
|00||-||PID map||07E3h||8||02 21 00 xx xx xx xx xx||07EBh||8||06 61 00 98 18 80 13 00||Specifies which PIDs exist in this block|
|01||-,-,-,-||?,?,?,?||07E3h||8||02 21 01 xx xx xx xx xx||07EBh||8||06 61 01 aa bb cc dd 00||aa = 00h (?), bb = 04h (?), cc = 00h (?), dd = 00h (?) A. Vass: MIL STATUS|
|04||-||?||07E3h||8||02 21 04 xx xx xx xx xx||07EBh||8||03 61 04 aa xx xx xx xx||aa = 00h (?)|
|05||-,-,-,-||?,?,?,?||07E3h||8||02 21 05 xx xx xx xx xx||07EBh||8||03 61 05 aa 00 00 00 00||aa = 76h (?)|
|0C||-,-||?,?||07E3h||8||02 21 0C xx xx xx xx xx||07EBh||8||04 61 0C aa bb 00 00 00||aa = 00h (?), bb = 00h (?)|
|0D||-,-,-,-||?,?,?,?||07E3h||8||02 21 0D xx xx xx xx xx||07EBh||8||03 61 0D aa 00 00 00 00||aa = 00h (?)|
|11||-||?||07E3h||8||02 21 11 xx xx xx xx xx||07EBh||8||03 61 11 aa 00 00 00 00||aa = 23h (1Eh to 28h, varies w/RPM?)|
|1C||-||?||07E3h||8||02 21 1C xx xx xx xx xx||07EBh||8||03 61 1C aa 00 00 00 00||aa = 01h (?)|
|1F||-,-||?,?||07E3h||8||02 21 1F xx xx xx xx xx||07EBh||8||04 61 1F tt tt 00 00 00||tttt = total time engine has been on since power-up [s]|
|20||-||PID map||07E3h||8||02 21 20 xx xx xx xx xx||07EBh||8||06 61 20 80 01 80 01 00||Specifies which PIDs exist in this block|
|21||-,-||?,?||07E3h||8||02 21 21 xx xx xx xx xx||07EBh||8||04 61 21 aa bb 00 00 00||aa = 00h (?), bb = 00h (?) A. Vass: Drive Mileage|
|30||-||?||07E3h||8||02 21 30 xx xx xx xx xx||07EBh||8||03 61 30 aa 00 00 00 00||aa = 07h (?)|
|31||-,-||?,?||07E3h||8||02 21 31 xx xx xx xx xx||07EBh||8||04 61 31 aa bb 00 00 00||aa = 00h (?), bb = 20h (?)|
|40||-||PID map||07E3h||8||02 21 40 xx xx xx xx xx||07EBh||8||06 61 40 C0 0C 00 01 00||Specifies which PIDs exist in this block|
|41||-,-,-,-||?,?,?,?||07E3h||8||02 21 41 xx xx xx xx xx||07EBh||8||06 61 41 aa bb cc dd 00||aa = 00h (?), bb = 04h (?), cc = 00h (?), dd = 00h (?)|
|42||-,-||?,?||07E3h||8||02 21 42 xx xx xx xx xx||07EBh||8||04 61 42 aa bb 00 00 00||aa = 37h (?), bb = 1Eh (?)|
|4D||-,-||?,?||07E3h||8||02 21 4D xx xx xx xx xx||07EBh||8||04 61 4D aa bb 00 00 00||aa = 00h (?), bb = 00h (?)|
|4E||-,-||?,?||07E3h||8||02 21 4E xx xx xx xx xx||07EBh||8||04 61 4E aa bb 00 00 00||aa = 00h (?), bb = FBh, FCh (temperature?)|
|60||-||PID map||07E3h||8||02 21 60 xx xx xx xx xx||07EBh||8||06 61 60 C0 0C 00 01 00||Specifies which PIDs exist in this block|
|61||-||?||07E3h||8||03 21 61 xx xx xx xx xx||07EBh||8||06 61 aa bb cc dd 13 ee||aa = 00 (?), bb = 98 (?), cc = 18 (?), dd = 80 (?), ee = 13 (?),|
|62||-||?||07E3h||8||02 21 62 xx xx xx xx xx||07EBh||8||?? 61 62 ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
|6D||-||?||07E3h||8||02 21 6D xx xx xx xx xx||07EBh||8||?? 61 6D ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
|6E||-||?||07E3h||8||02 21 6E xx xx xx xx xx||07EBh||8||?? 61 6E ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
|80||-||PID map||07E3h||8||02 21 80 xx xx xx xx xx||07EBh||8||06 61 80 00 00 00 01 00||Specifies which PIDs exist in this block|
|A0||-||PID map||07E3h||8||02 21 A0 xx xx xx xx xx||07EBh||8||06 61 A0 00 00 00 01 00||Specifies which PIDs exist in this block|
|C0||-||PID map||07E3h||8||02 21 C0 xx xx xx xx xx||07EBh||8||06 61 C0 00 07 00 01 00||Specifies which PIDs exist in this block|
|CD||-||?||07E3h||8||02 21 CD xx xx xx xx xx||07EBh||8||?? 61 CD ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
|CE||SOC,-,-||SOC, Current,?||07E3h||8||02 21 CE xx xx xx xx xx||07EBh||8||10 21 61 CE ss cc cc zz||ss = SOC [0.5%], cccc = current [10 mA + 8000h] >8000h out of battery, zz = 86h, 85h (?)|
|CF||-,-,-,-||?,?,?,?||07E3h||8||02 21 CF xx xx xx xx xx||07EBh||8||10 12 61 CF aa bb cc dd||aa = 7Fh, 86h (?), bb = 07h,7Ch/89h/96h/A4/B0/BD/C9/D6 (some temperature?) , cc = 80h (?), dd= C6h & C7h normally, C2h at power down, BF & BE at power-up (?) A. Vass: Delta SOC, Batt temperatures|
|D0||-,-,-,-||?,?,?,?||07E3h||8||02 21 D0 xx xx xx xx xx||07EBh||8||10 1F 61 D0 aa bb cc dd||aa = 0Eh (?), bb = 00h (?), cc = 00h (?), dd = 00h (?) A. Vass: Battery module voltages and internal resistance calcs|
|E0||-||PID map||07E3h||8||02 21 E0 xx xx xx xx xx||07EBh||8||06 61 E0 C0 00 00 00 00||Specifies which PIDs exist in this block|
|E1||-,-,-,-||?,?,?,?||07E3h||8||02 21 E1 xx xx xx xx xx||07EBh||8||04 61 E1 aa bb 00 00 00||aa = 00h (?), bb = 00h (?)|
|E2||-,-,-,-||?,?,?,?||07E3h||8||02 21 E2 xx xx xx xx xx||07EBh||8||07 61 E2 aa bb cc dd ee||aa = F2h (?), bb = B2h (?), cc = 99h (?), dd = F3h (?), dd = 40h (?)|
|E3||-||?||07E3h||8||02 21 E3 xx xx xx xx xx||07EBh||8||?? 61 E3 ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
|E4||-||?||07E3h||8||02 21 E4 xx xx xx xx xx||07EBh||8||?? 61 E4 ?? ?? ?? ?? ??||Should exist based on PID map, but not seen|
- ) xx = don't care
- ) Voltage [V] * 2^17 / 1000; e.g.: 99 98 = 300 V, B3 30 = 350 V
- ) Voltage [V] * 2^15 / 1000; e.g.: 26 66 = 300 V, 2C CC = 350 V
- ) Delta [50 mV]; e.g.: 00 = 0 V; 01 = 50 mV; 02 = 100 mV
- ) Temper [C] + 40 = (Temper [F] + 40) * 5 / 9; e.g.: 00 = -40 C = -40 F; 28 = 0 C = 32 F; 41 = 25 C = 77 F
- ) The 4 bytes are, in order: Max temperature, Min temperature, Avg temperature, ?? temperature
- ) Limit [500 mA]; e.g.: 8A = 69 A
|...||Byte 0||Byte 1||Byte 2||Byte 3||Byte 4||Byte 5||Byte 6||Byte 7|
|Request||03 = No of data bytes following||22 = mode 22 request||ID of ECU||PID||n.a.||n.a.||n.a.||n.a.|
|1-byte response||04 = No of data bytes following||62 = response to mode 22 request||ID of ECU||PID||Value||n.a.||n.a.||n.a.|
|2-byte response||05 = No of data bytes following||62 = response to mode 22 request||ID of ECU||PID||Value, high byte||Value, low byte||n.a.||n.a.|
The entire range of 256 possible PIDs is divided in 8 blocks of 20h PIDs. The data in the first PID of each block is a bitmap of the PIDs implemented in that block. Convert the data to binary, convert each '1' to its weight, add 1 and add the base address of that block. That will give you the corresponding PID. The last bit of the last data byte is set, which converts to +20h, to point to the next data block (except for the very last block).
For example, for block 40h (02 21 40 xx xx xx xx xx) :
- The response is 06 61 40 C0 0C 00 01 00, and therefore the data bytes are C0 0C 00 01
We convert C0 0C 00 01 to binary: 1100 0000 0000 1100 0000 0000 0000 0001
high nibble 0000 0000 0000 0000 1111 1111 1111 1111 low nibble 0123 4567 89AB CDEF 0123 4567 89AB CDEF C00C0001 = 1100 0000 0000 1100 0000 0000 0000 0001
Now we get the weight of each '1':
0000 0000 0000 0000 1111 1111 1111 1111 high nibble of weight 0123 4567 89AB CDEF 0123 4567 89AB CDEF low nibble of weight 1100 0000 0000 1100 0000 0000 0000 0001 -> 00, 01, 0C, 0D, 1F
Now we convert those to PIDs:
00 + 1 + 40 = 41; 01 + 1 + 40 = 42; 0C + 1 + 40 = 4D; 0D + 1 + 40 = 4E; 1F + 1 + 40 = 60;
So, the PIDs in this block are: 41h, 42h, 4Dh and 4Eh. The next PID map is at 60h
This table shows how to set-up a ScanGauge 2 with XGAUGE to report certain parameters of the stock battery using PIDs. A PHEV should at the very least implement these PIDs.
|07E321CE||056186CE0000||3810||0001000AF333||Abt||Pack current [A]|
|07E321CE||056186CE0000||3008||000A00020000||%sc||Pack State Of Charge [%]|
|0033||0100023B0000||2010||000100010000||Vbt||Pack Voltage [V]|
Causes for errors
The Prius doesn't like the following:
- Actual battery voltage at 175 V or less (regardless of what you tell it the voltage is). Or, telling the car that the battery voltage is much higher than it really is (say, the battery is 170 V, but you tell it it's 200 V)
- A fault is generated, car dies
- Clear the faults, tell it the right voltage, and all will be fine
- Telling the car that the battery is at 80 % SOC or more
- Engine runs all the time, drawing current from the battery (about 9 A) to discharge it
- Resistance from HV- or HV+ to chassis ground less than around 10M
MFD (Multi Function Display)
State Of Charge display
In the Energy screen, the state of charge of the battery is shown with 8 bars. The following graph shows the relationship between the SOC reported by the battery ECU and the number of bars shown. There is a hysteresis of 2.5 % (usually), and filtering with a time constant of about 15 seconds (created inside the HEV ECU - the HEV ECU reacts immediately to changes in SOC, and the display reacts immediately to changes in CAN message 529h).
- More SOC images available at Toyota Prius Battery Specs.
Overriding the instrument cluster
There is a way of affecting the display of a few items in the Prius MFD through the CAN Bus, the SOC in particular.
The Hybrid ECU broadcasts a message with some of the information that the instrument cluster (including the MFD) uses to display SOC and alarms.
The message ID is 529h, it has 7 data bytes, and it repeats at most every 1 s (if there's a change in data, it is sent right away, and then every 1 s thereafter). To be exact, it's slightly less that 1 s: it's 999.5 ms.
The typical message is: 28 00 00 84 00 00 00
|0||-||28h||7 (80h)||Set for 1 s whenever data change||none|
|3 (08h)||?||If 0, displays "Problem"|
|1||Screen doesn't change||00h||2, 4 or 6 (04h, 10h or 40h):||General problem with triangle||Top strip: "Problem", 1 beep, red triangle|
|5 (20h)||General problem||Top strip: "Problem", 1 beep|
|3 (08h)||Not in Park, and the driver side door is open||Full screen: "Caution: Shift to the P position when parked. The batteries will not charge if the shift position is in Neutral (N)."|
|2||Screen doesn't change||00h||0 (01h)||General problem||Top strip: "Problem", 1 beep|
|1 (02h):||General problem with triangle||Top strip: "Problem", 1 beep, red triangle|
|3||Screen doesn't change||8Ch||2:0 (00h to 07h)||SOC bars||number of bars on SOC display: 0 to 7 = 1 to 8 bars|
|3 (08h)||brake depressed||none|
|7 (80h)||? Always set||no effect|
|4||Switch to Energy Monitor screen||00h||6 (40h)||EV mode||none|
|7 (80h):||EV denied||3 beeps|
|5||Screen doesn't change||00h||4 (10h)||Parking brake problem||Full screen: "There's a problem with the transmission 'P' lock mechanism. Park you car on a flat surface, and fully apply the parking brake."|
|5, 6 or 7 (20h, 40h or 80h):||EV denied||Top strip: "Cannot change to EV mode now"|
To override the display, you need to put on the CAN bus that message, in such way the instrument cluster sees your message instead of the original one from the Hybrid ECU. If not done right, the MFD will flicker rapidly between the display that the Prius wants to show, and the one you want to show.
12 V system
Current draw from 12 V battery
When the 12 V battery is first connected, the car draws 1.5 A from it for about 30 seconds, then 0.62 A. That amount is enough to discharge the small 12 V battery in a matter of days.
Charging the 12 V battery
To charge a dead 12 V battery, without disconnecting it from the car, you can't use a trickle charger that provides just a few hundred milliamps. If you do, the car electronics will turn on, attempt to draw 1.5 A, swamping the trickle charger, and no current will get to the battery. Instead, you need a charger capable of more than 1.5 A (say, 2 A minimum), to handle the initial draw from the car electronics, and still have something left to charge the battery.
Alternatively, you can charge the 12 V battery by disconnecting it from the car.
Resetting after reconnecting the 12 V battery
After reconnecting the 12 V battery, you must calibrate the "Auto" function of the driver's window. If you don't do this, you can't open or close the window all the way with the Auto switch.
- Open window half-way
- Pull and hold window switch up until window is all the way up, and hold an additional 1 second or more
Limit to continuous EV operation
The Prius relies on the engine running for distribution of lubricant oil on the gears of the CVT (Continuously Variable Transmission). As its stock EV-only operation is limited to at most a couple of miles, after which the engine must run, it ensures that lubrication happens on a regular basis. Which leads to concerns that in a plug-in converted Prius, the larger battery allows longer EV-only operation, without lubrication. Implying that therefore, a plug-in conversion must ensure that it causes the Prius to restart the engine every few miles, then return to EV operation.
However upon further examination it should be noted that in EV-only mode all motive torque is provided by MG2 and thus not transmitted through the CVT or PSD (Power Split Device) which might more accurately be referred to as a TSD (Torque Split Device). There was a related thread implying that lubrication, while not actively circulated without the ICE running, is still present yet not as critical during EV-only mode. A number of converted PHEV Prius are operating in EV-only mode for extended distances of 10 to 30 or more miles without any adverse effects to the CVT, but we will be sure to update this section should that change in the future.