Direction: PDM → ECU | DLC: 8 bytes | Cycle Time: 100ms
Provides real-time system status information including power, temperature, and error conditions.
| Signal | Bit Position | Length | Scale | Unit | Range | Type | Notes |
|---|---|---|---|---|---|---|---|
| AliveCounter | 0-7 | 8 bits | 1 | — | 0-255 | Unsigned | Increments every status message, automatically overflows |
| SystemCurrentLimit | 8-15 | 8 bits | 1 | Amps | 0-150 | Unsigned | System-wide current limitation threshold |
| SystemTemp | 16-23 | 8 bits | 1 | Celsius | 0-255 | Unsigned | PDM internal temperature |
| ECUVoltage | 24-31 | 8 bits | ×0.1 | Volts | 0-25.5 | Unsigned | Battery voltage (Vbatt) |
| SystemCurrent | 32-47 | 16 bits | ×0.1 | Amps | 0-6553.5 | Unsigned | Total system current draw |
| ErrorFlags | 48-63 | 16 bits | 1 | — | 0-65535 | Unsigned | Error condition flags — see Error Flag Bitmask below |
Byte Layout:
Byte 0: [AliveCounter]
Byte 1: [SystemCurrentLimit]
Byte 2: [SystemTemp]
Byte 3: [ECUVoltage]
Byte 4-5: [SystemCurrent]
Byte 6-7: [ErrorFlags]
Error Flag Bitmask:
0x0001: Overcurrent
0x0002: Overtemp
0x0004: Undervoltage
0x0008: CRC check failed
0x0010: SD card error
0x0020: PC comms checksum error
0x0040: GPS error
0x0080: Temperature warning
Direction: PDM → ECU | DLC: 8 bytes | Cycle Time: 100ms
Configuration status and system mode information.
| Signal | Bit Position | Length | Unit | Range | Values | Notes |
|---|---|---|---|---|---|---|
| AliveCounter | 0-7 | 8 bits | — | 0-255 | — | Increments per frame, automatically overflows |
| SpeedUnits | 8-15 | 8 bits | — | 0-1 | 0=Metric, 1=Imperial | Configured speed display units |
| DistanceUnits | 16-23 | 8 bits | — | 0-1 | 0=Metric, 1=Imperial | Configured distance display units |
| AllowData | 24-31 | 8 bits | — | 0-1 | 0=False, 1=True | Data logging permission |
| AllowGPS | 32-39 | 8 bits | — | 0-1 | 0=False, 1=True | GPS feature enabled |
| AllowMotionDetect | 40-47 | 8 bits | — | 0-1 | 0=False, 1=True | Motion detection enabled |
| MotionDeadTime | 48-55 | 8 bits | Minutes | 0-254 | — | Delay before motion detection triggers |
Byte Layout:
Byte 0: [AliveCounter]
Byte 1: [SpeedUnits]
Byte 2: [DistanceUnits]
Byte 3: [AllowData]
Byte 4: [AllowGPS]
Byte 5: [AllowMotionDetect]
Byte 6: [MotionDeadTime]
Byte 7: Reserved
Direction: ECU → PDM | DLC: 8 bytes
Request detailed status for a specific channel.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | — | 1-14 | Which channel to query |
| RESERVED | 8-63 | 56 bits | — | 0 | Unused bytes |
Direction: PDM → ECU | DLC: 8 bytes
Basic channel status including type, current, and current thresholds.
| Signal | Bit Position | Length | Scale | Unit | Range | Values | Notes |
|---|---|---|---|---|---|---|---|
| FrameIndex | 0-7 | 8 bits | 1 | — | 0 | — | Indicates Frame 0 |
| ChannelType | 8-15 | 8 bits | 1 | — | 0-6 | 0=Digital, 1=DigitalPWM, 2=AnalogueThreshold, 3=AnalogueScaled, 4=CANDigital, 5=CANPWM, 6=DigitalIntermittent | Channel configuration type |
| Enabled | 16-23 | 8 bits | 1 | — | 0-1 | 0=OutputOff, 1=OutputOn | Current output state |
| ChannelName | 24-39 | 16 bits | 1 | — | 0-32767 | PackedLetters | Three uppercase letters packed as ((c0-'A')<<10)\|((c1-'A')<<5)\|(c2-'A') |
| ChannelCurrent | 40-47 | 8 bits | ×0.1 | Amps | 0-25.5 | — | Current flowing through channel |
| CurrentThresholdLow | 48-55 | 8 bits | ×0.1 | Amps | 0-17 | — | Low current fault threshold |
| CurrentThresholdHigh | 56-63 | 8 bits | ×0.1 | Amps | 0-17 | — | High current fault threshold |
Direction: PDM → ECU | DLC: 8 bytes
Channel timing and behavior configuration status.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| FrameIndex | 0-7 | 8 bits | — | 1 | Indicates Frame 1 |
| RetryCount | 8-15 | 8 bits | — | 0-255 | Retry attempts after fault |
| InrushDelay | 16-47 | 32 bits | Milliseconds | 0-2000 | Startup current limiting delay |
| ActiveHigh | 48-55 | 8 bits | — | 0-1 | Output polarity (0=ActiveLow, 1=ActiveHigh) |
| RunOn | 56-63 | 8 bits | — | 0-1 | Keep-alive behavior flag (0=Disabled, 1=Enabled) |
Direction: PDM → ECU | DLC: 8 bytes
Extended timing parameters and inrush current threshold.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| FrameIndex | 0-7 | 8 bits | — | 2 | Indicates Frame 2 |
| RunOnTime | 8-39 | 32 bits | Milliseconds | 0-3600000 | Duration to keep output on after disable |
| InrushCurrentThreshold | 40-47 | 8 bits | Amps | 0-50 | Inrush current limiting threshold |
Direction: ECU → PDM | DLC: 8 bytes
Request a snapshot of all digital input states. Payload is ignored by the controller.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| Reserved | 0-7 | 8 bits | — | 0 | Unused |
Direction: PDM → ECU | DLC: 8 bytes
Digital input snapshot response.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| DigitalInputMask | 0-7 | 8 bits | — | 0-255 | Bit 0 = DI1 through bit 7 = DI8. Set means the sampled input is logically high |
Direction: ECU → PDM | DLC: 8 bytes
Request a snapshot for a specific analogue input.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| InputNumber | 0-7 | 8 bits | — | 1-8 | Which analogue input to query |
Direction: PDM → ECU | DLC: 8 bytes
Analogue input metadata and source voltage.
| Signal | Bit Position | Length | Scale | Unit | Range | Values | Notes |
|---|---|---|---|---|---|---|---|
| FrameIndex | 0-7 | 8 bits | 1 | — | 0 | — | Indicates Frame 0 |
| InputType | 8-15 | 8 bits | 1 | — | 0-4 | 0=RawVoltage, 1=Active, 2=Passive, 3=NTC, 4=Digital | Input sensor type |
| Units | 16-23 | 8 bits | 1 | — | 0-9 | 0=Volts, 1=Amps, 2=Celsius, 3=Fahrenheit, 4=Percent, 5=RPM, 6=KPH, 7=MPH, 8=Bar, 9=PSI | Engineering units for converted value |
| Flags | 24-31 | 8 bits | 1 | — | 0-7 | — | Bit 0=PullUpEnable, Bit 1=PullDownEnable, Bit 2=current logical digital state |
| InputVoltage | 32-47 | 16 bits | ×0.001 | Volts | 0-65.535 | — | Raw input voltage |
Direction: PDM → ECU | DLC: 8 bytes
Analogue input converted engineering value.
| Signal | Bit Position | Length | Scale | Unit | Range | Notes |
|---|---|---|---|---|---|---|
| FrameIndex | 0-7 | 8 bits | 1 | — | 1 | Indicates Frame 1 |
| ConvertedValue | 8-39 | 32 bits | ×0.001 | EngineeringUnits | −2147483.648 to +2147483.647 | Signed engineering value; interpret using Units signal from Frame 0 |
Direction: ECU → PDM | DLC: 8 bytes
Basic channel control: enable/disable and PWM duty cycle combined in a single byte.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | — | 1-14 | Target channel |
| ControlValue | 8-15 | 8 bits | — | 0-255 | 0 disables the channel. Any non-zero value enables it. For CAN_PWM channels, values ≤100 also set the PWM duty cycle (%) |
Description: Single-byte control message. Enable/disable and PWM duty are combined into ControlValue — there are no separate Enabled and PWM signals. The Enabled state is latched in the PDM; only one message is needed to change state.
Direction: ECU → PDM | DLC: 8 bytes
Channel type, name, and threshold configuration.
| Signal | Bit Position | Length | Scale | Unit | Range | Values | Notes |
|---|---|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | 1 | — | 1-14 | — | Target channel |
| ChannelType | 8-15 | 8 bits | 1 | — | 0-6 | 0=Digital, 1=DigitalPWM, 2=AnalogueThreshold, 3=AnalogueScaled, 4=CANDigital, 5=CANPWM, 6=DigitalIntermittent | Channel type selection |
| ChannelName | 16-31 | 16 bits | 1 | — | 0-32767 | PackedLetters | Three uppercase letters packed as ((c0-'A')<<10)\|((c1-'A')<<5)\|(c2-'A') |
| CurrentThresholdLow | 32-39 | 8 bits | ×0.1 | Amps | 0-17 | — | Low current fault threshold |
| CurrentThresholdHigh | 40-47 | 8 bits | ×0.1 | Amps | 0-17 | — | High current fault threshold |
| RetryCount | 48-55 | 8 bits | 1 | — | 0-255 | — | Number of retry attempts |
| WriteBitMask | 56-63 | 8 bits | 1 | — | 0-127 | — | Bitmask for which parameters to save |
WriteBitMask Details: Only parameters with their corresponding bit set are observed and saved to EEPROM. Bit 2 is unused. Use ChannelConfigF4 to set InrushCurrentThreshold.
Bit 0: Channel Type
Bit 1: Channel Name
Bit 2: (Unused)
Bit 3: Low current fault threshold
Bit 4: High current fault threshold
Bit 5: Retry Count
Bits 6-7: Reserved
Direction: ECU → PDM | DLC: 8 bytes
Channel timing configuration (inrush delay and run-on behavior).
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | — | 1-14 | Target channel |
| InrushDelay | 8-39 | 32 bits | Milliseconds | 0-2000 | Current limit delay during startup |
| ActiveHigh | 40-47 | 8 bits | — | 0-1 | Output polarity (0=ActiveLow, 1=ActiveHigh) |
| RunOn | 48-55 | 8 bits | — | 0-1 | Keep-alive mode flag (0=Disabled, 1=Enabled) |
| WriteBitMask | 56-63 | 8 bits | — | 0-15 | Bitmask for which parameters to save |
WriteBitMask Details: Only parameters with their corresponding bit set are observed and saved to EEPROM. Bit 0 is unused.
Bit 0: (Unused)
Bit 1: Inrush Delay
Bit 2: Active High
Bit 3: Run On
Bits 4-7: Reserved
Direction: ECU → PDM | DLC: 8 bytes
Extended timing: run-on duration and soft start.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | — | 1-14 | Target channel |
| RunOnTime | 8-39 | 32 bits | Milliseconds | 0-3600000 | Duration to keep output on after disable |
| SoftStart | 40-47 | 8 bits | — | 0-1 | Soft start enable flag (0=Disabled, 1=Enabled) |
| SoftStartTime | 48-55 | 8 bits | Seconds | 0-5 | Soft start ramp duration |
| WriteBitMask | 56-63 | 8 bits | — | 0-15 | Bitmask for which parameters to save |
WriteBitMask Details: Only parameters with their corresponding bit set are observed and saved to EEPROM. Bit 0 is unused.
Bit 0: (Unused)
Bit 1: Run On Time
Bit 2: Soft Start
Bit 3: Soft Start Time
Bits 4-7: Reserved
Direction: ECU → PDM | DLC: 8 bytes
Dedicated inrush current threshold write message.
| Signal | Bit Position | Length | Unit | Range | Notes |
|---|---|---|---|---|---|
| ChannelNumber | 0-7 | 8 bits | — | 1-14 | Target channel |
| InrushCurrentThreshold | 8-15 | 8 bits | Amps | 0-50 | Inrush current limiting threshold |
| WriteBitMask | 56-63 | 8 bits | — | 0-1 | Bit 0 gates InrushCurrentThreshold. When clear, the controller ignores byte 1 |
Note: Bytes 2-6 are unused padding and must be sent as zero.
Direction: ECU → PDM | DLC: 8 bytes
System-wide configuration parameters.
| Signal | Bit Position | Length | Unit | Range | Values | Notes |
|---|---|---|---|---|---|---|
| SystemCurrentLimit | 0-7 | 8 bits | Amps | 0-150 | — | Maximum system output current |
| SpeedUnits | 8-15 | 8 bits | — | 0-1 | 0=Metric, 1=Imperial | Display units for speed |
| DistanceUnits | 16-23 | 8 bits | — | 0-1 | 0=Metric, 1=Imperial | Display units for distance |
| AllowData | 24-31 | 8 bits | — | 0-1 | 0=False, 1=True | Data logging permission |
| AllowGPS | 32-39 | 8 bits | — | 0-1 | 0=False, 1=True | GPS feature enable |
| AllowMotionDetect | 40-47 | 8 bits | — | 0-1 | 0=False, 1=True | Motion detection enable |
| MotionDeadTime | 48-55 | 8 bits | Minutes | 0-254 | — | Delay before motion triggers |
| WriteBitMask | 56-63 | 8 bits | — | 0-127 | — | Bitmask for parameter persistence |
WriteBitMask Details: Only parameters with their corresponding bit set are observed and saved to EEPROM.
Bit 0: System Current Limit
Bit 1: Speed Units
Bit 2: Distance Units
Bit 3: Allow Data
Bit 4: Allow GPS
Bit 5: Allow Motion Detect
Bit 6: Motion Dead Time
Bit 7: Reserved
| Default Message ID | Name | Direction | Signals | Purpose |
|---|---|---|---|---|
| 0x700 (1792) | ChannelStatusRequest | ECU → PDM | 2 | Query channel status |
| 0x701 (1793) | ChannelStatusResponse | PDM → ECU | Multi-frame | Return channel details |
| 0x710 (1808) | DigitalInputStatusRequest | ECU → PDM | 1 | Request digital input snapshot |
| 0x711 (1809) | DigitalInputStatusResponse | PDM → ECU | 1 | Return digital input states |
| 0x712 (1810) | AnalogueInputStatusRequest | ECU → PDM | 1 | Request analogue input snapshot |
| 0x713 (1811) | AnalogueInputStatusResponse | PDM → ECU | Multi-frame | Return analogue input data |
| 0x720 (1824) | SystemStatus1 | PDM → ECU | 6 | System power & temperature |
| 0x721 (1825) | SystemStatus2 | PDM → ECU | 7 | System configuration state |
| 0x730 (1840) | SystemConfig | ECU → PDM | 8 | Configure system parameters |
| 0x740 (1856) | ChannelConfigF0 | ECU → PDM | 2 | Basic channel control |
| 0x741 (1857) | ChannelConfigF1 | ECU → PDM | 7 | Channel type & thresholds |
| 0x742 (1858) | ChannelConfigF2 | ECU → PDM | 5 | Channel timing config |
| 0x743 (1859) | ChannelConfigF3 | ECU → PDM | 5 | Channel run-on duration & soft start |
| 0x744 (1860) | ChannelConfigF4 | ECU → PDM | 3 | Channel inrush current threshold |
Configuration messages (ChannelConfigF0-F4, SystemConfig) use bitmasks to specify which parameters should be persisted to the PDM's EEPROM. Always set the appropriate bits for parameters you intend to modify — unmarked parameters will be ignored. Note that in ChannelConfigF2 and ChannelConfigF3, bit 0 of the WriteBitMask is unused; the active bits start at bit 1.
The AliveCounter signal in SystemStatus messages increments with each transmission and automatically wraps around. SystemStatus1 carries the pre-increment value; SystemStatus2 carries the post-increment value. Use this for:
Current measurements use a scale factor of ×0.1 (e.g., a raw value of 25 represents 2.5 Amps). SystemCurrentLimit in SystemStatus1 and SystemConfig is an exception — it is encoded directly in whole Amps with no scaling.
Valid channel numbers are 1-14 (system reserves channel 0). Always validate before sending control messages.
Enable/disable and PWM duty cycle are combined into the single ControlValue byte. A value of 0 disables the channel; any non-zero value enables it. For CAN_PWM channel types, values of 1-100 are additionally interpreted as the PWM duty cycle percentage.