產(chǎn)品的系統(tǒng)架構(gòu)和控制算法在此就不再做介紹了,可以參考第一篇文章。今天繼續(xù)和大家分享調(diào)試過程中的踩坑。
踩坑9、交流輸入電壓、電流有效值計算
交流電壓和交流電流的有效值,在我軟件里面主要是做交流軟件輸入過流保護、輸入電壓欠壓保護、過壓保護、交流掉電保護、輸入限流32A工作等功能??偟膩碚f交流電壓和電流的有效值還是有很多地方需要用到的。
1)其實有效值的計算說起來很簡單,就是多次采樣求平均值,此處為什么會踩坑呢?我們先看看有效值計算的公式機:
U---有效值電壓
T---積分時間
u(t)---瞬時電壓
有效值就等于單位時間的電壓平方的積分開根號。
踩坑的地方就是:計算的有效值時間太長,為了減小有效值的波動,不得不拉長采樣周期,計算很多個交流周期,才能減小計算所得的數(shù)據(jù)的波動。如果計算周期太長,比如輸入限流32A就會出現(xiàn)好幾個周期,甚至是10個周期以上才調(diào)整過來,這個時候用戶用的32A的漏電保護器早就跳閘了?。?!
2)下面我就介紹下我采用的單周期計算算法,其實也很簡單,就是在交流電過零點的時候計算,沒次計算半個周期,這半個周期的有效值就是交流輸入電壓或者電流的有效值。這樣就做到了每個周期單獨計算有效值,對前面提到的輸入32A限流這些需要動態(tài)響應高的地方就很友好了
那就說說具體算法吧,直接上源代碼
/**
* 函數(shù)名:Effective_Vac
* 描 述:交流電壓有效值計算
* 輸 入:無
* 返 回:無
*/
void Effective_Vac(void)
{
AC_volt= ACL_volt -ACN_volt ;
if(AC_volt> 0)
{
AC_volt= AC_volt;
Positive_num++;
Vin_squar = (AC_volt * AC_volt ) >> 11;
if((Positive_num == 10)&&(Negative_num >= 60)) //1ms and 6ms
{
Vin_squar_aver = Negative_squar_sum / Negative_counter;
Negative_num = 0;
Negative_squar_sum = 0;
}
else if(Positive_num > 10)
{
Negative_num = 0;
Negative_squar_sum = 0;
if(Positive_num >= 100)
{
Vin_squar_aver = Positive_squar_sum / Pegative_num;
Positive_num = 0;
Positive_squar_sum = 0;
}
}
Positive_squar_sum = Vin_squar + Positive_squar_sum;
}
else
{
AC_volt= (-AC_vol)t;
Negative_num++;
Vin_squar = (AC_volt * AC_volt ) >> 11;
if((Negative_num == 10)&&(Positive_num >= 60)) //1ms and 6ms
{
Vin_squar_aver = Positive_squar_sum / Positive_counter;
Positive_num = 0;
Positive_squar_sum = 0;
}
else if(Negative_num > 10)
{
Positive_num = 0;
Positive_squar_sum = 0;
if(Negative_num >= 100)
{
Vin_squar_aver = Negative_squar_sum / Negative_num;
Negative_num = 0;
Negative_squar_sum = 0;
}
}
}
}