#include \"2407C.H\"
#include \"math.h\"
#define PI 2*3.1415926 // 定义2π的值
float AL;
int DFLAG,N,result,result2,result3;
int t,i;
// 屏蔽中断程序
void inline disable()
{
asm(\" setc INTM\"
;
}
void interrupt nothing()
{asm(\" CLRC INTM\"
;
return; // 中断直接返回
}
void interrupt tint()
{
int flag;
flag=*EVBIFRA&0x0080;
if(flag!=0x0080)
{asm(\" CLRC INTM\"
;
return;}
DFLAG=1;
*CMPR4=result;
*CMPR5=result2;
*CMPR6=result3;
*EVBIFRA=0XFFFF;
asm(\" clrc INTM\");
return;
}
void load()
{static unsigned int i=0;
i=i%20;
result=t*(0.5+AL*sin(i*PI/N));
result2=t*(0.5+AL*sin(i*PI/N+PI/3));
result3=t*(0.5+AL*sin(i*PI/N-PI/3));
i=i+1;
if(i>100) i=0;
return;}
main( )
{
int FCL,FRL;
t=2400; // PWM输出初始化
FCL=1000;
FRL=50;
AL=0.4;
DFLAG=1;
N=FCL/FRL;
disable(); // 总中断禁止
// 系统初始化
asm(\" clrc CNF\"); // B0被配置为数据存储空间
*IMR=0x0002; // 使能第1级中断2
*IFR=0x0FFFF; // 清除全部中断标志,\"写1清0\"
*SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4*CLKIN=24M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WD OVERRIDE
// 即WD保护位,用户可通过将WDCR中的WDDIS置1来禁止WD工作
// 软件禁止看门狗
*MCRC=*MCRC|0X007E; // IOPE1-6被配置为基本功能方式,PWM7-12
*MCRC=*MCRC|0X0600;
*EVBIFRA=0XFFFF;
*T3PR=6400;
*ACTRB=0X0666; // PWM12,10,8 低有效,PWM11,9,7 高有效
*DBTCONB=0X00; // 不使能死区控制
*CMPR4=0X001f;
*CMPR5=0X002f;
*CMPR6=0X003f;
*T3CON=0X0B0E;
// 设置定时器3的周期寄存器,并设置CMPR4-6,以确定不
// 同的输出占空比
*COMCONB=0XA600; // 使能比较操作
*T3CNT=0; // 定时器3为连续增计数模式
*GPTCONB=0X0041;
*EVBIMRA=0X0080;
asm(\" CLRC INTM\");
*T3CON=*T3CON|0x0040;
while(1)
{if(DFLAG==0) continue;
DFLAG=0;
load(); //计算
}
}