pwmgen - software PWM/PDM generation
loadrt pwmgen
output_type=type0[,type1...]
pwmgen is used to generate PWM (pulse width modulation) or
PDM (pulse density modulation) signals. The maximum PWM frequency and the
resolution is quite limited compared to hardware-based approaches, but in
many cases software PWM can be very useful. If better performance is needed,
a hardware PWM generator is a better choice.
pwmgen supports a maximum of eight channels. The number of
channels actually loaded depends on the number of type values given.
The value of each type determines the outputs for that channel.
- type 0: single output
- A single output pin, pwm, whose duty cycle is determined by the
input value for positive inputs, and which is off (or at min-dc)
for negative inputs. Suitable for single ended circuits.
- type 1:
pwm/direction
- Two output pins, pwm and dir. The duty cycle on pwm
varies as a function of the input value. dir is low for positive
inputs and high for negative inputs.
- type 2: up/down
- Two output pins, up and down. For positive inputs, the
PWM/PDM waveform appears on up, while down is low. For
negative inputs, the waveform appears on down, while up is
low. Suitable for driving the two sides of an H-bridge to generate a
bipolar output.
- pwmgen.make-pulses
(no floating-point)
- Generates the actual PWM waveforms, using information computed by
update. Must be called as frequently as possible, to maximize the
attainable PWM frequency and resolution, and minimize jitter. Operates on
all channels at once.
- pwmgen.update
(uses floating point)
- Accepts an input value, performs scaling and limit checks, and converts it
into a form usable by make-pulses for PWM/PDM generation. Can (and
should) be called less frequently than make-pulses. Operates on all
channels at once.
- pwmgen.N.enable
bit in
- Enables PWM generator N - when false, all pwmgen.N
output pins are low.
- pwmgen.N.value
float in
- Commanded value. When value = 0.0, duty cycle is 0%, and when
value = ±scale, duty cycle is ± 100% (subject
to min-dc and max-dc limitations).
- pwmgen.N.pwm
bit out (output types 0 and 1 only)
- PWM/PDM waveform.
- pwmgen.N.dir
bit out (output type 1 only)
- Direction output: low for forward, high for reverse.
- pwmgen.N.up
bit out (output type 2 only)
- PWM/PDM waveform for positive input values, low for negative inputs.
- pwmgen.N.down
bit out (output type 2 only)
- PWM/PDM waveform for negative input values, low for positive inputs.
- pwmgen.N.curr-dc
float out
- The current duty cycle, after all scaling and limits have been applied.
Range is from -1.0 to +1.0.
- pwmgen.N.max-dc
float in/out
- The maximum duty cycle. A value of 1.0 corresponds to 100%. This can be
useful when using transistor drivers with bootstrapped power supplies,
since the supply requires some low time to recharge.
- pwmgen.N.min-dc
float in/out
- The minimum duty cycle. A value of 1.0 corresponds to 100%. Note that when
the pwm generator is disabled, the outputs are constantly low, regardless
of the setting of min-dc.
- pwmgen.N.scale
float in/out
-
- pwmgen.N.offset
float in/out
- These parameters provide a scale and offset from the value pin to
thewactual duty cycle. The duty cycle is calculated according to dc =
(value/scale) + offset, with 1.0 meaning 100%.
- pwmgen.N.pwm-freq
float in/out
- PWM frequency in Hz. The upper limit is half of the frequency at which
make-pulses is invoked, and values above that limit will be changed
to the limit. If dither-pwm is false, the value will be changed to
the nearest integer submultiple of the make-pulses frequency. A
value of zero produces Pulse Density Modulation instead of Pulse Width
Modulation.
- pwmgen.N.dither-pwm
bit in/out
- Because software-generated PWM uses a fairly slow timebase (several to
many microseconds), it has limited resolution. For example, if
make-pulses is called at a 20 kHz rate, and pwm-freq is 2
kHz, there are only 10 possible duty cycles. If dither-pwm is
false, the commanded duty cycle will be rounded to the nearest of those
values. Assuming value remains constant, the same output will
repeat every PWM cycle. If dither-pwm is true, the output duty
cycle will be dithered between the two closest values, so that the
long-term average is closer to the desired level. dither-pwm has no
effect if pwm-freq is zero (PDM mode), since PDM is an inherently
dithered process.