PWM Library
PWM Library
CCP module is available with a number of PIC MCUs. mikroC PRO for PIC provides library which simplifies using PWM HW Module.
Important :
- Some MCUs have multiple CCP modules. In order to use the desired CCP library routine, simply change the number
1
in the prototype with the appropriate module number, i.e.PWM2_Start();
. - All PWM modules use Timer2 for its operation, so you can not set different frequencies for different PWM modules.
Library Routines
PWM1_Init
Prototype |
|
---|---|
Returns |
Nothing. |
Description |
Initializes the PWM module with duty ratio 0. Parameter This routine needs to be called before using other functions from PWM Library. |
Requires |
MCU must have CCP module. Note : Calculation of the PWM frequency value is carried out by the compiler, as it would produce a relatively large code if performed on the library level. |
Example |
Initialize PWM module at 5KHz:
|
PWM1_Set_Duty
Prototype |
|
---|---|
Returns |
Nothing. |
Description |
Sets PWM duty ratio. Parameter |
Requires |
MCU must have CCP module. PWM1_Init must be called before using this routine. |
Example |
Set duty ratio to 75%:
|
PWM1_Start
Prototype |
|
---|---|
Returns |
Nothing. |
Description |
Starts PWM. |
Requires |
MCU must have CCP module. PWM1_Init must be called before using this routine. |
Example |
|
PWM1_Stop
Prototype |
|
---|---|
Returns |
Nothing. |
Description |
Stops PWM. |
Requires |
MCU must have CCP module. PWM1_Init must be called before using this routine. PWM1_Start should 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 RC1 and RC2 pins continually. If LED is connected to these pins, you can observe the gradual change of emitted light.
unsigned short current_duty, old_duty, current_duty1, old_duty1;
void InitMain() {
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
PORTA = 255;
TRISA = 255; // configure PORTA pins as input
PORTB = 0; // set PORTB to 0
TRISB = 0; // designate PORTB pins as output
PORTC = 0; // set PORTC to 0
TRISC = 0; // designate PORTC pins as output
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
PWM2_Init(5000); // Initialize PWM2 module at 5KHz
}
void main() {
InitMain();
current_duty = 16; // initial value for current_duty
current_duty1 = 16; // initial value for current_duty1
PWM1_Start(); // start PWM1
PWM2_Start(); // start PWM2
PWM1_Set_Duty(current_duty); // Set current duty for PWM1
PWM2_Set_Duty(current_duty1); // Set current duty for PWM2
while (1) { // endless loop
if (RA0_bit) { // button on RA0 pressed
Delay_ms(40);
current_duty++; // increment current_duty
PWM1_Set_Duty(current_duty);
}
if (RA1_bit) { // button on RA1 pressed
Delay_ms(40);
current_duty--; // decrement current_duty
PWM1_Set_Duty(current_duty);
}
if (RA2_bit) { // button on RA2 pressed
Delay_ms(40);
current_duty1++; // increment current_duty1
PWM2_Set_Duty(current_duty1);
}
if (RA3_bit) { // button on RA3 pressed
Delay_ms(40);
current_duty1--; // decrement current_duty1
PWM2_Set_Duty(current_duty1);
}
Delay_ms(5); // slow down change pace a little
}
}