Jump to main content

##

# 3.29.13 Pulse Width Modulation Controller (PWM)

The Pulse Width Modulation Controller (PWM) controls several channels independently. Each channel controls one square output waveform. Characteristics of the output waveform such as period, duty-cycle and polarity are configurable through the user interface. Each channel selects and uses one of the clocks provided by the clock generator. The clock generator provides several clocks resulting from the division of the PWM macrocell master clock. Channels can be synchronized, to generate non overlapped waveforms. All channels integrate a double buffering system in order to prevent an unexpected output waveform while modifying the period or the duty-cycle.

## Using The Library

This example shows how to configure the PWM to generate three PWM waveform signals. The duty cycle of the PWM is updated in the interrupt handler.

    /* Duty cycle increment value */
    #define DUTY_INCREMENT (10U)

    /* Save PWM period */
    uint32_t period;

    /* This function is called after PWM0 counter event */
    void PWM_CounterEventHandler(uintptr_t context)
    {
        static uint32_t duty0 = 0U;
        static uint32_t duty1 = 2500U;
        static uint32_t duty2 = 5000U;

        PWM0_ChannelDutySet(PWM_CHANNEL_0, duty0);
        PWM0_ChannelDutySet(PWM_CHANNEL_1, duty1);
        PWM0_ChannelDutySet(PWM_CHANNEL_2, duty2);

        /* Increment duty cycle values */
        duty0 += DUTY_INCREMENT;
        duty1 += DUTY_INCREMENT;
        duty2 += DUTY_INCREMENT;

        if (duty0 > period)
            duty0 = 0U;
        if (duty1 > period)
            duty1 = 0U;
        if (duty2 > period)
            duty2 = 0U;
    }

    int main ( void )
    {
        /* Register callback function for Channel 0 counter event */
        PWM0_CallbackRegister(PWM_CounterEventHandler, (uintptr_t)NULL);

        /* Read the period */
        period = PWM0_ChannelPeriodGet(PWM_CHANNEL_0);

        /* Start all channels synchronously */
        PWM0_ChannelsStart(PWM_CHANNEL_0_MASK | PWM_CHANNEL_1_MASK | PWM_CHANNEL_2_MASK);
    }

## Library Interface

Pulse Width Modulation Controller peripheral library provides the following interfaces:

Functions

Name | Description
--- | ---
PWMx_Initialize | Initializes given instance of PWM peripheral
PWMx_ChannelsStart | Starts the given PWM channels
PWMx_ChannelsStop | Stops the given PWM channels
PWMx_ChannelPeriodSet | Sets the period value of given PWM channel
PWMx_ChannelPeriodGet | Reads the period value of given PWM channel
PWMx_ChannelDutySet | Writes the duty cycle value of given PWM channel
PWMx_ChannelCounterEventEnable | Enables counter event of given channels
PWMx_ChannelCounterEventDisable | Disables counter event of given channels
PWMx_ChannelCounterEventStatusGet | Disables counter event of given channels
PWMx_CallbackRegister | Registers the function to be called from interrupt

Data types and constants

Name | Type | Description
--- | --- | ---
PWM_CALLBACK | Typedef | Defines the data type and function signature for the PWM peripheral callback function
PWM_CHANNEL_NUM | Enum | Identifies PWM channel number in a PWM peripheral
PWM_CHANNEL_MASK | Enum | Identifies PWM channel mask