📄 main.c
字号:
#include "lf2407regs.h"
#include "math.h"
//#define N 81
#define N 234
#define pi 3.1415926
float M=1.0;
float f=50;
int i;
volatile unsigned int k1=0,k2=N/3,k3=2*N/3;
int led=1;
float lw_cos[N];
int FOOT=1;
#define T 40000000/(2*f*N)
//void inline disable()
//{asm(" setc INTM");}
//void inline enable()
//{asm(" clrc INTM");}
// 系统初始化子程序
int initial()
{ asm(" setc INTM");
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x00FE; // CLKIN=10M,CLKOUT=4*CLKIN=40M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
WSGR=0X00; // 禁止所有的等待状态
*MCRC=0x0000;
*PEDATDIR=0xff00;
}
// EVA模块的PWM初始化程序
int spwminitial()
{
*MCRA=*MCRA|0X0fc0; // IOPE1-6被配置为基本功能方式,PWM1-6
*ACTRA=0X0666; // PWM6,4,2 低有效,PWM5,3,1 高有效
//*DBTCONA=0X01f0; // 使能死区控制
*DBTCONA=0X00;
//*T1PER=40000000/(2*f*N);
*T1PER=T;
*COMCONA=0x8200;
*T1CON=0XC800; // 定时器3为连续增减计数模式
*T1CNT=0;
asm(" clrc INTM");
//enable();
*IMR=*IMR|0x02;//INT2 中断使能
*EVAIMRA=*EVAIMRA|0x0200;//定时器1下溢中断使能
*EVAIFRA=0xffff;
for(i=0;i<N;i++)
{lw_cos[i]=(N/pi)*(cos(i*pi/N)-cos((i+1)*pi/N));
if(lw_cos[i]<0)
lw_cos[i]=-lw_cos[i];
}
//*CMPR1=(*T1PER)*(1-M*lw_cos[0]);
//*CMPR2=(*T1PER)*(1-M*lw_cos[360]);
//*CMPR3=(*T1PER)*(1-M*lw_cos[720]);
}
// 该中断服务程序主要是为了防止干扰,不做任何其它操作
void interrupt nothing()
{ //enable();
return; // 中断直接返回
}
void interrupt Timer1_UFINT()
{
k1+=FOOT;
k2+=FOOT;
k3+=FOOT;
//led+=FOOT;
if(k1>=N)
{
k1=0;
*PEDATDIR=0xff00;
*PEDATDIR=*PEDATDIR|led++;
if(led>=0xff)
led=0;
}
if(k2>=N) k2=0;
if(k3>=N) k3=0;
*CMPR1=(*T1PER)*(1-M*lw_cos[k1]);
*CMPR2=(*T1PER)*(1-M*lw_cos[k2]);
*CMPR3=(*T1PER)*(1-M*lw_cos[k3]);
*EVAIFRA=0x0200;
//enable();
return;
}
// 主程序
main( )
{
//disable(); // 总中断禁止
initial(); // 系统初始化
spwminitial();// PWM输出初始化
*T1CON=*T1CON|0x0040;// 启动定时器1
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -