Skip to main content

Hardware PWM

Introduction​

The Omega's SoC has several PWM modules. The Omega2 exposes 2 hardware PWM channels on its pin headers while the Omega2S exposes 4.

Context​

Pulse-width modulation (PWM) is a technique of producing varying analog signals from a digital source.

  • Duty cycle = percentage of time the signal is high (0-100).
  • Frequency = signal frequency.

Hardware​

In this section we are referring to hardware-based PWM modules.

Omega2/2+: 2 channels, Omega2S/2S+: 4 channels

The hardware PWM modules have a frequency range of 39Hz to 40MHz. For lower frequencies it is recommended to consider an external hardware PWM generator or the use of a software generated PWM signal from a GPIO pin.

PWM ChannelGPIONotes
0GPIO18
1GPIO19
2GPIO20Omega2S only
3GPIO21Omega2S only

The PWM pins are highlighted on the Omega2/2S diagrams below.

omega2-pinout pwm pins

Software​

The following sections discuss enabling and working with the hardware PWM.

Enabling Hardware PWM​

To enable the use of hardware PWM, a kernel module needs to be installed:

opkg update   
opkg install kmod-pwm-mediatek-ramips

Adjusting pin multiplexing to enable PWM pins​

The Omega's pins are multiplexed allowing the exposed pins to be used for several different functions.

The pin multiplexing configuration can be easily changed from the command line using omega2-ctrl.

For GPIO18:

omega2-ctrl gpiomux set pwm0 pwm

For GPIO19:

omega2-ctrl gpiomux set pwm1 pwm

For GPIO20 (Omega2S only):

omega2-ctrl gpiomux set uart2 pwm23

For GPIO21 (Omega2S only):

omega2-ctrl gpiomux set uart2 pwm23
info

The multiplexing configuration will need to be repeated after each reboot of the Omega2.

Generating PWM signals​

To generate PWM signals, we'll need to install the omega2-script package.

opkg update
opkg install omega2-script

Once the pins have been configured for PWM usage, we can configure the PWM hardware module to generate a PWM signal using the following command:

onion pwm <CHANNEL> <DUTY CYCLE> <FREQUENCY>

Where:

  • CHANNEL is 0 (GPIO18), 1 (GPIO19), 2 (GPIO20), or 3 (GPIO21).
    • Remember that channels 2 & 3 are exposed on the Omega2S only.
  • DUTY_CYCLE is the percentage of time the signal is ON, expressed 0-100
  • FREQUENCY is the signal frequency, expressed in Hz.

Stopping the PWM signal​

To stop and disable the PWM signal:

onion pwm <CHANNEL> disable
note

The omega2-script provides a helpful wrapper around sysfs for PWM. The source code is available at: https://github.com/OnionIoT/OpenWRT-Packages/blob/openwrt-23.05/omega2-base/files/usr/lib/onion-pwm-lib.sh