一阶滞后滤波算法公式:
S
(
n
)
=
α
S
(
n
−
1
)
+
(
1
−
α
)
G
s
S(n) = αS(n-1) + (1 - α)G_s
S(n)=αS(n−1)+(1−α)Gs;
PID算法公式:
U
(
n
)
=
K
p
(
E
r
r
(
n
)
+
T
T
i
∑
i
=
1
n
E
r
r
(
i
)
+
T
D
T
(
E
r
r
(
n
)
−
E
r
r
(
n
−
1
)
)
)
U(n)=K_p(E_{rr}(n)+\frac{T}{T_i}\sum_{i=1}^n{E_{rr}(i)}+\frac{T_D}{T}(E_{rr}(n)-E_{rr}(n-1)))
U(n)=Kp(Err(n)+TiTi=1∑nErr(i)+TTD(Err(n)−Err(n−1)))
Δ
U
(
n
)
=
K
p
(
[
E
r
r
(
n
)
−
E
r
r
(
n
−
1
)
]
+
T
T
i
E
r
r
(
n
)
+
T
D
T
[
E
r
r
(
n
)
−
2
E
r
r
(
n
−
1
)
+
E
r
r
(
n
−
2
)
]
)
\Delta{U(n)}=K_p([E_{rr}(n)-E_{rr}(n-1)]+\frac{T}{T_i}{E_{rr}(n)}+\frac{T_D}{T}[E_{rr}(n)-2E_{rr}(n-1)+E_{rr}(n-2)])
ΔU(n)=Kp([Err(n)−Err(n−1)]+TiTErr(n)+TTD[Err(n)−2Err(n−1)+Err(n−2)])
U
(
n
)
=
Δ
U
(
n
)
+
U
(
n
−
1
)
U(n)=\Delta{U(n)}+U(n-1)
U(n)=ΔU(n)+U(n−1)
U(n)才是PID控制的输出
温度反馈公式:
t
U
(
t
)
=
2.0
∗
(
T
m
p
r
R
e
f
−
t
E
(
t
)
)
;
t
E
(
t
)
=
t
R
(
t
)
−
t
Y
(
t
)
;
T
m
p
r
R
e
f
=
85
tU(t) = 2.0 * (TmprRef - tE(t));tE(t) =tR(t) - tY(t); TmprRef = 85
tU(t)=2.0∗(TmprRef−tE(t));tE(t)=tR(t)−tY(t);TmprRef=85,
t
Y
(
t
)
tY(t)
tY(t)采样反馈值,
t
R
(
t
)
tR(t)
tR(t)设定值,
t
E
(
t
)
tE(t)
tE(t)偏差,
t
U
(
t
)
tU(t)
tU(t)输出电压(一般为负值)。
程序
/**
* @brief power limit param
* @param
* @retval None
*/#if0voidvPwrExec(float* input, LIM_Type* pLim){int i;volatilefloat aA =0.0;for(i =0; i < MG_DEF_BLK_SZ; i++){if(pLim->Pro.fGc <= pLim->Pro.fGs){
aA = pLim->Set.aA;/* compress time*/}/* release period*/else{
aA = pLim->Set.aR;/* release time*/}
pLim->Pro.fGs = aA * pLim->Pro.fGs +(1- aA)* pLim->Pro.fGc;/* one order lag algrithm*/
input[i]= pLim->Pro.fGs * input[i];}}#endif#if1voidvPwrExec(float* input, LIM_Type* pLim){
fGc = pLim->Pro.fGc;
aA = pLim->Set.aA;
aR = pLim->Set.aR;PsuLimExec(input,&pLim->Pro.fGs);}#endif/**
* @brief get Power Limiter param
* @param
* @retval None
*/voidgetPwrParam(LIM_Type* pLim){
pLim->Pro.fSCdBu = pLim->Pro.fInRMSdBu;
pLim->Set.fVth = VthdBu + pLim->HwGain;/*no soft knee*/if(pLim->Pro.fInRMSdBu <=(pLim->Set.fVth)){
pLim->Pro.fSCdBu = pLim->Pro.fInRMSdBu;}if(pLim->Pro.fInRMSdBu >(pLim->Set.fVth)){
pLim->Pro.fSCdBu = pLim->Set.fVth;}
pLim->Pro.fGc = pLim->Pro.fSCdBu - pLim->Pro.fInRMSdBu;
pLim->Pro.fGc =gain_computer(pLim->Pro.fGc,20);}/**
* @brief get ObjVth
* @param
* @retval None
*/voidgetObjVth(void){float fMaxInRMSdBu;
PwrData[0].Pro.fInRMSdBu =(20*log10(fInPwrRms[0])+ dBuVrefCoef);
PwrData[1].Pro.fInRMSdBu =(20*log10(fInPwrRms[1])+ dBuVrefCoef);
PwrData[0].Pro.fInRMSdBu =(PwrData[0].Pro.fInRMSdBu >(-140))? PwrData[0].Pro.fInRMSdBu :(-140);
PwrData[1].Pro.fInRMSdBu =(PwrData[1].Pro.fInRMSdBu >(-140))? PwrData[1].Pro.fInRMSdBu :(-140);
fMaxInRMSdBu =(PwrData[0].Pro.fInRMSdBu > PwrData[1].Pro.fInRMSdBu)? \
PwrData[0].Pro.fInRMSdBu : PwrData[1].Pro.fInRMSdBu;
VpsuRef =(gDeviceType !=0)? VpsuRef2402 : VpsuRef1202;//vPID.SetVal = VpsuRef; /* 1202 2402 have different reference*/tNgFeedBack(DeviceTEMP_info[2]);/* if the temperature is bigger than 85'C ,change the psu voltage set value*/ReadADC(&iVadc);
fVpsu = iVadc * VpsuAdcG;vPIDinc(fVpsu);
vPID.SumVal =(vPID.SumVal >0.0)? vPID.SumVal :0.0;
VthdBu = fMaxInRMSdBu +(-fOutGainHW)- vPID.SumVal;
VthdBu =(VthdBu <= VthMax)? VthdBu : VthMax;
VthdBu =(VthdBu >= VthMin)? VthdBu : VthMin;}/**
* @brief vPID caculate
* @param
* @retval None
*/voidvPIDinc(float ActVal){
vPID.Err = vPID.SetVal - ActVal;
vPID.Err =(ActVal <=(vPID.SetVal +5))? vPID.Err :0.0;/* 5V ahead of SetVal to active vPID control*/
vPID.IncVal= vPID.P *(vPID.Err - vPID.LastErr)+ vPID.I * vPID.Err + vPID.D *(vPID.Err -2.0* vPID.LastErr + vPID.PrevErr);
vPID.PrevErr = vPID.LastErr;
vPID.LastErr = vPID.Err;
vPID.SumVal += vPID.IncVal;
vPID.SumVal =(ActVal <=(vPID.SetVal +5))? vPID.SumVal :0.0;}/**
* @brief temperature negative feedback
* @param vPID.SetVal controled by PSU temperature
* @retval None
*/voidtNgFeedBack(int ActTmpr){int tErr =0;/* temperature error difference value*/
tErr = TmprRef - ActTmpr;
tErr =(ActTmpr >= TmprRef)? tErr :0.0;
tErr=2.0* tErr;
vPID.SetVal = VpsuRef - tErr;/*if temperature over TmprRef, needs to increase vPID.SetVal that means decrease output power*/}
AUDIO POWER LIMITOverviewDescriptionDiagramMathematical principleProgramTest PerformanceOverviewThe audio limiter serves to prevent the signal level from exceeding a preset limit. It is a closed-loo...