lybpotter 发表于 2011-4-19 10:07:03

PIC16F716 spwm程序的疑问

由于还处于开发阶段,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={
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++;
        if(sin_num==199)
                {
                        sin_num=0;
                }
        //}
//CCPR1L=SPWMTABLE;
//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;
                        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){;}
}

cap65 发表于 2011-9-5 16:46:35

你的程序 调试出来没?不知数组表 是如何产生的,请教一下!

Ut003 发表于 2014-11-26 13:58:13

这个可用?

Ut003 发表于 2014-11-26 13:58:29

这个可用?压顶 奇才厅
页: [1]
查看完整版本: PIC16F716 spwm程序的疑问