PWM Library

CMO module is available with a number of AVR MCUs. mikroBasic PRO for AVR provides library which simplifies using PWM HW Module.

  Important :

Library Routines

PWMx_Init

Prototype

sub procedure PWMx_Init(dim wave_mode as byte, dim prescaler as byte, dim inverted as byte, dim duty as byte)

Returns

Nothing.

Description

Initializes the PWM module.

Parameters :

  • wave_mode: desired PWM mode (Phase Correct or Fast PWM depending on the chosen MCU).

    Value Description
    _PWM1_FAST_MODE Fast mode for PWM1
    _PWM1_PHASE_CORRECT_MODE Phase Correct mode for PWM1
    _PWM2_FAST_MODE Fast mode for PWM2
    _PWM2_PHASE_CORRECT_MODE Phase Correct mode for PWM2

  • prescaler: prescale value N = 1,8,64,256 or 1024 (some modules support 32 and 128, but for this you will need to check the datasheet for the desired MCU).

    Value Description
    _PWM1_PRESCALER_1 Sets prescaler value to 1 (No prescaling).
    _PWM1_PRESCALER_8 Sets prescaler value to 8.
    _PWM1_PRESCALER_32 Sets prescaler value to 32.
    This value is not available for every MCU, please consult appropriate datasheet.
    _PWM1_PRESCALER_64 Sets prescaler value to 64.
    _PWM1_PRESCALER_128 Sets prescaler value to 128.
    This value is not available for every MCU, please consult appropriate datasheet.
    _PWM1_PRESCALER_256 Sets prescaler value to 256.
    _PWM1_PRESCALER_1024 Sets prescaler value to 1024.
    _PWM2_PRESCALER_1 Sets prescaler value to 1 for the second PWM module.
    _PWM2_PRESCALER_8 Sets prescaler value to 8 for the second PWM module.
    _PWM2_PRESCALER_32 Sets prescaler value to 32 for the second PWM module.
    This value is not available for every MCU, please consult appropriate datasheet.
    _PWM2_PRESCALER_64 Sets prescaler value to 64 for the second PWM module.
    _PWM2_PRESCALER_128 Sets prescaler value to 128 for the second PWM module.
    This value is not available for every MCU, please consult appropriate datasheet.
    _PWM2_PRESCALER_256 Sets prescaler value to 256 for the second PWM module.
    _PWM2_PRESCALER_1024 Sets prescaler value to 1024 for the second PWM module.

  • inverted: inverted or non inverted PWM signal.

    Value Description
    _PWM1_INVERTED PWM1 inverted mode
    _PWM1_NON_INVERTED PWM1 noninverted mode
    _PWM2_INVERTED PWM2 inverted mode
    _PWM2_NON_INVERTED PWM2 noninverted mode

  • duty: sets duty ratio from 0 to 255.

PWMx_Init must be called before using other functions from PWM Library.

Requires

You need a CMO on the given MCU (that supports PWM). Before calling this routine you must set the output pin for the PWM (according to the datasheet).

Example

Initialize PWM module:

PWM1_Init(_PWM1_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 127)

PWM_xn_Init

Prototype

sub function PWM_xn_Init(dim freq_hz as longword, dim wave_mode as byte) as word

Returns

Calculated timer period (value written in PER register) for XMEGA family of MCUs.

Description

Initializes the PWM module. Change the xn in the routine prototype with C0, C1, D0, D1, E0, E1, F0 or F1 (MCU dependent).

Parameters :

  • freq_hz: PWM frequency in Hz (refer to device datasheet for correct values in respect with Fosc).
  • wave_mode: desired PWM mode

    Value Description
    _PWM_SINGLE_SLOPE Single Slope Mode
    _PWM_DUAL_SLOPE Dual Slope Mode

Requires

You need a CMO on the given MCU (that supports PWM). Before calling this routine you must set the output pin for the PWM (according to the datasheet).

Example

Initialize PWM module:



          

PWMx_Set_Duty

Prototype

sub procedure PWMx_Set_Duty(dim duty as byte)

Returns

Nothing.

Description

Changes PWM duty ratio. Parameter duty takes values from 0 to 255, where 0 is 0%, 127 is 50%, and 255 is 100% duty ratio. Other specific values for duty ratio can be calculated as (Percent*255)/100.

Parameters :

  • duty: sets duty ratio from 0 to 255.
Requires

PWM module must to be initialised (PWMx_Init) before using this function.

Example

For example lets set duty ratio to 75%:

PWM1_Set_Duty(192)

PWM_xn_Set_Duty

Prototype

sub procedure PWM_xn_Set_Duty(dim duty_ratio as word, dim inverted as byte, dim channel as byte)

Returns

Nothing.

Description

Changes PWM duty ratio. Parameter duty takes values from 0 to 255, where 0 is 0%, 127 is 50%, and 255 is 100% duty ratio. Other specific values for duty ratio can be calculated as (Percent*255)/100.

Parameters :

  • duty_ratio: PWM duty ratio. Valid values: 0 to timer period returned by the PWM_xn_Init function.
  • inverted: inverted or non inverted PWM signal.

    Value Description
    _PWM_NON_INVERTED Non Inverted Mode
    _PWM_INVERTED Inverted Mode

  • channel: PWM channel. Values :

    Value Description
    _CCA_CHANNEL CCA channel
    _CCB_CHANNEL CCB channel
    _CCC_CHANNEL CCC (this channel not available from PWM_x1_Set_Duty.
    _CCD_CHANNEL CCD (this channel not available from PWM_x1_Set_Duty.

Requires

PWM module must to be initialised (PWM_xn_Init) before using this function.

Example

For example lets set duty ratio to 75%:



          

PWMx_Start

Prototype

sub procedure PWMx_Start()

Returns

Nothing.

Description

Starts PWM.

Requires

MCU must have CMO module to use this library. PWMx_Init must be called before using this routine.

Example
PWM1_Start()

PWM_xn_Start

Prototype

sub procedure PWM_xn_Start(dim channel as byte)

Returns

Nothing.

Description

Starts PWM.

Parameters :

  • channel: Starts PWM at requested channel. Values :

    Value Description
    _CCA_CHANNEL CCA channel
    _CCB_CHANNEL CCB channel
    _CCD_CHANNEL CCC (this channel not available from PWM_x1_Start.
    _CCD_CHANNEL CCD (this channel not available from PWM_x1_Start.

Requires

MCU must have CMO module to use this library.

PWM module must to be initialised (PWM_xn_Init) before using this function.

Example


          

PWMx_Stop

Prototype

sub procedure PWMx_Stop()

Returns

Nothing.

Description

Stops the PWM.

Requires

MCU must have CMO module to use this library. PWMx_Init and PWMx_Start must be called before
using this routine using this routine, otherwise it will have no effect as the PWM module is not running.

Example
PWM1_Stop()

PWM_xn_Stop

Prototype

sub procedure PWM_xn_Stop(dim channel as byte)

Returns

Nothing.

Description

Stops the PWM.

Parameters :

  • channel: Stops PWM at requested channel. Values :

    Value Description
    _CCA_CHANNEL CCA channel
    _CCB_CHANNEL CCB channel
    _CCC_CHANNEL CCC channel (this channel not available from PWM_x1_Stop.
    _CCD_CHANNEL CCD channel (this channel not available from PWM_x1_Stop.

Requires

MCU must have CMO module to use this library. PWM_xn_Init and PWM_xn_Start must be called before
using this routine otherwise it will have no effect as the PWM module is not running.

Example


          

Library Example

The example changes PWM duty ratio on PB3 and PB7 pins continually. If LED is connected to PB3 and PB7, you can observe the gradual change of emitted light.

Copy Code To ClipboardCopy Code To Clipboard
program PWM_Test

dim current_duty as byte
    current_duty1 as byte

main:
  DDB0_bit = 0                    ' Set PORTB pin 0 as input
  DDB1_bit = 0                    ' Set PORTB pin 1 as input

  DDC0_bit = 0                    ' Set PORTC pin 0 as input
  DDC1_bit = 0                    ' Set PORTC pin 1 as input

  current_duty  = 16              ' initial value for current_duty
  current_duty1 = 16              ' initial value for current_duty

  DDB3_bit = 1                    ' Set PORTB pin 3 as output pin for the PWM (according to datasheet)
  DDD7_bit = 1                    ' Set PORTD pin 7 as output pin for the PWM1 (according to datasheet)

  PWM_Init(_PWM_FAST_MODE, _PWM_PRESCALER_8, _PWM_NON_INVERTED, 16)
  PWM1_Init(_PWM_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 16)

  while TRUE                          ' Endless loop

    if (PINB0_bit <> 0) then          ' Detect if PORTB pin 0 is pressed
      Delay_ms(40)                    ' Small delay to avoid deboucing effect
      Inc(current_duty)               ' Increment duty ratio
      PWM_Set_Duty(current_duty)      ' Set incremented duty
    end if

    if (PINB1_bit <> 0) then          ' Detect if PORTB pin 1 is pressed
      Delay_ms(40)                    ' Small delay to avoid deboucing effect
      Dec(current_duty)               ' Decrement duty ratio
      PWM_Set_Duty(current_duty)      ' Set decremented duty ratio
    end if

    if (PINC0_bit <> 0) then          ' Detect if PORTC pin 0 is pressed
      Delay_ms(40)                    ' Small delay to avoid deboucing effect
      Inc(current_duty1)              ' Increment duty ratio
      PWM1_Set_Duty(current_duty1)    ' Set incremented duty
    end if

    if (PINC1_bit <> 0) then          ' Detect if PORTC pin 1 is pressed
      Delay_ms(40)                    ' Small delay to avoid deboucing effect
      Dec(current_duty1)              ' Decrement duty ratio
      PWM1_Set_Duty(current_duty1)    ' Set decremented duty ratio
    end if

  wend

end.

HW Connection

PWM demonstration

PWM demonstration

Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code