PWM Library
CMO module is available with a number of AVR MCUs. mikroPascal PRO for AVR provides library which simplifies using PWM HW Module.
Important :
- AVR MCUs require you to specify the module you want to use. To select the desired PWM, simply change the letter x in the prototype for a number from 1 to 2. Number of UART modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.
For the XMEGA family of MCUs change the xn in the routine prototype with C0, C1, D0, D1, E0, E1, F0 or F1 (MCU dependent). - For better understanding of PWM module it would be best to start with the example provided in Examples folder of our mikroPascal PRO for AVR compiler.
- When you select a MCU, mikroPascal PRO for AVR automatically loads the correct PWM library (or libraries), which can be verified by looking at the Library Manager.
- PWM library handles and initializes the PWM module on the given AVR MCU, but it is up to user to set the correct pins as PWM output, this topic will be covered later in this section.
- mikroPascal PRO for AVR does not support enhanced PWM modules.
Library Routines
PWMx_Init
| Prototype |
procedure PWMx_Init(wave_mode : byte; prescaler : byte; inverted : byte; duty : byte); |
||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Returns |
Nothing. |
||||||||||||||||||||||||||||||||||||||||||||||||||
| Description |
Initializes the PWM module. Parameters :
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 |
function PWM_xn_Init(freq_hz : dword; wave_mode : byte) : 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 :
|
||||||
| 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 |
PWM_C0_Init(1000, _PWM_SINGLE_SLOPE); |
PWMx_Set_Duty
| Prototype |
procedure PWMx_Set_Duty(duty : byte); |
|---|---|
| Returns |
Nothing. |
| Description |
Changes PWM duty ratio. Parameter Parameters :
|
| Requires |
PWM module must to be initialised (PWMx_Init) before using this function. |
| Example |
PWM1_Set_Duty(192); |
PWM_xn_Set_Duty
| Prototype |
procedure PWM_xn_Set_Duty(duty_ratio : word; inverted : byte; channel : byte); |
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Returns |
Nothing. |
||||||||||||||||
| Description |
Changes PWM duty ratio. Parameter Parameters :
|
||||||||||||||||
| Requires |
PWM module must to be initialised (PWM_xn_Init) before using this function. |
||||||||||||||||
| Example |
PWM_C0_Set_Duty(192,_PWM_NON_INVERTED,_CCC_CHANNEL); |
PWMx_Start
| Prototype |
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 |
procedure PWM_xn_Start(channel : byte); |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Returns |
Nothing. |
||||||||||
| Description |
Starts PWM. Parameters :
|
||||||||||
| Requires |
MCU must have CMO module to use this library. PWM module must to be initialised (PWM_xn_Init) before using this function. |
||||||||||
| Example |
PWM_C0_Start(_CCD_CHANNEL); |
PWMx_Stop
| Prototype |
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 |
| Example |
PWM1_Stop(); |
PWM_xn_Stop
| Prototype |
procedure PWM_xn_Stop(channel : byte); |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Returns |
Nothing. |
||||||||||
| Description |
Stops the PWM. Parameters :
|
||||||||||
| Requires |
MCU must have CMO module to use this library. PWM_xn_Init and PWM_xn_Start must be called before |
||||||||||
| Example |
PWM_C0_Stop(_CCC_CHANNEL); |
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.
program PWM_Test;
var current_duty : byte;
current_duty1 : byte;
begin
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)
PWM1_Init (_PWM1_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 16);
PWM2_Init(_PWM2_FAST_MODE, _PWM2_PRESCALER_8, _PWM2_NON_INVERTED, 16);
while TRUE do // Endless loop
begin
if (PINB0_bit <> 0) then
begin // Detect if PORTB pin 0 is pressed
Delay_ms(40); // Small delay to avoid deboucing effect
Inc(current_duty); // Increment duty ratio
PWM1_Set_Duty(current_duty); // Set incremented duty
end
else
if (PINB1_bit <> 0) then // Detect if PORTB pin 1 is pressed
begin
Delay_ms(40); // Small delay to avoid deboucing effect
Dec(current_duty); // Decrement duty ratio
PWM1_Set_Duty(current_duty); // Set decremented duty ratio
end
else
if (PINC0_bit <> 0) then // Detect if PORTC pin 0 is pressed
begin
Delay_ms(40); // Small delay to avoid deboucing effect
Inc(current_duty1); // Increment duty ratio
PWM2_Set_Duty(current_duty1); // Set incremented duty
end
else
if (PINC1_bit <> 0) then // Detect if PORTC pin 1 is pressed
begin
Delay_ms(40); // Small delay to avoid deboucing effect
Dec(current_duty1); // Decrement duty ratio
PWM2_Set_Duty(current_duty1); // Set decremented duty ratio
end;
end;
end.
HW Connection

PWM demonstration
What do you think about this topic ? Send us feedback!




