PIC16F716 spwm程序的疑问

2020-02-06 10:23发布

由于还处于开发阶段,PI调制和波形换向还没有写上。(正弦波逆变器用)

仿真了下,不能从中断返回,由于是初学,查了好久也没有查出问题,高手们帮我看看。

把PIE1或者GIE 中的任意一个置0,CCP1就有PWM波形输出,所以怀疑是中断部分有问题。程序如下:


#define uchar unsigned char
#include <pic.h>
//uchar time_num;//7,8脚50Hz交越型号计数器
uchar sin_num;
//------------------------------------------------------------  
//使用PIC16F716芯片
//7,8脚输出50HZ交越信号,9、11脚输出spwm互补波形
//1/20khz=50us 1/50/400=50us
//
//------------------------------------------------------------  
__CONFIG(HS&WDTDIS);
//----------------------------------------------------------
const unsigned char SPWMTABLE[200]={
0 ,         4 ,         4 ,         8 ,         8 ,         8 ,         12 ,         12 ,         16 ,         16 ,       
20,         20,         20,         96,         96,         28 ,         28 ,         28 ,         32 ,         32 ,       
36 ,         36 ,         40 ,         40 ,         40 ,         44 ,         44 ,         48 ,         48 ,         48 ,       
52 ,         52 ,         52 ,         56 ,         56 ,         60 ,         60 ,         60 ,         64 ,         64 ,       
64 ,         68 ,         68 ,         68 ,         72 ,         72 ,         72 ,         76 ,         76 ,         76 ,       
80 ,         80 ,         80 ,         80 ,         84 ,         84 ,         84 ,         88 ,         88 ,         88 ,       
88 ,         92 ,         92 ,         92 ,         92 ,         96 ,         96 ,         96 ,         96 ,         96 ,       
100,         100,         100,         100,         100,         100,         104,         104,         104,         104,       
104,         104,         104,         108,         108,         108,         108,         108,         108,         108,       
108,         108,         108,         108,         108,         108,         108,         108,         108,         108,       
108,         108,         108,         108,         108,         108,         108,         108,         108,         108,       
108,         108,         108,         108,         108,         108,         108,         104,         104,         104,       
104,         104,         104,         104,         100,         100,         100,         100,         100,         100,       
96,         96,         96,         96,         96,         92,         92,         92,         92,         88,       
88,         88,         88,         72,         72,         72,         80,         80,         80,         80,       
76 ,         76,         76 ,         72 ,         72 ,         72 ,         68 ,         68 ,         68 ,         64 ,       
64 ,         64,         60 ,         60 ,         60 ,         56 ,         56 ,         52 ,         52 ,         52 ,       
48 ,         48 ,         48 ,         44 ,         44 ,         40 ,         40 ,         40 ,         36 ,         36 ,       
32 ,         32 ,         28,         28 ,         28 ,         24 ,         24 ,         20 ,         20 ,         20 ,       
16 ,         16 ,         12 ,         12 ,         8 ,         8 ,         8 ,         4 ,         4 ,         0        
};//CCPR1L查表值,一个周期为RP2+1=199+1=200
//200 为50us  所以计算值*4即可
//脉冲周期是正弦波的周期除以脉冲个数 1/50/400=50uS
//------------------------------------------------------

//-------------中断服务程序------------------------------------  
void interrupt timer2()  
{  
//if(TMR2IE==1&&TMR2IF==1)
        //{
        TMR2IF=0;
    CCPR1L=SPWMTABLE[sin_num];
    sin_num++;
        if(sin_num==199)
                {
                        sin_num=0;
                }
        //}
//CCPR1L=SPWMTABLE[sin_num];
//sin_num++;
}

   
//------------pwm初始化函数-------------------
void pwmInit()
{
PR2=199;
CCP1CON=0x8c;// 1000 1100pwm双输出,占空比高2位清零,
//PWM 模式。P1A, P1C 高电平有效; P1B, P1D 高电平有效;
CCPR1L=0;//占空比清零
TMR2IF=0; //Timer2 中断标志位清零
T2CON=0x24; //0010 0100预分频1,后分频5,使能timer2
TMR2IE=1; //允许TMR2 和 PR2 匹配中断
}
//------------主函数------------------------
void init()
{TRISB=0;//D端口为输出
        PORTB=0X00;
        //OPTION=0x04;//0000 0100 预分频配置到timer0定时器,预分频为1:32(7,8脚定时器初始化)
        //TMR0=6;//2MS 初值
}
void main(void)  
{
init() ;
pwmInit();
sin_num=0;
PEIE=1; //(TMR2中断为外设中断)所有未被屏蔽的外设中断1开放0关闭
GIE=1; //使能所有未被屏蔽的中断1使能0关闭
/*while(1)//7,8 50Hz交越信号调试时候被我注释了
           {
                       
                        CCPR1L=SPWMTABLE[sin_num];
                        if(sin_num==199)
                        {sin_num=0;}
                        if(T0IF==1)
                           {TMR0=6;
                        T0IF=0;
                        time_num++;
                        }//2ms
                        if(time_num==5)
                           {time_num=0;
                                RB1=!RB1;
                                RB2=!RB2;}
                }*/
while(1){;}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。