Skip to main content
The PPM (Pulse Position Modulation) application reads servo-style pulse-width signals produced by RC receivers and standard ESC throttle inputs. It decodes the pulse width into a normalised level and applies it to the motor using the configured control type.

Signal specification

Default pulse-width range as defined in appconf_default.h: These map to the ppm_config struct fields pulse_start, pulse_end, and pulse_center.
Most RC receivers and flight controllers output a standard 1–2 ms pulse at 50 Hz. VESC can read this directly on the PPM input pin.

Control types

The ppm_control_type enum determines how the decoded pulse level controls the motor:

Configuration parameters

The full ppm_config struct:

Key parameters

Runtime API

app_ppm_get_decoded_level returns the current decoded input in the range −1.0 to 1.0. app_ppm_detach and app_ppm_override let other firmware components take temporary control of the output without stopping the PPM thread.

Safe start

With safe_start enabled, the motor will not respond until the PPM signal returns to the neutral (center) position after power-on or a timeout. This prevents unintentional movement when power is applied with the throttle open.
The firmware requires a minimum of MIN_PULSES_WITHOUT_POWER (50) valid pulses at neutral before allowing output. This constant is defined at the top of app_ppm.c.