小弟初学PIC单片机,昨天配置PIC单片机输出PWM波形,照着数据手册上的公式配置10kHz的频率和50%占空比,最终有方波输出,但是频率大约是5KHz而占空比是50%。
公式1:PWM 周期 = [(PR2) + 1] • 4 • T OSC •(TMR2 预分频值 )
公式2:PWM 占空比 = (CCPR4L:CCP4CON<5:4>) •T OSC • (TMR2 预分频值 )
根据公式算出:PR2=PWM周期/( 4 • T OSC •(TMR2 预分频值 ))-1=45
注:Timer2使用4预分频
CCPR4L:CCP4CON<5:4>=PWM 占空比/(T OSC • (TMR2 预分频值 ))
这是我的源代码:
void Timer2_Init();
void Int_Init();
void Init();
void Timer2_PWM_Init();
void main(void)
{
Init();
Int_Init();
Timer2_PWM_Init();
Timer2_Init();
while(1)
{
}
}
//端口初始化
void Init()
{
TRISG = 0x00; //PWM输出
}
//timer2初始化
void Timer2_Init()
{
//T1CON控制寄存器配置
T2CON = 0x01; //4预分频,不后分频
//配置初值
TMR2IF = 0;
PR2 = 45; //设置频率10kHz
TMR2ON = 1; //使能Timer2
}
//PWM(CCP4)模块初始化
void Timer2_PWM_Init()
{
//CCPxCON :CCPx 控制寄存器 (CCP4-CCP10 模块)
CCP4CON = 0x0f; //PWM单输出:PxA、 PxB、 PxC 和 PxD 通过转向控制
//CCPTMRS0 :CCP 定时器选择寄存器 1
C4TSEL1 = 0; //PWM模式分配Timer2
C4TSEL0 = 0;
CCPR4L = 0x17; //设置占空比50%
DC4B1 = 0;
DC4B0 = 0;
}
//Timer0中断初始化
void Int_Init()
{
//INTCON控制寄存器配置
IPEN = 0; //禁止中断优先级
GIEH = 1; //允许所有未屏蔽的中断
GIEL = 1; //允许所有未屏蔽的外设中断,timer1属于外设中断
TMR2IE = 1; // 允许 TMR0 溢出中断
}
void interrupt Timer2_int(void)
{
TMR2IF = 0;
// CCPR1L = 0x05; //设置占空比50%
// DC1B1 = 1;
// DC1B0 = 1;
// PR2 = 21; //设置频率10kHz
} |