# Functional Description

## CAN Communication

{% hint style="info" %}
The Helot series communication protocol is based upon a predicate protocol initially developed for Zeva's BMS Modules. Hence, Helot modules are designed to be drop-in replacements.
{% endhint %}

The module's standard bus speed is **250kbps**, frame format is **CAN 2.0B** using 29-bit ID's.

There are a total of five (5) different frame types:&#x20;

–    One (1) request data frame.

–    Four (4) response data frames.

### Request Data Frame (master/controller to BMS100 series module)

The master/controller sends the BMS100 series module a 2-byte request containing the desired **shunt voltage** in **16-bit big endian format**.

<table data-header-hidden><thead><tr><th width="112"></th><th></th></tr></thead><tbody><tr><td>ID</td><td>module_address + 0</td></tr><tr><td>BYTE 1</td><td>shunt voltage in millivolts, high byte</td></tr><tr><td>BYTE 2</td><td>shunt voltage in millivolts, low byte</td></tr></tbody></table>

{% hint style="info" %}
The module will inhibit shunting if the internal 1s timer elapses between CAN messages, or if the master/controller sends a requested shunt voltage of 0.
{% endhint %}

### 1st Response Data Frame 1 (BMS100 series module to master/controller)

After receiving a request data frame from the master/controller, the BMS100 series module will send four response frames in succession.&#x20;

The first being 8 bytes in size, containing the sampled **16-bit voltages 1 to 4, in millivolts -- big endian format.**

<table data-header-hidden><thead><tr><th width="111.5"></th><th></th></tr></thead><tbody><tr><td>ID</td><td>module_address + 1</td></tr><tr><td>BYTE 1</td><td>cell 1 voltage in millivolts, high byte</td></tr><tr><td>BYTE 2</td><td>cell 1 voltage in millivolts, low byte</td></tr><tr><td>BYTE 3</td><td>cell 2 voltage in millivolts, high byte</td></tr><tr><td>BYTE 4</td><td>cell 2 voltage in millivolts, low byte</td></tr><tr><td>BYTE 5</td><td>cell 3 voltage in millivolts, high byte</td></tr><tr><td>BYTE 6</td><td>cell 3 voltage in millivolts, low byte</td></tr><tr><td>BYTE 7</td><td>cell 4 voltage in millivolts, high byte</td></tr><tr><td>BYTE 8</td><td>cell 4 voltage in millivolts, low byte</td></tr></tbody></table>

### 2nd Response Data Frame (BMS100 series module to master/controller)

The second being 8 bytes in size, containing the sampled **16-bit voltages 5 to 8, in millivolts -- big endian format**.

<table data-header-hidden><thead><tr><th width="111.5"></th><th></th></tr></thead><tbody><tr><td>ID</td><td>module_address + 2</td></tr><tr><td>BYTE 1</td><td>cell 5 voltage in millivolts, high byte</td></tr><tr><td>BYTE 2</td><td>cell 5 voltage in millivolts, low byte</td></tr><tr><td>BYTE 3</td><td>cell 6 voltage in millivolts, high byte</td></tr><tr><td>BYTE 4</td><td>cell 6 voltage in millivolts, low byte</td></tr><tr><td>BYTE 5</td><td>cell 7 voltage in millivolts, high byte</td></tr><tr><td>BYTE 6</td><td>cell 7 voltage in millivolts, low byte</td></tr><tr><td>BYTE 7</td><td>cell 8 voltage in millivolts, high byte</td></tr><tr><td>BYTE 8</td><td>cell 8 voltage in millivolts, low byte</td></tr></tbody></table>

### 3rd Response Data Frame (BMS100 series module to master/controller)

The third being 8 bytes in size, containing the sampled **16-bit voltages 9 to 12, in millivolts -- big endian format.**

<table data-header-hidden><thead><tr><th width="113.5"></th><th></th></tr></thead><tbody><tr><td>ID</td><td>module_address + 3</td></tr><tr><td>BYTE 1</td><td>cell 9 voltage in millivolts, high byte</td></tr><tr><td>BYTE 2</td><td>cell 9 voltage in millivolts, low byte</td></tr><tr><td>BYTE 3</td><td>cell 10 voltage in millivolts, high byte</td></tr><tr><td>BYTE 4</td><td>cell 10 voltage in millivolts, low byte</td></tr><tr><td>BYTE 5</td><td>cell 11 voltage in millivolts, high byte</td></tr><tr><td>BYTE 6</td><td>cell 11 voltage in millivolts, low byte</td></tr><tr><td>BYTE 7</td><td>cell 12 voltage in millivolts, high byte</td></tr><tr><td>BYTE 8</td><td>cell 12 voltage in millivolts, low byte</td></tr></tbody></table>

### 4th Response Data Frame (BMS100 series module to master/controller)

The fourth being 2 bytes in size, containing the sampled **8-bit temperatures, with a +40C offset.**

<table data-header-hidden><thead><tr><th width="106.5"></th><th></th></tr></thead><tbody><tr><td>ID</td><td>module_address + 4</td></tr><tr><td>BYTE 1</td><td>temperature 1 in degrees celcius (+40)</td></tr><tr><td>BYTE 2</td><td>temperature 2 in degrees celcius (+40)</td></tr></tbody></table>

{% hint style="info" %}
The master/controller logic must subtract 40 from each temperature for actual values.
{% endhint %}

### Variants

The same request/response packet structure is used across all variants.&#x20;

{% hint style="info" %}
For variants <12S, the unused bytes are zeroed.
{% endhint %}

<table><thead><tr><th width="228">PACKET/BYTE</th><th width="130">12S</th><th width="128">10S</th><th width="130">8S</th><th>6S</th></tr></thead><tbody><tr><td>module_address + 1 / 1</td><td>cell 1 H</td><td>cell 1 H</td><td>cell 1 H</td><td>cell 1 H</td></tr><tr><td>module_address + 1 / 2</td><td>cell 1 L</td><td>cell 1 L</td><td>cell 1 L</td><td>cell 1 L</td></tr><tr><td>module_address + 1 / 3</td><td>cell 2 H</td><td>cell 2 H</td><td>cell 2 H</td><td>cell 2 H</td></tr><tr><td>module_address + 1 / 4</td><td>cell 2 L</td><td>cell 2 L</td><td>cell 2 L</td><td>cell 2 L</td></tr><tr><td>module_address + 1 / 5</td><td>cell 3 H</td><td>cell 3 H</td><td>cell 3 H</td><td>cell 3 H</td></tr><tr><td>module_address + 1 / 6</td><td>cell 3 L</td><td>cell 3 L</td><td>cell 3 L</td><td>cell 3 L</td></tr><tr><td>module_address + 1 / 7</td><td>cell 4 H</td><td>cell 4 H</td><td>cell 4 H</td><td>cell 4 H</td></tr><tr><td>module_address + 1 / 8</td><td>cell 4 L</td><td>cell 4 L</td><td>cell 4 L</td><td>cell 4 L</td></tr><tr><td>module_address + 2 / 1</td><td>cell 5 H</td><td>cell 5 H</td><td>cell 5 H</td><td>cell 5 H</td></tr><tr><td>module_address + 2 / 2</td><td>cell 5 L</td><td>cell 5 L</td><td>cell 5 L</td><td>cell 5 L</td></tr><tr><td>module_address + 2 / 3</td><td>cell 6 H</td><td>cell 6 H</td><td>cell 6 H</td><td>cell 6 H</td></tr><tr><td>module_address + 2 / 4</td><td>cell 6 L</td><td>cell 6 L</td><td>cell 6 L</td><td>cell 6 L</td></tr><tr><td>module_address + 2 / 5</td><td>cell 7 H</td><td>cell 7 H</td><td>cell 7 H</td><td>0</td></tr><tr><td>module_address + 2 / 6</td><td>cell 7 L</td><td>cell 7 L</td><td>cell 7 L</td><td>0</td></tr><tr><td>module_address + 2 / 7</td><td>cell 8 H</td><td>cell 8 H</td><td>cell 8 H</td><td>0</td></tr><tr><td>module_address + 2 / 8</td><td>cell 8 L</td><td>cell 8 L</td><td>cell 8 L</td><td>0</td></tr><tr><td>module_address + 3 / 1</td><td>cell 9 H</td><td>cell 9 H</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 2</td><td>cell 9 L</td><td>cell 9 L</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 3</td><td>cell 10 H</td><td>cell 10 H</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 4</td><td>cell 10 L</td><td>cell 10 L</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 5</td><td>cell 11 H</td><td>0</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 6</td><td>cell 11 L</td><td>0</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 7</td><td>cell 12 H</td><td>0</td><td>0</td><td>0</td></tr><tr><td>module_address + 3 / 8</td><td>cell 12 L</td><td>0</td><td>0</td><td>0</td></tr></tbody></table>

## Cell Balancing

The module will enable shunts across cells that exceed the requested **shunt voltage** received from the master/controller.&#x20;

This will continue until the internal 1s timer elapses between CAN messages **or** until the cell voltage is below the requested **shunt voltage**.

{% hint style="info" %}
A master/controller request rate of 2 Hz is recommended for reliable continuous balancing.
{% endhint %}
