[资料分享] DSP2812的SVPWM波形实现程序

Aguilera   2017-10-15 16:47 楼主

// file name: svpwm.c
//generate svpwm waveforms
#include "math.h"
#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"
#include
   // DSP281x Examples Include File

//global variables
float Tz=2e-4;
int Vdc=600;
//float PI=3.1415;
//int f=50;

// Prototype statements for functions found in this file.
void svpwm(float *ptr,float uapha,float ubeta,float Tswitch,int vdc_link);
void init_eva(void);


void main(void)
{
float cmpr[3]={0,0,0};//cmpr[3]={CMPR1,CMPR2,CMPR3)
float *ptrc=&cmpr[0];//point to the addrs of cmpr
float v_aphar=100;//reference value of vaphar
float v_betar=-20;//reference value of vbetar
//float tstep=0.0000001;
//float tend=5
//float w=2*PI*f;
//float y=sin(w*t);

// Step 1. Initialize System Control:
// PLL--30MHz*10/2, disable WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
InitGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
    DINT;       //asm(" setc INTM")

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
   //InitPieCtrl();
   
// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
// InitPieVectTable();
   
   init_eva();
svpwm(ptrc,v_aphar,v_betar,Tz,Vdc);
   
EvaRegs.CMPR1 = cmpr[0]*75e6;
EvaRegs.CMPR2 = cmpr[1]*75e6;
EvaRegs.CMPR3 = cmpr[2]*75e6;

}
//********************************************
//function:    svpwm
//discription:
//********************************************

void svpwm(float *ptr,float uapha,float ubeta,float Tswitch,int vdc_link)
{

int A,B,C,N;
double X,Y,Z,Tx,Ty,T0,Tl,Tm,Th;

if (ubeta>0) A = 1;
else A=0;
   
if ((1.732051*uapha-ubeta)>0) B = 1;
else B=0;

if ((-1.732051*uapha-ubeta)>0) C = 1;
else C=0;

N=A+2*B+4*C;

X=1.732051*ubeta*Tswitch/vdc_link;
Y=(0.8660*ubeta+1.5*uapha)*Tswitch/vdc_link;
Z=(-0.8660*ubeta+1.5*uapha)*Tswitch/vdc_link;

switch (N)
{
    case 1: Tx= Y;Ty=-Z;break;
    case 2: Tx=-X;Ty= Y;break;
    case 3: Tx= Z;Ty= X;break;
    case 4: Tx=-Z;Ty=-X;break;
    case 5: Tx= X;Ty=-Y;break;
   default: Tx=-Y;Ty= Z;
}

if ((Tx+Ty)>Tswitch)
{
Tx=Tx*Tswitch/(Tx+Ty);
Ty=Ty*Tswitch/(Tx+Ty);
}

T0=(Tswitch-(Tx+Ty))/4;
Tl=(Tswitch+Tx-Ty)/4;/*Tl=T0/4+Tx/2*/
Tm=(Tswitch-Tx+Ty)/4;/*Tm=T0/4+Ty/2*/
Th=(Tswitch+Tx+Ty)/4;/*Th=T0/4+Ty/2+Ty/2*/

switch (N)
{
    case 1 :*ptr=Tm; *(ptr+1)=T0; *(ptr+2)=Th;break;
    case 2 :*ptr=T0; *(ptr+1)=Th; *(ptr+2)=Tm;break;
    case 3 :*ptr=T0; *(ptr+1)=Tl; *(ptr+2)=Th;break;
    case 4 :*ptr=Th; *(ptr+1)=Tm; *(ptr+2)=T0;break;
    case 5 :*ptr=Th; *(ptr+1)=T0; *(ptr+2)=Tl;break;
   default :*ptr=Tl; *(ptr+1)=Th; *(ptr+2)=T0;
}

}

void init_eva()
{

// EVA Configure T1PWM, T2PWM, PWM1-PWM6
// Initalize the timers
   // Initalize EVA Timer1
   EvaRegs.T1PR = 0x1D4C;       // Timer1 period   HSPCLK/fz=75E6/5E3=15000,T1PR=15000/2=0X1D4C
   //EvaRegs.T1CMPR = 0x3C00;     // Timer1 compare
   EvaRegs.T1CNT = 0x0000;      // Timer1 counter
   // TMODE = continuous up/down
   // Timer enable
   // Timer compare enable
   //EVA_INPUT_CLK=HSPCLK/1=75MHZ
   EvaRegs.T1CON.all = 0x0842;  


// Initalize EVA Timer2
//EvaRegs.T2PR = 0x0FFF;       // Timer2 period
// EvaRegs.T2CMPR = 0x03C0;     // Timer2 compare
//EvaRegs.T2CNT = 0x0000;      // Timer2 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
//EvaRegs.T2CON.all = 0x1042;  


// Setup T1PWM and T2PWM
// Drive T1/T2 PWM by compare logic
EvaRegs.GPTCONA.bit.TCMPOE = 1;
// Polarity of GP Timer 1 Compare = Active low
EvaRegs.GPTCONA.bit.T1PIN = 1;
// Polarity of GP Timer 2 Compare = Active high
EvaRegs.GPTCONA.bit.T2PIN = 2;

// Enable compare for PWM1-PWM6
EvaRegs.CMPR1 = 0x0C00;
EvaRegs.CMPR2 = 0x3C00;
EvaRegs.CMPR3 = 0xFC00;
   
// Compare action control. Action that takes place
// on a cmpare event
// output pin 1 CMPR1 - active high
// output pin 2 CMPR1 - active low
// output pin 3 CMPR2 - active high
// output pin 4 CMPR2 - active low
// output pin 5 CMPR3 - active high
// output pin 6 CMPR3 - active low
EvaRegs.ACTRA.all = 0x0666;
EvaRegs.DBTCONA.all = 0x0FF8; // deadband time is 3.2us
//compare enable
//reload when T1CNT=0
//hardware svpwm mode disable
//FCMPOE=1 ENABLE
EvaRegs.COMCONA.all = 0x8200;

}


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复