📄 sci_v_nd_spwm.c
字号:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "float.h"
#include "math.h"
#define PI 3.1415926
volatile unsigned int f_s,N,i;/*f_s:信号频率,N:调制比*/
volatile float M,sindata,Tz;
volatile float *pa,*Dataram;
volatile long int ftime=15000;//CPU频率为150M=150 00*10000
interrupt void T1P_PWMISR(void);
#pragma CODE_SECTION(T1P_PWMISR, "ramfuncs");
interrupt void T1P_PWMISR(void) // EV-A
{
// Insert ISR Code here
// To receive more interrupts from this PIE group, acknowledge this interrupt
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
if(EvaRegs.EVAIFRA.all&&0x0080)
{
if(i>=N)
i=0;
EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
}
i++;
EvaRegs.EVAIFRA.bit.T1PINT=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|= PIEACK_GROUP2; // Issue PIE ack
asm(" clrc INTM");
}
void Init_spwm(void)
{
f_s=400;
M=0.9;
N=99;//对应于f_s=400,fc=39.6k
while(N<=40000)
N+=3;
Tz=10000*1.0/(f_s*N);
}
//Gpio 初始化
void Init_Gpio(void)
{EALLOW;
GpioMuxRegs.GPAMUX.all=0x0003;//pwm0 1
GpioMuxRegs.GPADIR.all=0x0003;//OUT
GpioMuxRegs.GPDMUX.all=0x0000;//state
GpioMuxRegs.GPADIR.all=0x0000;
EDIS;
}
//EVA 初始化
void Init_EVA(void)
{/*T1 time 比较输出*/
EvaRegs.GPTCONA.all=0xe065;
EvaRegs.ACTRA.all=0x0666;//比较方式控制
EvaRegs.T1PR=Tz*ftime/2;
EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
EvaRegs.DBTCONA.all=0x0f35;//死区1us
EvaRegs.T1CNT=0x0000;
EvaRegs.COMCONA.all=0x4b00;
EvaRegs.COMCONA.all=0xcb00;//使能比较
EvaRegs.T1CON.all=0xc80c;
EvaRegs.T1CON.all=0xc84c;
}
//sin值
void Init_sindata(void)
{ sindata=0;
Dataram=(float*)0x100000;
for(i=1;i<=N;i++)
{sindata=2*PI;
sindata=sindata*f_s;
sindata=sindata*i*Tz/10000;
sindata=sin(sindata);
*Dataram++=sindata;
}
}
void main(void)
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0000;
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;
Init_Gpio();
Init_spwm();
Init_sindata();
i=0;
pa=(float*)0x100000;
Init_EVA();
DINT;
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;//开INT2 CPU 中断
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1PINT = &T1P_PWMISR;
EDIS;
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER2.bit.INTx4 = 1;
EvaRegs.EVAIMRA.all=0x0080;//开T1周期中断
EvaRegs.EVAIFRA.all=0x0080;//清T1周期中断
IER|= M_INT2;//开INT2 CPU 中断
EnableInterrupts();
pa=(float*)0x100000;
for(;;);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -