我用PIC16F684单片机产生两路频率不断变化的互补且占空比为0.5的PWM波形,结果波形中总是有间歇,如图所示,请高手指教
源程序如下:#include <pic.h>
//系统配置
__CONFIG(HS&WRTEN&BOREN&ROTECT&WDTDIS);
//打开看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护,复位引脚使能
//***********************************变量定义**************************************
//周期寄存器值查询表
const unsigned char pr2_[]={109,108,108,107,107,106,106,105,105,104,
103,102,101,101,100,99,99,98,98,97,
97,96,95,94,94,94,93,93,92,92,
91,90,90,89,89,88,87,87,86,86,
84,84,83,82,82,81,80,79,78,76,
76,74,73,73,72,71,70,69,68,67,
66,66,65,64,63,62,62,61,61,60,
60,59,59,58,58,57,57,56,56,56,
55,55,55,54,54,54,53,53,53,53,
52,52,52,52,51,51,51,51,50,50,
50,50,49,49,49,49,48,48,48,48,
48,48,47,47,47,47,47,47,47,47,
47,47,47,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46};
const unsigned char pr3_[]={46,46,46,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,47,47,
47,47,47,47,47,47,47,47,47,48,
48,48,48,48,48,49,49,49,49,50,
50,50,50,51,51,51,51,52,52,52,
52,53,53,53,53,54,54,54,55,55,
55,56,56,56,57,57,58,58,59,59,
60,60,62,62,63,64,65,66,66,67,
68,69,70,71,72,73,73,74,75,76,
78,79,80,81,82,82,83,84,85,86,
86,87,87,88,89,89,90,90,91,92,
92,93,93,94,94,94,95,96,97,97,
98,98,99,99,100,101,101,102,103,104,
105,105,106,106,107,107,108,108,109};
unsigned char pr2_1; //转换结果存储中间值
unsigned char pr3_1;
int j;
//*********************************子程序*******************************************
void CCPINIT() //CCP模块的PWM工作方式初始化子程序
{
INTCON=0X00; //禁止总中断和外围中断
CCP1CON=0X8C; //设置CCP1模块为半桥式PWM工作方式
PR2=89; //初始周期
CCPR1L=PR2/2; //初始占空比
PWM1CON=0X0B; //死区2.75uS
TRISC=0X01; //设置PORTC引脚为输出方式
}
void RA_INT() //RA和RC端口初始化
{
ANS0=1;
ANS4=1;
ANS2=0;
TRISA=0x3F; //配置RA口为输入
INTEDG=0; //INT中断下降沿
}
//TMR0初始化
void TMR0_INT()
{
T0CS=0; //内部指令周期计数
PSA=1; //预分频为1:1
T0IE=1;
TMR0=178;
}
//中断服务程序
void interrupt A_INT()
{
if(INTF)
{
INTF=0;
j=0;
}
if(T0IF) //定时器0中断,20us中断一次
{
T0IF=0;
j=j+1;
TMR0=TMR0+178; //定时器0写初值
}
}
//***************************************主程序*******************************************
main()
{
CCPINIT(); //CCP模块的PWM工作方式初始化
TMR0_INT();
RA_INT();
PEIE=1; //外围模块中断使能
GIE=1;
INTE=1;
j=0;
T2CON=0X04; //打开TMR2,且使其前分频为0,同时开始输出PWM波形
while(1) //主循环
{
if(j<65) //根据时间变量j设置PWM的工作周期
{
PR2=220;
CCPR1L=110;
}
else if(j<206)
{
pr2_1=j-65;
PR2=pr2_[pr2_1]*2;
CCPR1L=pr2_[pr2_1];
}
else if(j<259)
{
PR2=90;
CCPR1L=45;
}
else if(j<398)
{
pr3_1=j-259;
PR2=pr3_[pr3_1]*2;
CCPR1L=pr3_[pr3_1];
}
else if(j<501)
{
PR2=220;
CCPR1L=110;
}
else
{
j=500;
}
}
} |