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

📄 power.c

📁 基于dsp2812逆变电源设计 基于dsp2812逆变电源设计
💻 C
📖 第 1 页 / 共 2 页
字号:
		}

	}

	///////////////////////////////////////////////////////
	if(SpwmData.PhaseA.Phase_SinOut==1||SpwmData.PhaseA.Phase_SinOut==3)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_50[SpwmData.PhaseA.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_400[SpwmData.PhaseA.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_500[SpwmData.PhaseA.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)+1])*SpwmData.TPR_Modelation;
	}

	if(SpwmData.PhaseA.Phase_SinOut==2||SpwmData.PhaseA.Phase_SinOut==4)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_50[SpwmData.SampleSum_PerPhase-SpwmData.PhaseA.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_400[SpwmData.SampleSum_PerPhase-SpwmData.PhaseA.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_500[SpwmData.SampleSum_PerPhase-SpwmData.PhaseA.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)-1]*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;	
	}
	SpwmData.PhaseA.SampleCount_PerPhase++;


	//B相SPWM的设置
	//////////////////////////////////////////////////////////
	if(SpwmData.PhaseB.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
		{
			SpwmData.PhaseB.SampleCount_PerPhase=0;	//若一相位计满,开始下一相位计数
			SpwmData.PhaseB.Phase_SinOut++;			//所在的相位增加
			if(SpwmData.PhaseB.Phase_SinOut>4)
				SpwmData.PhaseB.Phase_SinOut=1;		//若4个相位都计过,则重新从1相位开始
		}
	//////////////////////////////////////////////////////////
	if(SpwmData.PhaseB.Phase_SinOut==1)
	{
		
		if(SpwmData.PhaseB.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT2=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseB.DB_Switch_Flag=0;
			EvaRegs.ACTR.bit.CMP1ACT=2;		//CMP1高有效,打开A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=0;		//CMP2强制低,关闭A相下臂				
		}
		else
			EvaRegs.DBTCONA.bit.EDBT2=0;
			
	}
	/////////////////////////////////////
	if(SpwmData.PhaseB.Phase_SinOut==2)
	{
		
		if(SpwmData.PhaseB.DB_Switch_Flag==0)
		{
			SpwmData.PhaseB.DB_Switch_Flag=1;
			EvaRegs.ACTR.bit.CMP1ACT=2;		//CMP1高有效,打开A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=0;		//CMP2强制低,关闭A相下臂
		}
			
	}
	///////////////////////////////////////////
	if(SpwmData.PhaseB.Phase_SinOut==3)
	{
	
		if(SpwmData.PhaseB.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT2=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseB.DB_Switch_Flag=0;
			EvaRegs.ACTR.bit.CMP1ACT=0;		//CMP1强制低,关闭A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=2;		//CMP2高有效,打开A相下臂				
		}
		else
			EvaRegs.DBTCONA.bit.EDBT2=0;
				
	}
	///////////////////////////////////////////////
	if(SpwmData.PhaseB.Phase_SinOut==4)
	{
		if(SpwmData.PhaseB.DB_Switch_Flag==0)
		{
			SpwmData.PhaseB.DB_Switch_Flag=1;
			EvaRegs.ACTR.bit.CMP1ACT=0;		//CMP1强制低,关闭A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=2;		//CMP2高有效,打开A相下臂
		}

	}
	///////////////////////////////////////////////////////////////////////////
	if(SpwmData.PhaseB.Phase_SinOut==1||SpwmData.PhaseB.Phase_SinOut==3)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_50[SpwmData.PhaseB.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_400[SpwmData.PhaseB.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_500[SpwmData.PhaseB.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)+1])*SpwmData.TPR_Modelation;
	}

	if(SpwmData.PhaseB.Phase_SinOut==2||SpwmData.PhaseB.Phase_SinOut==4)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_50[SpwmData.SampleSum_PerPhase-SpwmData.PhaseB.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_400[SpwmData.SampleSum_PerPhase-SpwmData.PhaseB.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_500[SpwmData.SampleSum_PerPhase-SpwmData.PhaseB.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)-1]*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;	
	}
	SpwmData.PhaseB.SampleCount_PerPhase++;
	
	//C相SPWM的设置
	///////////////////////////////////////////////////////////
	if(SpwmData.PhaseC.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
	{
		SpwmData.PhaseC.SampleCount_PerPhase=0;	//若一相位计满,开始下一相位计数
		SpwmData.PhaseC.Phase_SinOut++;			//所在的相位增加
		if(SpwmData.PhaseC.Phase_SinOut>4)
			SpwmData.PhaseC.Phase_SinOut=1;		//若4个相位都计过,则重新从1相位开始
	}
	///////////////////////////////////////////////
	if(SpwmData.PhaseC.Phase_SinOut==1)
	{
		
		if(SpwmData.PhaseC.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT1=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseC.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.PhaseC.Phase_SinOut==2)
	{
		
		if(SpwmData.PhaseC.DB_Switch_Flag==0)
		{
			SpwmData.PhaseC.DB_Switch_Flag=1;
			EvaRegs.ACTR.bit.CMP1ACT=2;		//CMP1高有效,打开A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=0;		//CMP2强制低,关闭A相下臂
		}
			
	}
	///////////////////////////////////////////
	if(SpwmData.PhaseC.Phase_SinOut==3)
	{
	
		if(SpwmData.PhaseC.DB_Switch_Flag)
		{
			EvaRegs.DBTCONA.bit.EDBT1=1;	//若上下臂切换时,设置死区,防止上下臂同时导通
			SpwmData.PhaseC.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.PhaseC.Phase_SinOut==4)
	{
		if(SpwmData.PhaseC.DB_Switch_Flag==0)
		{
			SpwmData.PhaseC.DB_Switch_Flag=1;
			EvaRegs.ACTR.bit.CMP1ACT=0;		//CMP1强制低,关闭A相上臂
			EvaRegs.ACTR.bit.CMP2ACT=2;		//CMP2高有效,打开A相下臂
		}

	}

	///////////////////////////////////////////////////////
	if(SpwmData.PhaseC.Phase_SinOut==1||SpwmData.PhaseC.Phase_SinOut==3)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_50[SpwmData.PhaseC.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_400[SpwmData.PhaseC.SampleCount_PerPhase+1])
						*SpwmData.TPR_Modelation;
		
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-SpwmData.M_VoltageOut*Sin_500[SpwmData.PhaseC.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)+1])*SpwmData.TPR_Modelation;
	}

	if(SpwmData.PhaseC.Phase_SinOut==2||SpwmData.PhaseC.Phase_SinOut==4)
	{
		if(50==SpwmData.F_SinOut || 60==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_50[SpwmData.SampleSum_PerPhase-SpwmData.PhaseC.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(400==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_400[SpwmData.SampleSum_PerPhase-SpwmData.PhaseC.SampleCount_PerPhase-1]
						*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;
		if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
			EvaRegs.CMPR1=(1-Sin_500[SpwmData.SampleSum_PerPhase-SpwmData.PhaseC.SampleCount_PerPhase
						*(SpwmData.F_SinOut/500)-1]*SpwmData.M_VoltageOut)*SpwmData.TPR_Modelation;	
	}
	SpwmData.PhaseC.SampleCount_PerPhase++;


	/////////////////////////////////////////
 	GpioDataRegs.GPATOGGLE.bit.GPIOA8=1;	
	EvaRegs.EVAIFRA.bit.T1UFINT=1;
	PieCtrl.PIEACK.all|=PIEACK_GROUP2;
	EvaRegs.EVAIMRA.bit.T1UFINT=1;   //打开T1下溢中断
}

void Init_Spwm_Data()
{

	SpwmData.F_SinOut=50;			//设输出频率为50	
	SpwmData.M_VoltageOut=0.7;
	SpwmData.F_Modulate_Wave=4800;  //10KHz调制频率
	SpwmData.D_B=0xB;				//死区设为3.3 us
//	SpwmData.TPR_Modelation=(long)((float)0xFFFF/((float)SpwmData.F_Modulate_Wave/570));
	if(50==SpwmData.F_SinOut)
	{
		SpwmData.F_Modulate_Wave=10000;
		SpwmData.TPR_Modelation=0x1300;
	}
	if(60==SpwmData.F_SinOut)
	{
		SpwmData.F_Modulate_Wave=12000;
		SpwmData.TPR_Modelation=0xFE0;
	}
	if(400==SpwmData.F_SinOut)
	{
		SpwmData.F_Modulate_Wave=16000;

	}
	if(500==SpwmData.F_SinOut || 1000==SpwmData.F_SinOut || 1500==SpwmData.F_SinOut)
	{
		SpwmData.F_Modulate_Wave=18000;
		SpwmData.TPR_Modelation=0xB00;
	}
	/*//////////////////////////////////////////////////
	调制频率 / Hz	SpwmData.TPR_Modelation
	770     0xFD00
	880     0xDD00
	1000   	0xC200
	1200    0xA1AA
	1500	0x8155
	1700	0x7220
	1800	0x68C7
	2000	0x6200
	3000	0x4200
	4000	0x3100
	4800	0x28D5
	5000	0x2730
	6000	0x2000
	8000	0x1800
	10000	0x1300
	12000	0xFE0
	14000	0xF00
	16000   ????????????????????????????????
	18000	0xB00
	20000	0x980
	*//////////////////////////////////////////////////
	SpwmData.SampleSum_PerPhase=SpwmData.F_Modulate_Wave/SpwmData.F_SinOut/4;
	SpwmData.PhaseA.Phase_SinOut=1;
	SpwmData.PhaseA.SampleCount_PerPhase=0;
	SpwmData.PhaseA.DB_Switch_Flag=1;

	SpwmData.PhaseB.Phase_SinOut=2;
	SpwmData.PhaseB.SampleCount_PerPhase=SpwmData.SampleSum_PerPhase/3;
	SpwmData.PhaseB.DB_Switch_Flag=1;

	SpwmData.PhaseC.Phase_SinOut=3;
	SpwmData.PhaseC.SampleCount_PerPhase=SpwmData.SampleSum_PerPhase*2/3;
	SpwmData.PhaseC.DB_Switch_Flag=1;
}

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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