文档库 最新最全的文档下载
当前位置:文档库 › DSP28335生成正弦波的程序

DSP28335生成正弦波的程序

//产生周期变化的正弦波
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

#include "IQmathLib.h"
#include "qmath.h"
#include "math.h"

#define N 33
#define PI 3.1415925
#define PRD 600
float M=0.8;
int i;
//double a[N];

//unsigned int n=0;
//float Q;

#define PWM1_INT_ENABLE 1
#define PWM2_INT_ENABLE 1
#define PWM3_INT_ENABLE 1

void InitEPwm1Example(void);
//void InitEPwm2Example(void);
//void InitEPwm3Example(void);

interrupt void epwm1_timer_isr(void);
//interrupt void epwm2_timer_isr(void);
//interrupt void epwm3_timer_isr(void);

//void InitCmp();
//extern Uint16 NN,MM;
//Uint16 NN=24,MM=1;
//Uint16 n=0;
Uint16 cmp1[360],cmp2[360],cmp3[360];

Uint32 EPwm1TimerIntCount;
Uint32 EPwm2TimerIntCount;
Uint32 EPwm3TimerIntCount;

void main(void)
{
InitSysCtrl();
InitEPwm1Gpio();
// InitEPwm2Gpio();
// InitEPwm3Gpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &epwm1_timer_isr;
// PieVectTable.EPWM2_INT = &epwm2_timer_isr;
// PieVectTable.EPWM3_INT = &epwm3_timer_isr;
EDIS;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocks
EDIS;

InitEPwm1Example();
// InitEPwm2Example();
// InitEPwm3Example();
// InitCmp();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;

EPwm1TimerIntCount = 0;
EPwm2TimerIntCount = 0;
EPwm3TimerIntCount = 0;

IER |= M_INT3;

PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;
// PieCtrlRegs.PIEIER3.bit.INTx2 = PWM2_INT_ENABLE;
// PieCtrlRegs.PIEIER3.bit.INTx3 = PWM3_INT_ENABLE;
EINT; // Enable Global interrupt INTM
ERTM;
{
asm(" NOP");
}
}



void InitEPwm1Example()
{

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//zhuyi
EPwm1Regs.TBPRD = PRD; //载波周期=2*1500TBCLK
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up down
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO_PRD
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //??
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


// EPwm1Regs.CMPA.half.CMPA =1000;

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on CAU
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // SET PWM1B on CAU,输出互补波形

EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;


//set dead band
//设置中断
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; //? Select INT on Zero Prd event
EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;
}
/*
void InitCmp()
{
// Uint16 i = 0;
if(i{

cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*0.25*(1+M*sin((2*i)*PI/N)+1+M*sin((2*i+1)*PI/N)));
// cmp2[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*4/3)+1+M*sin((2*i+1)*PI/N+PI*4/3)));
// cmp3[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*2/3)+1+M*sin((2*i+1)*PI/N+PI*2/3)));
i++;
}
else
{i=0;}
}*/

//比较值是按正弦波变化的
interrupt void epwm1_timer_isr(void)
{
if(i{
// cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*sin((2*i)*PI/N)
cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*0.25*(1+M*sin((2*i)*PI/N)+1+M*sin((2*i+1)*PI/N)));
// cmp2[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*4/3)+1+M*sin((2*i+1)*PI/N+PI*4/3)));
// cmp3[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*2/3)+1+M*sin((2*i+1)*PI/N+PI*2/3)));

EPwm1Regs.CMPA.half.CMPA = cmp1[i];
i++;
}
else
{i=0;}

EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

相关文档
相关文档 最新文档