今天发现CCP开启PWM模式后,输出是固定的引脚,以PIC16F690为例,RC5为固定PWM输出脚。
/****************************************************************/
//开启CCP1 使用PWM RC5脚输出 20KHz 占空比为50% 的波形
//
//
/****************************************************************/
#include <pic.h>
#include <pic16f685.h>
__CONFIG(WDTEN & PWRTEN & MCLREN & BOREN & IESODIS & FCMDIS & INTIO);
//-------------中断服务程序------------------------------------
void interrupt isr()
{
if(TMR2IE==1&&TMR2IF==1)
{
TMR2IF=0;
}
}
void SpwmInit()
{
OSCCON=0x7f;
TRISC5=1;
PR2=0x63;
CCP1CON=0b00001111;
CCPR1L= 0b00110010;
TMR2IF=0;
T2CON=0;
GIE=0;
TMR2IE=1;
PEIE=1;
TMR2ON=1;
}
main()
{
SpwmInit();
TRISC5=0;
while(1)
{
}
}
/*
PWM周期 = [(PR2) + 1] * 4 * TOSC *(TMR2预分频值)
注: TOSC = 1/FOSC
脉冲宽度= (CCPR1L:CCP1CON<5:4>) * TOSC * (TMR2预分频值)
占空比= (CCPR1L:CCP1CON<5:4>)/4(PR2 + 1)
分辨率= log[4(PR2 + 1)]/log(2)位
------------
PWM 频率 1.22 kHz 4.90 kHz 19.61 kHz 76.92 kHz 153.85 kHz 200.0 kHz
定时器预分频值(1、4和16) 16 4 1 1 1 1
PR2 值 0x65 0x65 0x65 0x19 0x0C 0x09
最大分辨率(位) 8 8 8 6 5 5
OSCCON=0x7f; //8MHZ
PR2= 0x63 =99
PWM周期 = 50us = (99+1)* 4 * TOSC *(TMR2预分频值) = 400* 1/8MHZ = 50
(CCPR1L:CCP1CON<5:4>) =(0b00110010 :0b00001111)= 0b0011001000 = 200 //CCP1CON<5:4> 取5,4位 =00 即 0b00“00”1111
脉冲宽度 = (CCPR1L:CCP1CON<5:4>) * TOSC * (TMR2预分频值) =(0b00110010 :0b00001111)* 1/8 = 200 * 1/8=25us
占空比= 50% = (CCPR1L:CCP1CON<5:4>)/4(PR2 + 1) = 200 /4* (99+1) =200/400 = 1/2
分辨率= 8= log[4(PR2 + 1)]/log(2) = log(400)/log(2)
*/