×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-20 发布时间:
|

今天发现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)


*/


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式