PIC16F + PICC9.50 学习笔记(三)

今天发现CCP开启PWM模式后,输出是固定的引脚,以PIC16F690为例,RC5为固定PWM输出脚。

 

 

 /****************************************************************/
//开启CCP1 使用PWM RC5脚输出 20KHz 占空比为50% 的波形
//
//
/****************************************************************/
#include
#include
__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)  

*/

你可能感兴趣的:(PIC,编程相关)