電網相關程序
8.1電網電壓正負序分離程序
//1函數功能:對電網電壓進行正負序分離
//2 函數所使用數表:無
//3 函數所使用的常量:
// K_E_ITR K_E_INST K_E_NP
//4 函數內部變量:
long int E_ALF_DIFF_GRD=0;
long int E_BET_DIFF_GRD=0;
long int E_ALF_PST_ITR=0;
long int E_BET_PST_ITR=0;
long int E_ALF_NEG_ITR=0;
long int E_BET_NEG_ITR=0;
int E_ALF_GRD_NP_LST1=0;
int E_BET_GRD_NP_LST1=0;
int E_ALF_PST_GRD_INST=0;
int E_BET_PST_GRD_INST=0;
int E_ALF_NEG_GRD_INST=0;
int E_BET_NEG_GRD_INST=0;
long int E_PST_GRD_TMP=0;
long int E_NEG_GRD_TMP=0;
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
//int CAL_FRQ=0;
//int E_ALF_GRD_LST1=0;
//int E_BET_GRD_LST1=0;
//int COS_THT_AT_PWMA_RLD=0;
//int SIN_THT_AT_PWMA_RLD=0;
//7 函數輸出變量(應定義為全局變量):
//int E_ALF_PST_GRD=0;
//int E_BET_PST_GRD=0;
//int E_ALF_NEG_GRD=0;
//int E_BET_NEG_GRD=0;
//int E_PST_GRD=0;
//int E_NEG_GRD=0;
//int SIN_THT_PST_GRD=0;
//int COS_THT_PST_GRD=0;
//int SIN_THT_NEG_GRD=0;
//int COS_THT_NEG_GRD=0;
//8 代碼執行時間:25us
//9 代碼長度:376
//10 函數體
extern void E_PN_SEQU_SPRT_V4();
void E_PN_SEQU_SPRT_V4()
{
//電網電壓微分計算賦初值
if((E_PST_GRD==0)&&(E_NEG_GRD==0))
{
E_ALF_GRD_NP_LST1=E_ALF_GRD;
E_BET_GRD_NP_LST1=E_BET_GRD;
}
//計算電網電壓微分值
E_ALF_DIFF_GRD=((long int)E_ALF_GRD*CAL_FRQ-(long int)E_ALF_GRD_NP_LST1*CAL_FRQ)*13/4096;
E_BET_DIFF_GRD=((long int)E_BET_GRD*CAL_FRQ-(long int)E_BET_GRD_NP_LST1*CAL_FRQ)*13/4096;
//通過當前值和微分值計算正負序分量
E_ALF_PST_GRD_INST=(E_ALF_GRD+E_BET_DIFF_GRD);
E_BET_PST_GRD_INST=(E_BET_GRD-E_ALF_DIFF_GRD);
E_ALF_NEG_GRD_INST=(E_ALF_GRD-E_BET_DIFF_GRD);
E_BET_NEG_GRD_INST=(E_BET_GRD+E_ALF_DIFF_GRD);
if((E_PST_GRD==0)&&(E_NEG_GRD==0))
{
//正負序電壓賦初值
E_ALF_PST_GRD=E_ALF_PST_GRD_INST/2;
E_BET_PST_GRD=E_BET_PST_GRD_INST/2;
E_ALF_NEG_GRD=E_ALF_NEG_GRD_INST/2;
E_BET_NEG_GRD=E_BET_NEG_GRD_INST/2;
}
else
{
//正負序電壓向前校正一個PWM周期
E_ALF_PST_ITR=((long int)COS_THT_AT_PWMA_RLD*E_ALF_PST_GRD-(long int)SIN_THT_AT_PWMA_RLD*E_BET_PST_GRD)/512;
E_BET_PST_ITR=((long int)COS_THT_AT_PWMA_RLD*E_BET_PST_GRD+(long int)SIN_THT_AT_PWMA_RLD*E_ALF_PST_GRD)/512;
E_ALF_NEG_ITR=((long int)COS_THT_AT_PWMA_RLD*E_ALF_NEG_GRD+(long int)SIN_THT_AT_PWMA_RLD*E_BET_NEG_GRD)/512;
E_BET_NEG_ITR=((long int)COS_THT_AT_PWMA_RLD*E_BET_NEG_GRD-(long int)SIN_THT_AT_PWMA_RLD*E_ALF_NEG_GRD)/512;
//遺忘濾波運算
E_ALF_PST_GRD=((long int)E_ALF_PST_ITR*K_E_ITR+E_ALF_PST_GRD_INST*K_E_INST)/K_E_NP;
E_BET_PST_GRD=((long int)E_BET_PST_ITR*K_E_ITR+E_BET_PST_GRD_INST*K_E_INST)/K_E_NP;
E_ALF_NEG_GRD=((long int)E_ALF_NEG_ITR*K_E_ITR+E_ALF_NEG_GRD_INST*K_E_INST)/K_E_NP;
E_BET_NEG_GRD=((long int)E_BET_NEG_ITR*K_E_ITR+E_BET_NEG_GRD_INST*K_E_INST)/K_E_NP;
}
//電網電壓延時一個周期
E_ALF_GRD_NP_LST1=E_ALF_GRD;
E_BET_GRD_NP_LST1=E_BET_GRD;
//正序電壓模值計算
SQUR_X=E_ALF_PST_GRD;
SQUR_Y=E_BET_PST_GRD;
SQRT_ROOT_V4();
E_PST_GRD=SQRT_MOD;
//電網正序正、余弦計算
E_PST_GRD_TEMP=(long int)1073741824/SQRT_MOD;//1073741824=1024*1024*1024
SIN_THT_PST_GRD=(long int)E_BET_PST_GRD*E_PST_GRD_TMP/(long int)1048576;//1048576=1024*1024
COS_THT_PST_GRD=(long int)E_ALF_PST_GRD*E_PST_GRD_TMP/(long int)1048576;
//負序電壓模值計算
SQUR_X=E_ALF_NEG_GRD;
SQUR_Y=E_BET_NEG_GRD;
SQRT_ROOT_V4();
E_NEG_GRD=SQRT_MOD;
//電網負序正、余弦計算
//E_NEG_GRD_TEMP=(long int)1073741824/SQRT_MOD;//1073741824=1024*1024*1024
//SIN_THT_NEG_GRD=(long int)E_BET_NEG_GRD*E_NEG_GRD_TMP/(long int)1048576;//1048576=1024*1024
//COS_THT_NEG_GRD=(long int)E_ALF_NEG_GRD*E_NEG_GRD_TMP/(long int)1048576;
}
//11程序原理說明
//12 程序流程圖
8.2電網檢測程序
//1函數功能:對電網相序、幅值的檢測
//2 函數所使用數表:無
//3 函數所使用的常量:
DEG_UNB_GRD_LMT
//4 函數內部變量:
int DEG_UNB_GRD_CNT=0;
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
//int E_PST_GRD=0;
//int E_NEG_GRD=0;
//7 函數輸出變量(應定義為全局變量):
//long int E_UNBL_DGR =0;
//int FAULT_FLG=0;
//int FAULT_CODE=0;
//int FAULT_VAL=0;
//8 代碼執行時間:3.3us
//9 代碼長度:76
//10 函數體:
extern void GRD_TEST_V4();
void GRD_TEST_V4()
{
if(DEG_UNB_GRD_CNT==1000)
{
//計算電網電壓跌落程度
E_UNBL_DGR=(long int)E_NEG_GRD*1024/E_PST_GRD;
//電網電壓相序檢測
if(E_UNBL_DGR>=DEG_UNB_GRD_HLMT)
{
if(FAULT_FLG==0)
{
FAULT_FLG=1;
FAULT_CODE=43;
FAULT_VAL=E_NEG_GRD/16;
}
GRID_TEST_FLG=0;//電網電壓檢測標志位
}
//電網電壓不平衡檢測
if((E_UNBL_DGR>=DEG_UNB_GRD_LLMT)&&(E_UNBL_DGR<DEG_UNB_GRD_HLMT))
{
if(FAULT_FLG==0)
{
FAULT_FLG=1;
FAULT_CODE=42;
FAULT_VAL=E_UNBL_DGR;
}
GRID_TEST_FLG=0;
}
//電網電壓檢測通過
else
{
GRID_TEST_FLG=1;
}
DEG_UNB_GRD_CNT=999;
}
DEG_UNB_GRD_CNT++;
}
//11程序原理說明
//12 程序流程圖
8.3計算電網相位指針程序不帶過零檢測
//1函數功能:由反三角函數得出的電網相位角信息計算出對應的電網相位指針。
//2 函數所使用數表:無
//3 函數所使用的常量:無
//4 函數內部變量:無
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
//int THT_LST1=0;//第(n-1)周期電網相位角
//7 函數輸出變量(應定義為全局變量):
//int THT_PNT_LST1=0;//第(n-1)周期的相位指針
//int THT_PNT_LST2=0;//第(n-2)周期的相位指針
//int THT_PNT_NXT1=0;//第(n+1)周期的相位指針
//int THT_PNT_NXT2=0;//第(n+2)周期的相位指針
//8 代碼執行時間
//9 代碼長度
//10 函數體
extern void THT_PNT_CAL_WO_V4();
void THT_PNT_CAL_WO_V4()
{
if(THT_LST1>=11488)
THT_LST1=THT_LST1-11520;
THT_PNT_LST1=(THT_LST1+47)/96;
THT_PNT_LST2=THT_PNT_LST1-1;
if(THT_PNT_LST2<0)
THT_PNT_LST2=119;
THT_PNT_NXT1=THT_PNT_LST1+1;
if(THT_PNT_NXT1>119)
THT_PNT_NXT1=0;
THT_PNT_NXT2=THT_PNT_LST1+2;
if(THT_PNT_NXT2>119)
THT_PNT_NXT2=THT_PNT_NXT2-120;
}
//11程序原理說明
//12 程序流程圖
8.4計算電網相位指針程序帶過零檢測
//1函數功能:由反三角函數得出的電網相位角信息計算出對應的電網相位指針。
//2 函數所使用數表:無
//3 函數所使用的常量:無
//4 函數內部變量:
int THT_ZR_CFM_FLG=0; //電網相位角過零確認標志位
int THT_TMP_LST1=0; //第(n-2)周期電網相位角
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
//int int THT_LST1=0; //第(n-1)周期電網相位角
//7 函數輸出變量(應定義為全局變量):
//int THT_PNT_LST1=0; //第(n-1)周期的相位指針
//int THT_PNT_LST2=0; //第(n-2)周期的相位指針
//int THT_PNT_PRST=0; //第n周期的相位指針
//int THT_PNT_NXT1=0; //第(n+1)周期的相位指針
//int THT_PNT_NXT2=0; //第(n+2)周期的相位指針
//int GRD_PRD_END_FLG=0; //一個電網周期結束標志位,用于求取一個周期內的直流側電壓的平均值
//8 代碼執行時間
//9 代碼長度
//10 函數體
extern void THT_PNT_CAL_W_V4();
void THT_PNT_CAL_W_V4()
{
THT_PNT_LST1++;
if(THT_PNT_LST1>100)
{
THT_ZR_CFM_FLG=1;
}
if(THT_ZR_CFM_FLG==1)
{
if((THT_TMP_LST1-THT_LST1)>10000)
{
GRD_PRD_END_FLG=1;
THT_ZR_CFM_FLG=0;
}
}
THT_TMP_LST1=THT_LST1;
if((THT_LST1>=11488)||(THT_PNT_LST1>=120))
{
THT_PNT_LST1=0;
}
THT_PNT_LST2=THT_PNT_LST1-1;
if(THT_PNT_LST2<0)
THT_PNT_LST2=THT_PNT_LST2+120;
THT_PNT_PRST=THT_PNT_LST1+1;
if(THT_PNT_PRST>119)
THT_PNT_PRST=THT_PNT_PRST-120;
THT_PNT_NXT1=THT_PNT_LST1+2;
if(THT_PNT_NXT1>119)
THT_PNT_NXT1=THT_PNT_NXT1-120;
THT_PNT_NXT2=THT_PNT_LST1+3;
if(THT_PNT_NXT2>119)
THT_PNT_NXT2=THT_PNT_NXT2-120;
}
//11程序原理說明
6K時THT_PNT_LST1計數120次;9K時THT_PNT_LST1計數180次。
當THT_PNT_LST1大于100時,電網相位角過零確認標志位置1,程序開始判斷THT_TMP_LST1-THT_LST1的值,若大于10000,即認為角度指針已過零(例如:THT_LST1=96(3°),THT_TMP_LST1=11520(360°))。電網相位角過零確認標志位THT_ZR_CFM_FLG清0,電網過零標志位GRD_PRD_END_FLG置1。當THT_LST1大于11488(稍小于11520)或THT_PNT_LST1大于等于120時,THT_PNT_LST1清0。
//12 程序流程圖
8.5電網電壓前向旋轉校正//1函數功能:對分離出來的正負序電壓向前校正兩個周期
//2 函數所使用數表:無
//3 函數所使用的常量:無
//4 函數內部變量:無
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
//int E_ALF_PST_GRD=0;//第(n-1)周期電網電壓正序采樣值ALP
//int E_BET_PST_GRD=0;//第(n-1)周期電網電壓正序采樣值BET
//int E_ALF_NEG_GRD=0;//第(n-1)周期電網電壓負序采樣值ALP
//int E_BET_NEG_GRD=0;//第(n-1)周期電網電壓負序采樣值BET
//int COS_THT_2_CYC=0;
//int SIN_THT_2_CYC=0;
//7 函數輸出變量(應定義為全局變量):
//int E_ALF_PST_GRD_FRW=0;//第(n-1)周期電網電壓正序采樣值ALP
//int E_BET_PST_GRD_FRW=0;//第(n-1)周期電網電壓正序采樣值BET
//int E_ALF_NEG_GRD_FRW=0;//第(n-1)周期電網電壓負序采樣值ALP
//int E_BET_NEG_GRD_FRW=0;//第(n-1)周期電網電壓負序采樣值BET
//8 代碼執行時間:1.92us
//9 代碼長度: 81
//10 函數體
extern void E_GRD_FRW_V4();
void E_GRD_FRW_V4()
{
//正負序電壓向前校正兩個PWM周期
E_ALF_PST_GRD_FRW=((long int)E_ALF_PST_GRD*COS_THT_2_CYC-(long int)E_BET_PST_GRD*SIN_THT_2_CYC)/1024;
E_BET_PST_GRD_FRW=((long int)E_BET_PST_GRD*COS_THT_2_CYC+(long int)E_ALF_PST_GRD*SIN_THT_2_CYC)/1024;
E_ALF_NEG_GRD_FRW=((long int)E_ALF_NEG_GRD*COS_THT_2_CYC-(long int)E_BET_NEG_GRD*SIN_THT_2_CYC)/1024;
E_BET_NEG_GRD_FRW=((long int)E_BET_NEG_GRD*COS_THT_2_CYC+(long int)E_ALF_NEG_GRD*SIN_THT_2_CYC)/1024;
}
//11程序原理說明
以PWM重載頻率6K為例,每個重載周期電網變化

:
//12 程序流程圖
8.6電網電壓迭代矯正
//1函數功能:電網電壓迭代濾波,矯正
//2 函數所使用數表:無
//3 函數所使用的常量:
#define KF_GRD_CLB 14
//4 函數內部變量:
int E_ALF_GRD_CLB_LST2=0;
int E_BET_GRD_CLB_LST2=0;
int E_ALF_GRD_ITR_LST1=0;
int E_BET_GRD_ITR_LST1=0;
//5 函數的控制變量:無
//6 函數輸入變量(應定義為全局變量):
int E_ALF_GRD_LST1=0;
int E_BET_GRD_LST1=0;
//7 函數輸出變量(應定義為全局變量):
int E_ALF_GRD_CLB_LST1=0;
int E_BET_GRD_CLB_LST1=0;
//8 代碼執行時間:2us
//9 代碼長度:105
//10 函數體:
extern void E_GRD_CLB_V4();
void E_GRD_CLB_V4()
{
if((E_ALF_GRD_CLB_LST2==0)&&(E_BET_GRD_CLB_LST2==0))
{
E_ALF_GRD_CLB_LST1=E_ALF_GRD_LST1;
E_BET_GRD_CLB_LST1=E_BET_GRD_LST1;
}
else
{
E_ALF_GRD_ITR_LST1=((long int)E_ALF_GRD_CLB_LST2*COS_THT_AT_PWMA_RLD-(long int)E_BET_GRD_CLB_LST2*SIN_THT_AT_PWMA_RLD)/1024;
E_BET_GRD_ITR_LST1=((long int)E_BET_GRD_CLB_LST2*COS_THT_AT_PWMA_RLD+(long int)E_ALF_GRD_CLB_LST2*SIN_THT_AT_PWMA_RLD)/1024;
E_ALF_GRD_CLB_LST1=((long int)KF_GRD_CLB*E_ALF_GRD_ITR_LST1+(long int)(16-KF_GRD_CLB)*E_ALF_GRD_LST1)/16;
E_BET_GRD_CLB_LST1=((long int)KF_GRD_CLB*E_BET_GRD_ITR_LST1+(long int)(16-KF_GRD_CLB)*E_BET_GRD_LST1)/16;
}
E_ALF_GRD_CLB_LST2=E_ALF_GRD_CLB_LST1;
E_BET_GRD_CLB_LST2=E_BET_GRD_CLB_LST1;
}
//11程序原理說明
程序算法流程圖如下

表示采樣獲取的原始值;

由前一周期獲得的迭代值;

由前一周期獲得的迭代值和采樣值加權計算的值.
函數的輸入變量是采樣獲取的原始值E_ALF_GRD_LST1和E_BET_GRD_LST1;
函數的輸出變量為迭代值和采樣值加權計算的電壓E_ALF_GRD_CLB_LST1和E_BET_GRD_CLB_LST1.
(1) 在程序運行的第一個周期矯正的電網電壓E_ALF_GRD_CLB_LST2和E_BET_GRD_CLB_LST2都為零,此時矯正值E_ALF_GRD_CLB_LST1和E_BET_GRD_CLB_LST1用采樣的原始值
(2)在程序運行了一個周期之后E_ALF_GRD_CLB_LST2和E_BET_GRD_CLB_LST2不同時為零,將其向前矯正3度算出迭代值E_ALF_GRD_ITR_LST1和E_BET_GRD_ITR_LST1.
(3)

位電壓矯正系數,一般取0.8左右.
//12 程序流程圖