#include <pic.h>
#include <htc.h>
#define _XTAL_FREQ 20000000
void PWM_Init(float frequency,unsigned char timer_prescalar);
void PWM_Set_Duty(unsigned char duty_cycle,unsigned char timer_presclar);
void PWM_Stop();
unsigned char i=0;
unsigned char flag = 0;
unsigned int value;
void main()
{
unsigned short duty1=20;
unsigned char TimerPrescalar=4;
PWM_Init(25000,TimerPrescalar);
PWM_Set_Duty(20,TimerPrescalar);
while(1)
{
}
}
void PWM_Init(float frequency,unsigned char timer_prescalar)
{
float temp;
TRISC2 = 0;
temp = _XTAL_FREQ/frequency;
temp = temp/4;
temp = temp/timer_prescalar;
PR2 = (unsigned char)(temp);
PR2 = PR2-1;
CCPR1L = 0x00;
CCP1CON = 0x0C; //Set Zero Percent Duty Cycle Initially
TRISC2 = 0;
if(timer_prescalar == 1)
{
T2CON = 0b00000100;
}
else if(timer_prescalar == 4)
{
T2CON = 0b00000101;
}
else if(timer_prescalar == 16)
{
T2CON = 0b00000111;
}
}
void PWM_Set_Duty(unsigned char duty_cycle,unsigned char timer_prescalar)
{
unsigned int register_value;
float frequency;
frequency = (_XTAL_FREQ/4);
frequency = (frequency/timer_prescalar);
frequency = (frequency/(PR2+1)); //Frequency of PWM Signal
frequency = (frequency*100)/(duty_cycle);
register_value = (_XTAL_FREQ)/(unsigned int)frequency;
register_value = (register_value/timer_prescalar);
CCPR1L = (register_value>>2);
register_value = register_value & 0x03;
CCP1CON = CCP1CON | (register_value<<4);
}