/*-------------------------------------------

程序名称：CCP PWM模式程序
日期版本：2018/6/15 <V1.1>

备注：

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/

//PWM周期 = [(PR2)+1]*4*(1/Fosc)*(TMR2预分频值)
//脉冲宽度 = (CCPRxL:CCPxCON<5:4>*(1/Fosc)*(TMR2预分频值)


#include <cms.h>


//定义选择使用的CCP
#define CCP1_On
//#define CCP2_On

void Set_CCP_PWM(unsigned char Period, unsigned int DutyRatio);


void main()
{
	asm("nop");
	asm("clrwdt");
	
	OSCCON = 0X71;				//8M内部时钟
	
	Set_CCP_PWM(255,512);		//CCP PWM模式初始化,周期128us，占空比50%
	
	while(1)
	{
		asm("clrwdt");
	}
}

/***********************************************
函数名称：Set_CCP_PWM
函数功能：CCP PWM模式初始化
入口参数：Period - 周期寄存器值（输入1~255，周期1.0~128.0us，间隔0.5us）
		  DutyRatio - 占空比寄存器值（输入1~1023）
出口参数：无
备注：TMR2分频比默认设置为1:1；
	  占空比 = 占空比寄存器值/(4*(周期寄存器值+1))
	         = DutyRatio/(4*(Period + 1))
************************************************/
void Set_CCP_PWM(unsigned char Period, unsigned int DutyRatio)
{
	PR2 = Period;              				//装载PR2寄存器设置PWM周期
	
    #ifdef CCP1_On
		CCPR1L = DutyRatio >> 2;			//装载CCPR1L寄存器设置PWM占空比
		DutyRatio &= 0x03;
		CCP1CON = 0x0C | (DutyRatio << 4);	//CCP1模块工作在PWM模式
		TRISC &= 0B11111011;				//清零TRISC2位，使能CCP1引脚输出驱动器
	#else ifdef CCP2_On
		CCPR2L = DutyRatio >> 2;			//装载CCPR2L寄存器设置PWM占空比
		DutyRatio &= 0x03;
		CCP2CON = 0x0C | (DutyRatio << 4);	//CCP2模块工作在PWM模式
		TRISC &= 0B11111101;				//清零TRISC1位，使能CCP2引脚输出驱动器
	#endif
	
	TMR2IF = 0;              				//清零PIR1寄存器中的TMR2IF中断标志位
    T2CKPS0 = 0;             				//定时器TMR2设置1:1预分频比，T2CKPS0=0
    T2CKPS1 = 0;             				//定时器TMR2设置1:1预分频比，T2CKPS1=0
    TMR2ON = 1;              				//T2CON寄存器中的TMR2ON位置1使能Timer2
    
}
