Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

성능 저하 중인 배터리 시스템의 비선형 상태 추정

이 예제에서는 Simulink®에서 무향 칼만 필터를 사용하여 비선형 시스템의 상태를 추정하는 방법을 보여줍니다. 이 예제에서는 이벤트 기반 칼만 필터를 개발하여 보다 정확한 상태 추정을 위해 시스템 파라미터를 업데이트하는 방법도 보여줍니다. 이 예제는 Control System Toolbox™ 또는 System Identification Toolbox™를 사용하여 실행됩니다. Predictive Maintenance Toolbox™는 필요하지 않습니다.

개요

다음과 같은 회로를 갖는 배터리 모델을 살펴보겠습니다 [1].

모델은 전압원 $E_m$, 직렬 저항기 $R_0$, 단일 RC 블록 $R_1$$C_1$로 구성됩니다. 배터리는 충전 사이클과 방전 사이클을 오갑니다. 이 예제에서, 배터리의 측정된 전류, 전압 및 온도를 사용하여 배터리 모델의 충전 상태(SOC)를 추정합니다. 배터리가 비선형 시스템이라고 가정하고 무향 칼만 필터를 사용하여 SOC를 추정합니다. 배터리의 용량은 각 방전-충전 사이클마다 저하되어 정확하지 않은 SOC 추정을 제공합니다. 이벤트 기반 선형 칼만 필터를 사용하여 배터리가 충전과 방전 사이를 천이할 때 배터리 용량을 추정합니다. 추정된 용량은 배터리의 건전성 상태를 나타내는 데 사용할 수 있습니다.

Simulink 모델은 베터리 모델, Unscented Kalman Filter 블록, Event-based Kalman Filter 블록과 같은 세 가지 주요 컴포넌트를 갖습니다. 보다 상세한 설명은 이어지는 섹션에서 제공합니다.

open_system('BatteryExampleUKF/')

배터리 모델

열 효과가 있는 배터리 모델은 Simscape™ 언어를 사용하여 구현되었습니다.

배터리 모델의 상태 천이 방정식은 다음과 같이 지정됩니다.

$$ \frac{d}{dt} \left(
\begin{array}{cc}
 SOC \\
 U_{1}
\end{array} \right) = \left(
\begin{array}{cc}
 0 \\
 -\frac{1}{R_1(SOC,T_b)*C_1(SOC,T_b)}U_1
\end{array} \right) + \left(
\begin{array}{cc}
 -\frac{1}{3600*C_q} \\
 \frac{1}{C_1(SOC,T_b)}\end{array} \right)I
+ W
$$

여기서 $R_1(SOC,T_b)$$C_1(SOC,T_b)$는 RC 블록의 열 및 SOC 의존 저항기와 커패시터이고, $ U_1 $은 커패시터 $C_1$의 전압, $I$는 입력 전류, $T_b$는 배터리 온도, $C_q$는 배터리 용량(단위: Ah), $W$는 공정 잡음입니다.

입력 전류는 다음 Figure에서 볼 수 있듯이 배터리가 방전 중일 때는 임의로 생성된 펄스이고 배터리가 충전 중일 때는 일정합니다.

측정 방정식은 다음과 같이 지정됩니다.

$$ \begin{array} {ll}
E = E_m(SOC,T_b) - U_1 - IR_0(SOC,T_b) + V
\end{array} $$

여기서 $E$는 측정된 전압 출력값, $R_0(SOC,T_b)$는 직렬 저항기, $E_m = E_m(SOC,T_b)$는 전압원의 기전력, $V$는 측정 잡음입니다.

모델에서 $R_0, R_1, C_1$$E_m$은 SOC 및 배터리 온도에 종속적인 2차원 룩업 테이블입니다. 룩업 테이블의 파라미터는 실험 데이터를 사용하여 식별됩니다 [1].

충전 상태(SOC) 추정하기

Unscented Kalman Filter 블록을 사용하려면 상태 및 측정 방정식에 대해 MATLAB® 함수나 Simulink 함수를 정의해야 합니다. 이 예제에서는 Simulink 함수를 사용하는 방법을 보여줍니다. 무향 칼만 필터는 이산시간 필터이므로 먼저 상태 방정식을 이산화합니다. 이 예제에서는 오일러 이산화를 사용합니다. 샘플링 시간을 $ Ts $라고 하겠습니다. 일반 비선형 시스템 $\dot{x} = f(x,u)$의 경우 시스템은 $x_{T+1} = x_{T} + f(x_{T},u_{T})*Ts$로 이산화될 수 있습니다.

비선형 배터리 시스템의 상태 벡터는 다음과 같습니다.

$ x_T = \left( \begin{array}{cc} SOC_T \\ U_{1_T} \end{array} \right) $.

오일러 이산화를 적용하면 다음과 같은 방정식이 생성됩니다.

$$
\left(
\begin{array}{cc}
 SOC_{T+1} \\
 U_{1_{T+1}}
\end{array} \right) = \left(
\begin{array}{cc}
 SOC_{T} \\
 U_{1_{T}}
\end{array} \right) + \left(
\begin{array}{cc}
 -\frac{1}{3600*C_q}I \\
 -\frac{1}{R_1(SOC_T,T_b)*C_1(SOC_T,T_b)}U_1+\frac{1}{C_1(SOC_T,T_b)} I
\end{array} \right)Ts
+ W_T
$$

이산화된 상태 천이 방정식은 아래에 나와 있는 "batteryStateFcn"이라는 Simulink 함수로 구현됩니다. 함수 입력값 x는 상태 벡터이고 함수 출력값 xNext는 이산화된 상태 천이 방정식을 사용하여 계산된, 다음 단계에서의 상태 벡터입니다. xxNext의 신호 차원과 데이터형을 지정해야 합니다. 이 예제에서 xxNext의 신호 차원은 2이고 데이터형은 double형입니다. 추가 입력값으로 온도, 추정된 용량, 전류가 있습니다. 추가 입력값은 상태 천이 방정식의 입력값이며 UKF 블록에는 필요하지 않습니다.

측정 함수는 아래에 나와 있는 "batteryMeasurementFcn"이라는 Simulink 함수로 구현됩니다.

다음과 같이 블록 파라미터를 구성합니다.

시스템 모델 탭에서 블록 파라미터를 그림과 같이 지정합니다.

다음 파라미터를 지정합니다.

  • 상태 천이 함수: batteryStateFcn.

이산화된 상태 천이 방정식을 구현하는, 앞에서 정의한 Simulink 함수의 이름입니다.

  • 공정 잡음: Additive로, 시변 공분산 $\left[ \begin{array}{cc} 2e-8 & 0 \\ 0 & 3e-7 \end{array} \right]$을 갖습니다. 여기서 Additive는 잡음 항이 최종 신호에 직접 더해짐을 의미합니다.

SOC 및 $U_1$의 공정 잡음은 배터리 시스템의 동특성 특징을 기반으로 추정됩니다. 배터리의 공칭 용량은 30Ah이고, 평균 전류 진폭 15A로 방전/충전 사이클을 겪습니다. 따라서 한 번의 방전 또는 충전 과정에는 약 2시간(7200초)이 걸립니다. 최대 변화는 SOC의 경우 100%이고 $U_1$의 경우 약 4V입니다.

SOC 및 $U_1$의 스텝당 최대 변화는 $max(|dSOC|) \approx \frac{100\%}{3600*2}*Ts$$max(|dU_1|) \approx \frac{4}{3600*2}*Ts$입니다. 여기서 $T_s$는 필터의 샘플링 시간입니다. 이 예제에서 $T_s$는 1초로 설정되었습니다.

공정 잡음 $W$는 다음과 같습니다.

$ W = \left[ \begin{array}{cc} (max(|dSOC|))^2 & 0 \\ 0 & (max(|dU_1|))^2 \end{array} \right] \approx \left[ \begin{array}{cc} 2e-8 & 0 \\ 0 & 3e-7 \end{array} \right] $.

  • 초기 상태: $ \left( \begin{array}{cc} 1 \\ 0 \end{array} \right) $.

$U_1$의 사전 정보가 없기 때문에 SOC의 초기값은 $U_1$의 초기값이 0으로 설정되었을 때 100%(완충된 배터리)라고 가정합니다.

  • 초기 공분산:

초기 공분산은 초기 추측값의 정확도와 안정성을 나타냅니다. 최대 초기 추측값 오차는 SOC의 경우 10%이고 $U_1$의 경우 1V라고 가정합니다. 초기 공분산 행렬은 $ \left[ \begin{array}{cc} 0.01 & 0 \\ 0 & 1 \end{array} \right] $로 설정되었습니다.

  • 무향 변환 파라미터: 설정은 [2]를 기반으로 합니다.

     - Alpha: 1. Determine the spread of sigma points around x. Set Alpha to be 1 for larger spread.
     - Beta: 2. Used to incorporate prior knowledge of the distribution. The nominal value for Beta is 2.
     - Kappa: 0. Secondary scaling parameter. The nominal value for Kappa is 0.
  • 측정 함수: batteryMeasurementFcn.

측정 함수를 구현하는, 앞에서 정의한 Simulink 함수의 이름입니다.

  • 측정 잡음: Additive로,시불변 공분산 1e-3을 갖습니다.

측정 잡음은 측정 장비 정확도를 기반으로 추정됩니다. 배터리 전압 측정을 위한 전압계는 약 1%의 정확도를 갖습니다. 배터리 전압은 약 4V입니다. 이에 따라 $max(dE_m) \approx 4*1\% = 0.04$가 됩니다. 따라서 $V = (max(dE_m))^2 \approx 1e-3$으로 설정합니다.

  • 샘플 시간: $Ts$.

배터리 성능 저하 추정하기

배터리 성능 저하는 용량 $C_q$를 줄여서 모델링됩니다. 이 예제에서 배터리 용량은 성능 저하 효과를 보여주기 위해 방전-충전 사이클 1회당 1Ah만큼 감소하도록 설정되었습니다. 용량의 성능 저하 속도가 사전에 알려져 있지 않으므로 $ C_q $의 상태 방정식이 무작위 행보가 되도록 설정합니다.

$C_{q_{k+1}} = C_{q_k} + W_{C_q}$

여기서 $k$는 방전-충전 사이클 횟수이고 $W_{C_q}$는 공정 잡음입니다.

배터리는 배터리 충전 상태가 30%일 때 자동으로 충전되고 충전 상태가 90%일 때 방전으로 전환되도록 구성되었습니다. 이 정보를 사용하여 충전 또는 방전 사이클에 대해 전류 $I$를 적분하여(전하 집적법, coulomb counting) 배터리 용량을 측정합니다.

$C_q$의 측정 방정식은 다음과 같습니다.

$$ C_{q_k}^{Measured} = C_{q_k} + V_{C_q} =
\frac{\int_{t_{k-1}}^{t_k}{I}dt}{(\Delta SOC)_{nominal}}
=\frac{\int_{t_{k-1}}^{t_k}{I}dt}{|0.9-0.3|}=
\frac{\int_{t_{k-1}}^{t_k}{I}dt}{0.6}$$

여기서 $V_{C_q}$는 측정 잡음입니다.

배터리 성능 저하의 상태 및 측정 방정식은 다음과 같은 상태공간 형태로 바꿀 수 있습니다.

$$ C_{q_{k+1}} = A_{C_q} C_{q_k} + W_{C_q} $$

$$ C_{q_k}^{Measured} = C_{C_q} C_{q_k} + V_{C_q} $$

여기서 $A_{C_q}$$C_{C_q}$는 1입니다.

위의 선형 시스템에 대해 칼만 필터를 사용하여 배터리 용량을 추정합니다. 선형 칼만 필터에서 추정된 $C_q$는 SOC 추정을 개선하는 데 사용됩니다. 이 예제에서는 이벤트 기반 선형 칼만 필터가 $C_q$를 추정하는 데 사용됩니다. $C_q$는 충전 또는 방전 사이클에 대해 측정되므로 선형 칼만 필터는 충전 또는 방전이 끝날 때만 활성화됩니다.

다음과 같이 블록 파라미터와 옵션을 구성합니다.

모델 파라미터를 클릭하여 플랜트 모델 및 잡음 특성을 지정합니다.

  • 모델 소스: Input Port.

이벤트 기반 칼만 필터를 구현하기 위해 상태 방정식은 이벤트가 발생한 경우에만 활성화됩니다. 즉, 상태 방정식도 이벤트 기반입니다. 선형 시스템 $x_{t+1} = Ax_t + Bu_t + w_t$에 대해 상태 방정식이 다음과 같도록 설정합니다.

$ x_{t+1} = \left \{ \begin{array}{cc} Ax_t + Bu_t + w_t, t=t_{enabled} \\ x_t, t \neq t_{enabled} \end{array} \right. $.

  • A: $ \left \{ \begin{array}{cc} A_{C_q}, t=t_{enabled} \\ 1, t \neq t_{enabled} \end{array} \right. $. 이 예제에서 $A_{C_q}=1$입니다. 그 결과 $A$는 항상 1입니다.

  • C: $C_{q_k}^{Measured} = C_{q_k} + V_{C_q} = \frac{\int_{t_{k-1}}^{t_k}{I}dt}{0.6}$이므로 1입니다.

  • 초기 추정값 소스: Dialog. Initial state x[0]에 초기 상태를 지정합니다.

  • 초기 상태 x[0]: 30. 배터리의 공칭 용량(30Ah)입니다.

  • Q: $ \left \{ \begin{array}{cc} 1, t=t_{enabled} \\ 0, t \neq t_{enabled} \end{array} \right. $

공정 잡음 $W_{C_q}$의 공분산입니다. 용량의 성능 저하 속도가 방전-충전 사이클 1회당 약 1Ah이므로 공정 잡음이 1이 되도록 설정합니다.

  • R: 0.1. 측정 잡음 $V_{C_q}$의 공분산입니다. 용량 측정 오차가 1% 미만이라고 가정합니다. 배터리 용량이 30Ah이면 측정 잡음 $V_{C_q} \approx (0.3)^2 \approx 0.1$입니다.

  • 샘플 시간: Ts.

옵션을 클릭하여 입력 포트 Enable을 추가하여 측정값 업데이트를 제어합니다. Enable 포트는 배터리 용량 추정값을 연속적으로 업데이트하지 않고 충전/방전 이벤트가 발생할 때 업데이트하는 데 사용됩니다.

Enable을 0으로 설정해도 상태 방정식을 사용하는 예측은 비활성화되지 않습니다. 이것이 바로 상태 방정식도 이벤트 기반이 되도록 구성된 이유입니다. Kalman Filter 블록에 대해 이벤트 기반 A와 Q를 설정하면 Enable을 0으로 설정할 경우 상태 방정식을 사용하는 예측이 비활성화됩니다.

결과

시스템을 시뮬레이션하기 위해 배터리 파라미터를 불러옵니다. 파일은 $E_m(SOC,T)$, $R_0(SOC,T)$, $R_1(SOC,T)$ 등의 배터리 파라미터를 포함합니다.

load BatteryParameters.mat

시스템을 시뮬레이션합니다.

sim('BatteryExampleUKF')

무향 칼만 필터는 각 시간 스텝에서 전압 측정값 $E_m$을 기반으로 SOC의 추정값을 제공합니다. 실제 SOC, 추정된 SOC, 그 차이를 플로팅합니다.

% Synchronize two time series
[RealSOC, EstimatedSOC] = synchronize(RealSOC, EstimatedSOC, 'intersection');

figure;
subplot(2,1,1)
plot(100*RealSOC,'b','LineWidth',1.5);
hold on
plot(100*EstimatedSOC,'r--','LineWidth',1);
title('State of Charge');
xlabel('Time (s)');
ylabel('SOC (%)');
legend('Actual','UKF estimate','Location','Best','Orientation','horizontal');
axis tight

subplot(2,1,2)
DiffSOC = 100*(RealSOC - EstimatedSOC);
plot(DiffSOC.Time, DiffSOC.Data, 'LineWidth', 1.5);
xlabel('Time(s)');
ylabel('\Delta SOC (%)','Interpreter','Tex');
legend('Difference between Real SOC and Estimated SOC','Location','Best')
axis tight

초기 추정 오차 이후에 SOC가 실제 SOC로 빠르게 수렴됩니다. 최종 추정 오차는 0.5% 오차 이내에 있습니다. 무향 칼만 필터는 SOC의 정확한 추정값을 제공합니다.

SOC 추정을 개선하기 위해 배터리 용량이 각 방전-충전 천이에서 추정됩니다. 배터리 시스템은 배터리가 어느 과정에 있는지 알려주는 지표 신호를 출력합니다. 지표 신호에서 방전 과정은 -1로 표현되고 충전 과정은 1로 표현됩니다. 이 예제에서 지표 신호의 변화는 용량 추정을 위해 칼만 필터를 활성화 또는 비활성화할 시점을 판단하는 데 사용됩니다. 실제 용량과 추정된 용량, 충전-방전 지표 신호를 플로팅합니다.

figure;
subplot(2,1,1);
plot(RealCapacity,'b','LineWidth',1.5);
hold on
plot(EstimatedCapacity,'r--','LineWidth',1.5);
xlabel('Time (s)');
ylabel('Capacity (Ah)');
legend('Actual','KF estimate','Location','Best');

subplot(2,1,2);
plot(DischargeChargeIndicator.Time,DischargeChargeIndicator.Data,'b','LineWidth',1.5);
xlabel('Time(s)');
ylabel('Indicator Signal');

일반적으로 칼만 필터는 실제 용량을 추적할 수 있습니다. 추정된 용량과 실제 용량 사이에 반 사이클의 지연이 있습니다. 이 지연은 측정값의 타이밍으로 인해 발생합니다. 배터리 용량 성능 저하 계산은 완전한 방전-충전 사이클 1회가 끝나면 발생합니다. 전하 집적법(coulomb counting)은 이전 방전 또는 충전 사이클을 기반으로 용량 측정값을 제공합니다.

요약

이 예제에서는 Simulink의 Unscented Kalman Filter 블록을 사용하여 리튬 배터리의 비선형 상태 추정을 수행하는 방법을 보여주었습니다. 배터리 용량 추정을 위해 이벤트 기반 칼만 필터를 개발하는 단계도 설명했습니다. 새로 추정된 용량은 무향 칼만 필터의 SOC 추정을 개선하는 데 사용됩니다.

참고 문헌

[1] Huria, Tarun, et al. "High fidelity electrical model with thermal dependence for characterization and simulation of high power lithium battery cells." Electric Vehicle Conference (IEVC), 2012 IEEE International. IEEE, 2012.

[2] Wan, Eric A., and Rudolph Van Der Merwe. "The unscented Kalman filter for nonlinear estimation." Adaptive Systems for Signal Processing, Communications, and Control Symposium 2000. AS-SPCC. IEEE, 2000.

관련 항목