由于还处于开发阶段,PI调制和波形换向还没有写上(逆变器用)。
仿真了下,不能从中断返回,由于是初学,查了好久也没有查出问题,高手们帮我看看。
我把PIE1或者GIE任何一个置零,PWM就有波形...所以判断为要么没进中断,要么就是死在中断地方了。
程序如下:
#define uchar unsigned char
#include
//uchar time_num;
uchar sin_num;
//------------------------------------------------------------
//使用PIC16F716芯片
//7,8脚输出50HZ交越信号,9、11脚输出spwm互补波形
//1/20khz=50us 1/50/400=50us
// 由于调9,11脚的SPWM波形,7,8脚的交越信号被我注释掉了,可能看起来有点不便
//------------------------------------------------------------
__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)//查表200次
{
sin_num=0;
}
}
//------------pwm初始化函数-------------------
void pwmInit()
{
PR2=199;
CCP1CON=0x8c;// 1000 1100pwm双输出,占空比高2位清零,
//PWM 模式。P1A, P1C 高电平有效; P1B, P1D 高电平有效;
CCPR1L=50;//占空比清零
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
//TMR0=6;//2MS 初值
}
//------------主函数------------------------
void main(void)
{
init() ;
pwmInit();
sin_num=0;
PEIE=1; //(TM2中断为外设中断)所有未被屏蔽的外设中断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){;}
}
请高手帮我看看,谢谢~ |
|