📄 power.c
字号:
}
}
///////////////////////////////////////////////////////
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 + -