?? power.c
字號:
//File_name: Power.c
//Function: 逆變電源的控制
//Author: 郭建成
//Creat Date: 2007/5/30
//Finish Date: 2007
//#include "math.h"
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
//#define Adapt_Filter
//#define Debug_Mode
float Sin_50[]=
{ 0,0.031411,0.062791,0.094108,0.12533,0.15643,0.18738,0.21814,0.24869,0.27899,
0.30902,0.33874,0.36812,0.39715,0.42578,0.45399,0.48175,0.50904,0.53583,0.56208,
0.58779,0.61291,0.63742,0.66131,0.68455,0.70711,0.72897,0.75011,0.77051,0.79016,
0.80902,0.82708,0.84433,0.86074,0.87631,0.89101,0.90483,0.91775,0.92978,0.94088,
0.95106,0.96029,0.96858,0.97592,0.98229,0.98769,0.99211,0.99556,0.99803,0.99951,1
};
float Sin_400[]=
{ 0,0.1564,0.3090,0.4540,0.5878,0.7071,0.8090,0.8910,0.9511,0.9877,1};
float Sin_500[]=
{ 0,0.1736,0.3420,0.5000,0.6428,0.7660,0.8660,0.9397,0.9848,1};
#ifdef Adapt_Filter
float source[200];
int Sample_Num=10,Total_Num=200;
float result[200];
void adapt_filter();
#endif
void SendData(Uint16 data);
void Init_Data();
void Init_Spwm_Data();
void Init_scia_Data();
void Init_AD_Data();
// Prototype statements for functions found within this file.
interrupt void T1UF_Interrupt_Isr();
interrupt void SCIA_TX_Isr();
interrupt void SCIA_RX_Isr();
interrupt void AD_Interrupt_Isr();
#ifdef Debug_Mode
Uint32 T1UFInterruptCount=0;
Uint32 ADInterruptCount=0;
#endif
Uint16 LedCount = 0;
Uint16 SpiCount = 0;
void main(void)
{
#ifdef Adapt_Filter
int i;
#endif
/*初始化系統(tǒng)*/
InitSysCtrl();
/*關(guān)中斷*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
Init_Data();
InitPieCtrl();
/*初始化PIE中斷矢量表*/
InitPieVectTable();
InitGpio();
/*初始化外設(shè)*/
InitPeripherals();
InitXIntrupt();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1UFINT=&T1UF_Interrupt_Isr;
PieVectTable.TXAINT=&SCIA_TX_Isr;
PieVectTable.RXAINT=&SCIA_RX_Isr;
PieVectTable.ADCINT=&AD_Interrupt_Isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// IER |=(M_INT1|M_INT2|M_INT9);
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
SciaRegs.SCITXBUF=0; //發(fā)任意數(shù)開始發(fā)送數(shù)據(jù)
while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
#ifdef Adapt_Filter
for(i=0;i<200;i++)
{
source[i]=sin(3.14159/Sample_Num*i);
source[i]+=(float)rand()/32767;
source[i]+=(float)rand()/32767;
}
adapt_filter();
#endif
for(;;);
}
#ifdef Adapt_Filter
void adapt_filter()
{
int i,k=5;
float u=0.0005; //收斂因子
float Ref_Signal1,Ref_Signal2,Ref_Signal3,Ref_Signal4, err;
float w1_now,w1_past,w2_now,w2_past,w3_now,w3_past,w4_now,w4_past; //權(quán)值系數(shù)
w1_now=0.2;
w2_now=0.1;
w3_now=0.05;
w4_now=0.02;
for(i=0;i<Total_Num;i++)
{
Ref_Signal1=k*sin(3.14159/Sample_Num*(i));
Ref_Signal2=k*sin(3.14159/Sample_Num*(i)+0.7);
Ref_Signal3=k*sin(3.14159/Sample_Num*(i)+1.4);
Ref_Signal4=k*sin(3.14159/Sample_Num*(i)+2.2);
w1_past=w1_now;
w2_past=w2_now;
w3_past=w3_now;
w4_past=w4_now;
result[i]=w1_now*Ref_Signal1+w2_now*Ref_Signal2+w3_now*Ref_Signal3+w4_now*Ref_Signal4;
err=source[i]-result[i];
w1_now=w1_past+2*u*err*Ref_Signal1;
w2_now=w2_past+2*u*err*Ref_Signal2;
w3_now=w3_past+2*u*err*Ref_Signal3;
w4_now=w4_past+2*u*err*Ref_Signal4;
}
}
#endif
void Init_Data()
{
Init_Spwm_Data();
Init_scia_Data();
Init_AD_Data();
}
void Init_scia_Data()
{
Uint16 i;
SciaData.Tx_Flag=0;
for(i=0;i<100;i++)
SciaData.Buffer_Data[i]=0xFF;
SciaData.Rx_Count=0;
SciaData.Tx_Count=0;
}
void Init_AD_Data()
{
AdData.adclo=0;
AdData.AdCount=0;
}
interrupt void AD_Interrupt_Isr()
{
#ifdef Debug_Mode
ADInterruptCount++;
#endif
AdData.AdCount++;
AdData.Result_Data[0]=((float)AdcRegs.RESULT0)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[1]=((float)AdcRegs.RESULT1)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[2]=((float)AdcRegs.RESULT2)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[3]=((float)AdcRegs.RESULT3)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[4]=((float)AdcRegs.RESULT4)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[5]=((float)AdcRegs.RESULT5)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[6]=((float)AdcRegs.RESULT6)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[7]=((float)AdcRegs.RESULT7)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[8]=((float)AdcRegs.RESULT8)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[9]=((float)AdcRegs.RESULT9)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[10]=((float)AdcRegs.RESULT10)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[11]=((float)AdcRegs.RESULT11)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[12]=((float)AdcRegs.RESULT12)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[13]=((float)AdcRegs.RESULT13)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[14]=((float)AdcRegs.RESULT14)*3.0/65520.0+AdData.adclo;
AdData.Result_Data[15]=((float)AdcRegs.RESULT15)*3.0/65520.0+AdData.adclo;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
PieCtrl.PIEACK.all|=PIEACK_GROUP1;
}
interrupt void SCIA_TX_Isr()
{
SciaRegs.SCICTL2.bit.TXINTENA=0; //關(guān)閉串口A發(fā)送中斷
// if(SciaData.Tx_Flag>0)
{
SciaRegs.SCITXBUF=SciaData.Buffer_Data[SciaData.Tx_Count];
SciaData.Tx_Count++;
if(SciaData.Tx_Count>=100)
SciaData.Tx_Count=0;
SciaData.Tx_Flag--;
}
PieCtrl.PIEACK.all|=PIEACK_GROUP9;
SciaRegs.SCICTL2.bit.TXINTENA=1; //打開串口A接收中斷
}
interrupt void SCIA_RX_Isr()
{
SciaRegs.SCICTL2.bit.RXBKINTENA=0; //關(guān)閉串口A發(fā)送中斷
SciaData.Buffer_Data[SciaData.Rx_Count]=SciaRegs.SCIRXBUF.all;
SciaData.Rx_Count++;
if(SciaData.Rx_Count>=100)
SciaData.Rx_Count=0;
SciaData.Tx_Flag++;
if(SciaRegs.SCICTL2.bit.TXRDY)
{
SciaRegs.SCITXBUF=SciaData.Buffer_Data[SciaData.Tx_Count];
SciaData.Tx_Count++;
if(SciaData.Tx_Count>=100)
SciaData.Tx_Count=0;
}
PieCtrl.PIEACK.all|=PIEACK_GROUP9;
SciaRegs.SCICTL2.bit.RXBKINTENA=1; //打開串口A接收中斷
}
interrupt void T1UF_Interrupt_Isr()
{
EvaRegs.EVAIMRA.bit.T1UFINT=0; //關(guān)T1下溢中斷
#ifdef Debug_Mode
T1UFInterruptCount++;
#endif
//A相設(shè)置
//////////////////////////////////////////////
if(SpwmData.PhaseA.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
{
SpwmData.PhaseA.SampleCount_PerPhase=0; //若一相位計(jì)滿,開始下一相位計(jì)數(shù)
SpwmData.PhaseA.Phase_SinOut++; //所在的相位增加
if(SpwmData.PhaseA.Phase_SinOut>4)
SpwmData.PhaseA.Phase_SinOut=1; //若4個(gè)相位都計(jì)過,則重新從1相位開始
}
///////////////////////////////////////////////
if(SpwmData.PhaseA.Phase_SinOut==1)
{
if(SpwmData.PhaseA.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT1=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseA.DB_Switch_Flag=0;
EvaRegs.ACTR.bit.CMP1ACT=2; //CMP1高有效,打開A相上臂
EvaRegs.ACTR.bit.CMP2ACT=0; //CMP2強(qiáng)制低,關(guān)閉A相下臂
}
else
EvaRegs.DBTCONA.bit.EDBT1=0;
}
/////////////////////////////////////
if(SpwmData.PhaseA.Phase_SinOut==2)
{
if(SpwmData.PhaseA.DB_Switch_Flag==0)
{
SpwmData.PhaseA.DB_Switch_Flag=1;
EvaRegs.ACTR.bit.CMP1ACT=2; //CMP1高有效,打開A相上臂
EvaRegs.ACTR.bit.CMP2ACT=0; //CMP2強(qiáng)制低,關(guān)閉A相下臂
}
}
///////////////////////////////////////////
if(SpwmData.PhaseA.Phase_SinOut==3)
{
if(SpwmData.PhaseA.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT1=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseA.DB_Switch_Flag=0;
EvaRegs.ACTR.bit.CMP1ACT=0; //CMP1強(qiáng)制低,關(guān)閉A相上臂
EvaRegs.ACTR.bit.CMP2ACT=2; //CMP2高有效,打開A相下臂
}
else
EvaRegs.DBTCONA.bit.EDBT1=0;
}
///////////////////////////////////////////////
if(SpwmData.PhaseA.Phase_SinOut==4)
{
if(SpwmData.PhaseA.DB_Switch_Flag==0)
{
SpwmData.PhaseA.DB_Switch_Flag=1;
EvaRegs.ACTR.bit.CMP1ACT=0; //CMP1強(qiáng)制低,關(guān)閉A相上臂
EvaRegs.ACTR.bit.CMP2ACT=2; //CMP2高有效,打開A相下臂
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -