📄 spwm_m.c
字号:
#include "DSP28_Device.h"
//#include "stdio.h"
#include "math.h"
//#include "float.h"
//#define NX 404
#define NX 404 // for test
#define PI 3.1415925
#define LimMax 0.6 //for change 0-0.95
#define LimMin 0.1
float M=0.9; // for change 0-0.9 //此值是加力,加幅值.
int k0,h1,h2;
double a[NX];
int tp = 2500; //for change 1250- 3750
void zkb();
interrupt void eva_T1UFINT_ISR(void);
void InitEva(void);
void main(void){
k0 = 0;
h1 = 0;
h2 = 0;
InitSysCtrl();
DINT; //禁止全局中断
IER=0;
IFR=0;
EALLOW;
// Enable PWM pins
GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins
// GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins
EDIS;
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieVectTable.T1UFINT=&eva_T1UFINT_ISR;
EDIS;
IER|=M_INT2;
PieCtrl.PIEIER2.bit.INTx6=1;
InitEva();
zkb();
EvaRegs.T1CON.all=EvaRegs.T1CON.all|0x0040; //启动定时器1
EINT;
while(1)
{
asm("NOP");
}
}
void zkb()
{
unsigned int n=0;
float q,l,j;
while (n<=NX)
{
q=(n+0.75); //为消除偶次偕波,减少谐波角度出发,选择从A相3/4周期进行采样
q=q*2*PI;
q/=(NX+1);
j=sin(q);
l=0.5*tp*(1+M*j);//M为调制比 //计算占空比表达式
if((l>=(tp*LimMin))&&(l<=(tp*LimMax)))
{
a[n]=l;
}
else
{
if(l>(tp*LimMax))
a[n]=tp*LimMax;
else
a[n]=tp*LimMin;
}
n=n+1;
}
}
interrupt void eva_T1UFINT_ISR(void) // EV-A
{
int h2;
int flag;
flag=(EvaRegs.EVAIFRA.all) & 0x0200; //T1UFINT中下益中断标志位置1
if(flag!=0x0200)
{
EINT;
return;
}
else
{
if(k0<=NX)
{
h1=k0+135; //B相表达式
if(h1>=404)
h1=h1-404;
h2=k0+270; //C相表达式
if(h2>=404)
h2=h2-404;
EvaRegs.CMPR1=a[k0];
EvaRegs.CMPR2=a[h1];
EvaRegs.CMPR3=a[h2];
k0=k0+1;
}
else
{
k0=0;
}
}
EvaRegs.EVAIMRA.bit.T1UFINT=1;
EvaRegs.EVAIFRA.bit.T1UFINT=1;
PieCtrl.PIEACK.all=0x0002;
EINT; //开全局中断
}
void InitEva(void)
{
EvaRegs.ACTR.all=0x0666;
EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
EvaRegs.COMCONA.all = 0xa600; //使能比较操作
EvaRegs.EVAIMRA.all=0x0200; //EVAIMRA(EVA的中断屏蔽寄存器A).T1PINT(通用定时器1的周期中断使能)
EvaRegs.EVAIMRB.all=0x0000;
EvaRegs.EVAIMRC.all=0x0000;
EvaRegs.EVAIFRA.all=0xffff;//EVAIFRA(EVA的中断标志寄存器.T1PINT(通用定时器1的周期中断标志)
EvaRegs.EVAIFRB.all=0xffff;//写1清除定时器1的周期中断标志
EvaRegs.EVAIFRC.all=0xffff;
EvaRegs.CMPR1=0;
EvaRegs.CMPR2=0;
EvaRegs.CMPR3=0;
EvaRegs.GPTCONA.all=0x0041;
EvaRegs.T1PR = tp; // Timer1 period PWM载波周期为 65536个定标的定时器时钟周期
EvaRegs.T1CNT = tp*0.25;
EvaRegs.T1CON.all = 0x094e;
EINT;
return;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -