由于还处于开发阶段,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){;}
}
一周热门 更多>