⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 基于dsp2812逆变电源设计 基于dsp2812逆变电源设计
💻 C
📖 第 1 页 / 共 2 页
字号:
//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
	/*初始化系统*/
	InitSysCtrl();
	
	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/*初始化PIE*/
	Init_Data();
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	InitGpio();
	
	/*初始化外设*/
    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;             //发任意数开始发送数据

	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; //权值系数
		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;	//关闭串口A发送中断
//	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;	//关闭串口A发送中断

	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;    //关T1下溢中断
	#ifdef Debug_Mode
	T1UFInterruptCount++;
	#endif
	
	//A相设置
	//////////////////////////////////////////////	
	if(SpwmData.PhaseA.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
	{
		SpwmData.PhaseA.SampleCount_PerPhase=0;	//若一相位计满,开始下一相位计数
		SpwmData.PhaseA.Phase_SinOut++;			//所在的相位增加
		if(SpwmData.PhaseA.Phase_SinOut>4)
			SpwmData.PhaseA.Phase_SinOut=1;		//若4个相位都计过,则重新从1相位开始
	}
	///////////////////////////////////////////////
	if(SpwmData.PhaseA.Phase_SinOut==1)
	{
		
		if(SpwmData.PhaseA.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT1=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseA.DB_Switch_Flag=0;
			EvaRegs.ACTR.bit.CMP1ACT=2;		//CMP1高有效,打开A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=0;		//CMP2强制低,关闭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强制低,关闭A相下臂
		}
			
	}
	///////////////////////////////////////////
	if(SpwmData.PhaseA.Phase_SinOut==3)
	{
	
		if(SpwmData.PhaseA.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT1=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseA.DB_Switch_Flag=0;
			EvaRegs.ACTR.bit.CMP1ACT=0;		//CMP1强制低,关闭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强制低,关闭A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=2;		//CMP2高有效,打开A相下臂

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -