PIC16F1827は、CCP1からCCP4の4つのMWP出力を持っています。
PWMのPeriod(周期)とDuty Cycle、Duty比は、次の式で設定します。
Image may be NSFW.
Clik here to view.
Clik here to view.

テストとして、CCP3に1000Hz(周期1ms=1×10^-3s) デューティ比50%のPWM信号を出力してみます。
PICのクロックは、内臓クロック8MHz(Tosc=1/8×10^6)とし、Timerは、Timer2を使います
上記の式からPWM周期を決定するTimer2のPR2の値は
PR2 = Period / (4×Tosc × TMR2Prescale Value) - 1= 1×10^-3/(4×(1/8×10^6)×TMR2 Prescale Value) -1
= 2×10^3/TMR2 Prescale Value となります。
TMR2のプリスケーラの値によってPR2の値は次のようになります。
Prescale Value PR2
1 1999
4 499
16 124
PR2レジスタは8bitですから0~255の値でなければなりませんので
Prescale Value = 16 PR2 = 124 となります。
デューティ比を50%としますので、CCPR3L = (PR2 + 1)/2 = 125/2 = 62 となります。
プログラムです。
CCP3CONレジスタのbit3:2=11でPWM modeに設定し、bit1:0=00で出力をactive highに設定します。
CCPTMRSレジスタのbit5:4=00でCCP3にTMR2を割り当てます。
T2CONレジスタのbit1:0=10でプリスケーラ値を1:16に設定します。同じT2CONレジスタのbit2=1とするとTMR2が有効になり、PWM信号が出力されます。
実際に出力されたPWM信号の周波数を測定してみました。
Image may be NSFW.
Clik here to view.
Clik here to view.

998Hzでした。誤差2%というところです。
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#define _XTAL_FREQ 8000000 //クロック8MHz
void main() {
OSCCON = 0b01110010 ; // 内蔵クロック8MHz
ANSELA = 0b00000000 ; // AN0-AN4は使用しない。全てデジタルポート
ANSELB = 0b00000000 ; // AN5-AN11は使用しない。全てデジタルポート
TRISA = 0b00000000 ; // PORTAは全て出力( RA5は入力のみ)
TRISB = 0b00000000 ; // RORTBは全て出力
PORTA = 0b00000000 ; // PORTA初期化
PORTB = 0b00000000 ; // PORTB初期化
/* PWMに関する設定
* CCP3(RA3,2番ピン)を使う
* PWMの周波数は、1000Hz(周期は1ms)
* デューティ比は、50%とする
*/
CCP3CON = 0b00001100; //PWM mode P3A,P3C active high,P3B,P3D active high
CCPTMRS = 0b00000000; //bit5-bit4=00,CCP3にTimer2を割り当てる
PR2 = 124; //Timer2の周期を設定
CCPR3L = 62; //デューティ比 50%
T2CON = 0b00000110; //prescale 1:16 Timer2 start
while(1){
}
OSCCON = 0b01110010 ; // 内蔵クロック8MHz
ANSELA = 0b00000000 ; // AN0-AN4は使用しない。全てデジタルポート
ANSELB = 0b00000000 ; // AN5-AN11は使用しない。全てデジタルポート
TRISA = 0b00000000 ; // PORTAは全て出力( RA5は入力のみ)
TRISB = 0b00000000 ; // RORTBは全て出力
PORTA = 0b00000000 ; // PORTA初期化
PORTB = 0b00000000 ; // PORTB初期化
/* PWMに関する設定
* CCP3(RA3,2番ピン)を使う
* PWMの周波数は、1000Hz(周期は1ms)
* デューティ比は、50%とする
*/
CCP3CON = 0b00001100; //PWM mode P3A,P3C active high,P3B,P3D active high
CCPTMRS = 0b00000000; //bit5-bit4=00,CCP3にTimer2を割り当てる
PR2 = 124; //Timer2の周期を設定
CCPR3L = 62; //デューティ比 50%
T2CON = 0b00000110; //prescale 1:16 Timer2 start
while(1){
}
}