Module mcpwm

Source
Available on crate feature unstable only.
Expand description

§Motor Control Pulse Width Modulator (MCPWM)

§Overview

The MCPWM peripheral is a versatile PWM generator, which contains various submodules to make it a key element in power electronic applications like motor control, digital power, and so on. Typically, the MCPWM peripheral can be used in the following scenarios:

  • Digital motor control, e.g., brushed/brushless DC motor, RC servo motor
  • Switch mode-based digital power conversion
  • Power DAC, where the duty cycle is equivalent to a DAC analog value
  • Calculate external pulse width, and convert it into other analog values like speed, distance
  • Generate Space Vector PWM (SVPWM) signals for Field Oriented Control (FOC)

§Configuration

  • PWM Timers 0, 1 and 2
    • Every PWM timer has a dedicated 8-bit clock prescaler.
    • The 16-bit counter in the PWM timer can work in count-up mode, count-down mode or count-up-down mode.
    • A hardware sync or software sync can trigger a reload on the PWM timer with a phase register (Not yet implemented)
  • PWM Operators 0, 1 and 2
    • Every PWM operator has two PWM outputs: PWMxA and PWMxB. They can work independently, in symmetric and asymmetric configuration.
    • Software, asynchronously override control of PWM signals.
    • Configurable dead-time on rising and falling edges; each set up independently. (Not yet implemented)
    • All events can trigger CPU interrupts. (Not yet implemented)
    • Modulating of PWM output by high-frequency carrier signals, useful when gate drivers are insulated with a transformer. (Not yet implemented)
    • Period, time stamps and important control registers have shadow registers with flexible updating methods.
  • Fault Detection Module (Not yet implemented)
  • Capture Module (Not yet implemented)

Clock source is CRYPTO_CLOCK

§Examples

§Output a 20 kHz signal

This example uses timer0 and operator0 of the MCPWM0 peripheral to output a 50% duty signal at 20 kHz. The signal will be output to the pin assigned to pin.


// initialize peripheral
let clock_cfg = PeripheralClockConfig::with_frequency(Rate::from_mhz(32))?;
let mut mcpwm = McPwm::new(peripherals.MCPWM0, clock_cfg);

// connect operator0 to timer0
mcpwm.operator0.set_timer(&mcpwm.timer0);
// connect operator0 to pin
let mut pwm_pin = mcpwm
    .operator0
    .with_pin_a(pin, PwmPinConfig::UP_ACTIVE_HIGH);

// start timer with timestamp values in the range of 0..=99 and a frequency
// of 20 kHz
let timer_clock_cfg = clock_cfg
    .timer_clock_with_frequency(99, PwmWorkingMode::Increase,
Rate::from_khz(20))?; mcpwm.timer0.start(timer_clock_cfg);

// pin will be high 50% of the time
pwm_pin.set_timestamp(50);

Modules§

operator
MCPWM operators
timer
MCPWM timers

Structs§

FrequencyError
Target frequency could not be set. Check how the frequency is calculated in the corresponding method docs.
McPwm
The MCPWM peripheral
PeripheralClockConfig
Clock configuration of the MCPWM peripheral

Traits§

PwmPeripheral
A MCPWM peripheral