Syntax:
PWMOn 'only applies to CCP/PWM channel 1 'or PWMOff PWMOn( channel ) 'where the parameter can be any valid CCP/PWM channel, 1, 2, 3, 4 or 5 'or PWMOff( channel ) PWMOn( module_number ,PWMModule
) 'where the parameter can be any valid PWM channel 1 .. 9 'or PWMOff( module_number ,PWMModule
)
Command Availability:
Only available on Microchip PIC microcontrollers with a CCP/PWM or PWM module.
See here HPWM CCP for the method to change PWM parameters dynamically or to use other CCP channels - this method support CCP1/PWM, CCP2/PWM, CCP3/PWM, CCP4/PWM and CCP5/PWM.
Explanation:
This command sets up the hardware PWM module of the Microchip PIC microcontroller to generate a PWM waveform of the given frequency and duty cycle. Once this command is called, the PWM will be emitted until PWMOff is called.
These constants are required to set the parameters for the PWM. The frequency and the duty applies to all channels when using the method(s) or macro(s) shown above.
Constant Name | Controls | Default Value |
---|---|---|
|
Specifies the output frequency of the PWM module in KHz. |
38 |
|
Sets the duty cycle of the PWM module output. Given as percentage. |
50 |
For CCP/PWM modules are also supported using a call to a method or a macro, as follows:
Method/Macro | Controls | Default Value |
---|---|---|
PWMOn |
No parameter enables CCP1/PWM only |
No parameter |
PWMOff |
Disables CCP1/PWM only |
|
PWMOn( |
Where the parameter is any valid CCP/PWM channel |
|
PWMOff( |
Where the parameter is any valid CCP/PWM channel |
|
PWMOn( |
Where the parameter is any valid PWM module |
|
PWMOff( |
Where the parameter is any valid CCP/PWM module |
|
Fixed Mode PWM for PWM Modules.
To set the Fixed Mode PWM for PWM Modules you need to set a timer frequency, a PWM module cycle and the PWM model source clock.
The options for source clock are shown below. These are the PWM timers supported by the PWM modules, where nn
is the frequency.
PWM_Timer2_Freq `nn` or PWM_Timer4_Freq `nn` or PWM_Timer6_Freq `nn`.
The PWM module duty is set using PWM_`yy`_Duty xx' where `yy
is between 1 and 9 and is a valid PWM module, and, xx
is the Duty cycle for specific channels
#define PWM_yy_Duty xx
The PMW module clock source us PWM_`zz`_Clock_Source tt
. Where zz
is channel and tt
is the PWM clock source.
#define PMW_zz_Clock_Source tt
You do not need to define all the timers and or all the channels, just define the constants you need.
The minimum is A timer with a frequency A PWM channel with a duty A PWM channel clock source
Example: For PWM channel 6 with a frequency of 38Khz with a duty of 50% with a clock source of timer 2, use
#define PWM_Timer2_Freq 38 #define PWM_7_Duty 50 #define PMW_7_Clock_Source 6
Details of the constants with example parameters.
#define PWM_Timer2_Freq 20 'Set frequency in KHz, just change the number #define PWM_Timer4_Freq 40 'Set frequency in KHz, just change the number #define PWM_Timer6_Freq 60 'Set frequency in KHz, just change the number
Supported PWM modules, with example parameters.
#define PWM_1_Duty 10 'Set duty cycle as percentage 0-100%, just change the number #define PMW_1_Clock_Source 2
#define PWM_2_Duty 20 #define PMW_2_Clock_Source 4
#define PWM_3_Duty 30 #define PMW_3_Clock_Source 6
#define PWM_4_Duty 40 #define PMW_4_Clock_Source 2
#define PWM_5_Duty 50 #define PMW_5_Clock_Source 6
#define PWM_6_Duty 60 #define PMW_6_Clock_Source 6
#define PWM_7_Duty 70 #define PMW_7_Clock_Source 4
#define PWM_8_Duty 80 #define PMW_8_Clock_Source 4
#define PWM_9_Duty 90 #define PMW_9_Clock_Source 6
Example #1:
Enable CCP1/PWM channel only. This is the legacy command.
#chip 16f877a,20 'Set the PWM pin to output mode DIR PORTC.2 out 'Main code #define PWM_Freq 38 'Frequency of PWM in KHz #define PWM_Duty 50 'Duty cycle of PWM (%) PWMOn 'Will enable CCP1/PWM Only wait 10 s 'Wait 10 s PWMOff 'Will disable CCP1/PWM Only do loop
Example #2:
Enable any CCP/PWM channel using a call to a method.
#chip 16f877a,20 'Set the PWM pin to output mode DIR PORTC.2 out 'Main code #define PWM_Freq 38 'Frequency of PWM in KHz #define PWM_Duty 50 'Duty cycle of PWM (%) PWMOn (2) 'Will enable any valid CCP/PWM channel wait 10 s 'Wait 10 s PWMOff (2) 'Will disable any valid CCP/PWM channel do loop
Example #3:*
Enable any PWM module using a PWM specific method.
'A real simple and easy PWM setup for 8 and 10 bit PWM channels #chip 18f25k42, 16 #startup InitPPS, 85 Sub InitPPS 'Module: PWM5 RA0PPS = 0x000D 'PWM5 > RA0 'Module: PWM6 RA1PPS = 0x000E 'PWM6 > RA1 'Module: PWM7 RA2PPS = 0x000F 'PWM7 > RA2 'Module: PWM8 RA3PPS = 0x0010 'PWM8 > RA3 End Sub 'Template comment at the end of the config file dir porta Out dir portb Out dir portc Out 'This is the setup section for fixed mode PWM 'The only options are PWM_Timer2_Freq nn|PWM_Timer4_Freq nn|PWM_Timer6_Freq nn. These are the PWM timers 'The PWM_yy_Duty xx' where yy is between 1 and 9 and is a valid PWM module, and, xx is the Duty cycle for specific channels 'The PMW_zz_Clock_Source tt. Where zz is channel and tt is the PWM clock source. 'You do not need to define all the timers and channels, just define the constants you need. 'The minimum is ' A timer with a frequency ' A PWM channel with a duty ' A PWM channel clock source ' For PWM channel 2 with a frequency of 38Khz with a duty of 50% with a clock source of timer 2, use ' #define PWM_Timer2_Freq 38 ' #define PWM_7_Duty 50 ' #define PMW_7_Clock_Source 2 #define PWM_Timer2_Freq 20 'Set frequency in KHz, just change the number #define PWM_Timer4_Freq 40 'Set frequency in KHz, just change the number #define PWM_Timer6_Freq 60 'Set frequency in KHz, just change the number ' Supported PWM module but not by this specific microcontroller ' ' #define PWM_1_Duty 10 'Set duty cycle as percentage 0-100%, just change the number ' #define PMW_1_Clock_Source 2 ' ' #define PWM_2_Duty 20 ' #define PMW_2_Clock_Source 4 ' ' #define PWM_3_Duty 30 ' #define PMW_3_Clock_Source 6 ' ' #define PWM_4_Duty 40 ' #define PMW_4_Clock_Source 2 #define PWM_5_Duty 50 #define PMW_5_Clock_Source 6 #define PWM_6_Duty 60 #define PMW_6_Clock_Source 6 #define PWM_7_Duty 70 #define PMW_7_Clock_Source 4 #define PWM_8_Duty 80 #define PMW_8_Clock_Source 4 ' Supported PWM module but not by this specific microcontroller ' ' #define PWM_9_Duty 90 ' #define PMW_9_Clock_Source 6 ' Enable module 7 HPWMOn ( 7, PWMModule ) wait 2 s ' Disable channel 7 HPWMOff ( 7, PWMModule) ' wait 2 s ' Enable others module HPWMOn ( 5, PWMModule ) HPWMOn ( 6, PWMModule ) HPWMOn ( 7, PWMModule ) HPWMOn ( 8, PWMModule ) ' Enable CCP/PWM channel 1 - uses constants FREQ and DUTY PWMOn ' Enable CCP/PWM channel 2 PWMOn ( 2 ) do loop End
For more help, see PWMOn and PWMOff or, for AVR see Fixed Mode PWM for AVR