?? power.c
字號(hào):
}
}
///////////////////////////////////////////////////////
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的設(shè)置
//////////////////////////////////////////////////////////
if(SpwmData.PhaseB.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
{
SpwmData.PhaseB.SampleCount_PerPhase=0; //若一相位計(jì)滿,開始下一相位計(jì)數(shù)
SpwmData.PhaseB.Phase_SinOut++; //所在的相位增加
if(SpwmData.PhaseB.Phase_SinOut>4)
SpwmData.PhaseB.Phase_SinOut=1; //若4個(gè)相位都計(jì)過,則重新從1相位開始
}
//////////////////////////////////////////////////////////
if(SpwmData.PhaseB.Phase_SinOut==1)
{
if(SpwmData.PhaseB.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT2=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseB.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.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強(qiáng)制低,關(guān)閉A相下臂
}
}
///////////////////////////////////////////
if(SpwmData.PhaseB.Phase_SinOut==3)
{
if(SpwmData.PhaseB.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT2=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseB.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.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強(qiáng)制低,關(guān)閉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的設(shè)置
///////////////////////////////////////////////////////////
if(SpwmData.PhaseC.SampleCount_PerPhase>=SpwmData.SampleSum_PerPhase)
{
SpwmData.PhaseC.SampleCount_PerPhase=0; //若一相位計(jì)滿,開始下一相位計(jì)數(shù)
SpwmData.PhaseC.Phase_SinOut++; //所在的相位增加
if(SpwmData.PhaseC.Phase_SinOut>4)
SpwmData.PhaseC.Phase_SinOut=1; //若4個(gè)相位都計(jì)過,則重新從1相位開始
}
///////////////////////////////////////////////
if(SpwmData.PhaseC.Phase_SinOut==1)
{
if(SpwmData.PhaseC.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT1=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseC.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.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強(qiáng)制低,關(guān)閉A相下臂
}
}
///////////////////////////////////////////
if(SpwmData.PhaseC.Phase_SinOut==3)
{
if(SpwmData.PhaseC.DB_Switch_Flag)
{
EvaRegs.DBTCONA.bit.EDBT1=1; //若上下臂切換時(shí),設(shè)置死區(qū),防止上下臂同時(shí)導(dǎo)通
SpwmData.PhaseC.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.PhaseC.Phase_SinOut==4)
{
if(SpwmData.PhaseC.DB_Switch_Flag==0)
{
SpwmData.PhaseC.DB_Switch_Flag=1;
EvaRegs.ACTR.bit.CMP1ACT=0; //CMP1強(qiáng)制低,關(guān)閉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; //設(shè)輸出頻率為50
SpwmData.M_VoltageOut=0.7;
SpwmData.F_Modulate_Wave=4800; //10KHz調(diào)制頻率
SpwmData.D_B=0xB; //死區(qū)設(shè)為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;
}
/*//////////////////////////////////////////////////
調(diào)制頻率 / 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.
//===========================================================================
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -