「光が当たれば発電する」——それだけじゃないんです。
太陽電池って、一見シンプルに見えますよね。光を浴びれば電流が流れて、電圧が出る。でも、実際の特性をグラフにしてみると、曲線の「形」にすべての秘密が隠されているんです。
例えば、こんな経験はありませんか?
- データシートのI-V曲線を見ても「なんとなく右上がり」としか思えない
- 「直列抵抗」と「並列抵抗」の違いを聞かれて、うまく説明できない
- フィルファクター(FF)って数値、何を意味するのかピンとこない
この記事では、ブラウザで動く無料シミュレーターを使って、太陽電池セルの「見えない内部状態」を可視化しながら解説します。
しかも、ただ見るだけじゃない。実際に動くコードを書き、数値計算の手順を追い、現実の不良解析にどう使うかまで踏み込みます。
▶ 今回使うシミュレーター: 太陽電池セル特性シミュレーター (ブラウザで即動作、登録不要)
ざっくり本質——「水槽のたとえ」で直感を作る
太陽電池セルの動作を一言で言うなら:
「光で押し上げられた電子が、ダイオードという堰を越えて流れる様子」
想像してみてください。
- 水槽 = 太陽電池セル
- 光(照射強度G) = 蛇口から注がれる水の量。光が強いほど、水槽に水がどんどん入ってくる(= 電流が増える)
- ダイオード = 水槽の出口にある「一方通行の堰」。電子はこの堰を越えないと外に出られない
- 電圧(V) = 堰の高さ。電圧を高くすると、堰を越えるのに必要なエネルギーが増える
- 直列抵抗(Rs) = 堰から先の排水管が細くなっている状態。いくら水を押し出そうとしても、出口で詰まる
- 並列抵抗(Rsh) = 水槽の壁に空いた小さな穴。ここから水が漏れてしまう
このたとえで重要なのは、理想的な太陽電池は「完全な堰」と「漏れのない水槽」が必要だということ。
現実のセルでは、電極の接触抵抗(Rs)や結晶欠陥によるリーク(Rsh)が必ず存在します。この2つの抵抗値が、曲線の「肩」と「腰」を決定的に変えてしまう——それがこの記事の核心です。
数式で理解する——シングルダイオードモデル
さて、たとえ話だけでは設計には使えません。ここからは実際の計算式に入ります。
太陽電池セルの電流-電圧特性は、以下のシングルダイオードモデルで記述されます。
I = I_{ph} - I_0 \left[ \exp\left( \frac{V + I R_s}{n V_T} \right) - 1 \right] - \frac{V + I R_s}{R_{sh}}
各項の意味を日本語で解説します:
| 項 | 意味 | 単位 | 現実的な値の目安 |
|---|---|---|---|
| $I$ | セルから取り出せる電流(出力) | A | 0〜9 A(セルサイズによる) |
| $I_{ph}$ | 光電流(光で生成されたキャリアによる電流) | A | 照射強度に比例(1000 W/m²で約8〜9 A) |
| $I_0$ | 暗飽和電流(暗闇でも流れる微小な逆方向電流) | A | 10⁻¹¹〜10⁻⁸ A(極めて小さい) |
| $V$ | セルの端子電圧 | V | 0〜0.7 V(単セル) |
| $R_s$ | 直列抵抗(電極・配線・半導体バルクの抵抗) | Ω | 0.1〜1 Ω(健全なら0.1〜0.5 Ω) |
| $R_{sh}$ | 並列(シャント)抵抗(リーク経路の抵抗) | Ω | 100〜数千Ω(健全なら500 Ω以上) |
| $n$ | 理想因子(ダイオードの品質指標) | 無次元 | 1〜2(結晶Siで1〜1.5) |
| $V_T$ | 熱電圧 = $kT/q$ | V | 約0.02585 V(25°C時) |
なぜこの式が「解くのが難しい」のか
この式、実は$I$が右辺と左辺の両方に出てくるんです。
つまり、$I = f(I)$という陰関数になっていて、単純に代入して解くことができません。実際の計算では、ニュートン法などの数値解法が必要になります。
導出の1ステップ——暗電流の項を理解する
ダイオードを流れる電流(暗電流)は、理想的なpn接合では:
I_{diode} = I_0 \left[ \exp\left( \frac{V_d}{n V_T} \right) - 1 \right]
ここで、$V_d$はダイオードにかかる電圧。しかし、直列抵抗$R_s$があるため、セルの端子電圧$V$とダイオード電圧$V_d$は異なります:
V_d = V + I R_s
つまり、電流が流れるほど、直列抵抗による電圧降下が発生し、ダイオードにかかる実効的な電圧が増える——これが曲線の「肩をつぶす」メカニズムです。
コードで実装する ★最重要★
それでは、上記の式を実際に動くJavaScriptコードで実装してみましょう。
このコードは、シミュレーターのコア計算ロジックを再現しています。ブラウザの開発者ツール(F12)のコンソールに貼り付けて実行できます。
/**
* 太陽電池セルのI-V特性を計算する(シングルダイオードモデル)
*
* @param {number} G - 照射強度 [W/m²](標準: 1000)
* @param {number} T - 温度 [°C](標準: 25)
* @param {number} n - 理想因子(標準: 1.3)
* @param {number} Rs - 直列抵抗 [Ω](標準: 0.3)
* @param {number} Rsh - 並列抵抗 [Ω](標準: 500)
* @param {number} N - 直列セル数(標準: 1)
* @returns {Array} I-Vペアの配列 [{V, I}, ...]
*/
function calcIVCurve(G = 1000, T = 25, n = 1.3, Rs = 0.3, Rsh = 500, N = 1) {
// 物理定数
const k = 1.380649e-23; // ボルツマン定数 [J/K]
const q = 1.602176634e-19; // 素電荷 [C]
// 温度を絶対温度に変換
const TK = T + 273.15; // [K]
// 熱電圧 VT = kT/q
const VT = k * TK / q; // [V](25°Cで約0.02585 V)
// 光電流 Iph: 照射強度に比例(標準状態 1000 W/m² で 8.5 A と仮定)
const Iph = (G / 1000) * 8.5; // [A]
// 暗飽和電流 I0: 温度依存性を考慮(簡易式)
const I0 = 1.0e-10 * Math.pow(TK / 298.15, 3) *
Math.exp((1.12 * q / (k * 298.15)) * (1 - 298.15 / TK));
// ※ 1.12 eV はシリコンのバンドギャップ(簡易近似)
// I-V曲線の計算(電圧を0から開放電圧付近までスキャン)
const points = [];
const Vmax = 0.7 * N; // 最大電圧(単セル約0.7V)
const steps = 200;
for (let i = 0; i <= steps; i++) {
const V = (Vmax * i) / steps; // 端子電圧 [V]
// --- ニュートン法で電流Iを解く ---
// 目的関数: f(I) = Iph - I0*(exp((V+I*Rs)/(n*VT))-1) - (V+I*Rs)/Rsh - I = 0
// 導関数: f'(I) = -I0*(1/(n*VT))*exp((V+I*Rs)/(n*VT)) - Rs/Rsh - 1
let I = Iph * 0.9; // 初期推定値(短絡電流の90%)
const tol = 1e-12; // 収束判定
const maxIter = 100;
for (let iter = 0; iter < maxIter; iter++) {
const Vd = V + I * Rs; // ダイオード電圧
const expArg = Vd / (n * VT);
// 指数関数のオーバーフロー対策
let expVal;
if (expArg > 50) {
expVal = Math.exp(50); // 大きな値でクリップ(実用上問題なし)
} else {
expVal = Math.exp(expArg);
}
// 関数値 f(I)
const f = Iph - I0 * (expVal - 1) - Vd / Rsh - I;
// 導関数 f'(I)
const df = -I0 * (1 / (n * VT)) * expVal - Rs / Rsh - 1;
// ニュートン法の更新
const delta = f / df;
I = I - delta;
// 収束判定
if (Math.abs(delta) < tol) break;
// 電流が負になったら強制的に0に(逆流防止)
if (I < 0) { I = 0; break; }
}
points.push({ V, I });
}
return points;
}
// --- 使用例 ---
// 標準条件(1000 W/m², 25°C, n=1.3, Rs=0.3Ω, Rsh=500Ω)で計算
const result = calcIVCurve(1000, 25, 1.3, 0.3, 500, 1);
// 最初の5点と最後の5点を表示
console.log("標準条件のI-V特性(最初と最後の5点):");
for (let i = 0; i < 5; i++) {
console.log(`V=${result[i].V.toFixed(4)} V, I=${result[i].I.toFixed(4)} A`);
}
console.log(" ...");
for (let i = result.length - 5; i < result.length; i++) {
console.log(`V=${result[i].V.toFixed(4)} V, I=${result[i].I.toFixed(4)} A`);
}
// 最大出力点(MPP)を探索
let maxPower = 0;
let mppV = 0, mppI = 0;
for (const pt of result) {
const power = pt.V * pt.I;
if (power > maxPower) {
maxPower = power;
mppV = pt.V;
mppI = pt.I;
}
}
console.log(`\n最大出力点 (MPP): V=${mppV.toFixed(4)} V, I=${mppI.toFixed(4)} A, P=${maxPower.toFixed(4)} W`);
このコードのポイント:
- ニュートン法で陰関数を解く — これがシングルダイオードモデル計算の核心
- 指数関数のオーバーフロー対策 — 電圧が高くなると指数が爆発するので、クリップ処理が必要
- 温度依存性を簡易的に考慮 — 飽和電流I₀は温度の3乗とバンドギャップの指数関数に依存
数値例で確かめる
実際に数値を入れて計算してみましょう。
条件:標準状態(1000 W/m², 25°C)
- $G = 1000$ W/m² → $I_{ph} = 8.5$ A
- $T = 25$°C → $T_K = 298.15$ K → $V_T = 0.02585$ V
- $n = 1.3$, $R_s = 0.3$ Ω, $R_{sh} = 500$ Ω
短絡状態(V = 0 V)の計算
$V = 0$ を代入すると:
I_{sc} = I_{ph} - I_0 \left[ \exp\left( \frac{0 + I_{sc} \times 0.3}{1.3 \times 0.02585} \right) - 1 \right] - \frac{0 + I_{sc} \times 0.3}{500}
これをニュートン法で解くと、$I_{sc} \approx 8.493$ A が得られます。
$I_{ph} = 8.5$ A とほぼ等しいですね。直列抵抗が小さければ、短絡電流は光電流にほぼ一致します。
開放状態(I = 0 A)の計算
$I = 0$ を代入すると:
0 = 8.5 - I_0 \left[ \exp\left( \frac{V_{oc}}{1.3 \times 0.02585} \right) - 1 \right] - \frac{V_{oc}}{500}
$I_0 \approx 1.0 \times 10^{-10}$ A とすると、この式を解いて $V_{oc} \approx 0.618$ V が得られます。
最大出力点
コードの実行結果から、MPPは:
- $V_{mpp} \approx 0.504$ V
- $I_{mpp} \approx 8.050$ A
- $P_{max} \approx 4.057$ W
フィルファクター(FF)の計算
FF = \frac{V_{mpp} \times I_{mpp}}{V_{oc} \times I_{sc}} = \frac{0.504 \times 8.050}{0.618 \times 8.493} \approx \frac{4.057}{5.249} \approx 0.773
FF = 0.773 — 健全な結晶シリコンセルでは0.75〜0.82程度が一般的です。この値が0.8を切ると「少し抵抗が大きいかも?」と疑う目安になります。
シミュレーターで遊ぶ——実験3連発
それでは、実際にシミュレーターを開いて、パラメータを動かしてみましょう。
実験1:直列抵抗 Rs を変えてみる
- 条件: G=1000, T=25, n=1.3, Rsh=500, Rsを0.1→1.0→5.0 Ω と変化
結果の見方:
- Rs = 0.1 Ω: 曲線の肩がシャープ。FF ≈ 0.80
- Rs = 1.0 Ω: 肩が明らかに「丸く」なる。FF ≈ 0.65
- Rs = 5.0 Ω: もはや肩がなく、曲線がなだらかに下がる。FF ≈ 0.35
なぜ? 直列抵抗が大きいと、電流が流れるたびに $I \times R_s$ の電圧降下が発生します。これにより、ダイオードにかかる実効電圧が下がり、高電圧側で電流が取れなくなる——これが「肩がつぶれる」現象です。
現場での教訓: はんだ不良や電極の接触抵抗増加は、この形で現れます。Rsが1Ωを超えたら要注意。
実験2:並列抵抗 Rsh を変えてみる
- 条件: G=1000, T=25, n=1.3, Rs=0.3, Rshを500→100→20 Ω と変化
結果の見方:
- Rsh = 500 Ω: 低電圧側でほぼ水平。Isc ≈ 8.5 A
- Rsh = 100 Ω: 低電圧側でわずかに傾き。Isc ≈ 8.3 A
- Rsh = 20 Ω: 低電圧側の傾きが顕著。Isc ≈ 7.5 A
なぜ? 並列抵抗が小さいと、光電流の一部がリーク経路から逃げてしまいます。これが「腰が落ちる」状態。特に低電圧領域で影響が大きく、短絡電流が減少します。
現場での教訓: マイクロクラックや端面のリークは、この形で検出できます。Rshが100Ωを切ると不良の可能性大。
実験3:理想因子 n を変えてみる
- 条件: G=1000, T=25, Rs=0.3, Rsh=500, nを1.0→1.5→2.0 と変化
結果の見方:
- n = 1.0: 立ち上がりが急峻。Voc ≈ 0.65 V
- n = 1.5: 立ち上がりが緩やかに。Voc ≈ 0.58 V
- n = 2.0: さらに緩やか。Voc ≈ 0.52 V
なぜ? 理想因子nはダイオードの「非理想性」を表します。nが大きいほど、同じ電圧で流れる暗電流が増えるため、開放電圧Vocが低下します。また、曲線の立ち上がりが緩やかになるため、MPPの電圧も下がります。
現場での教訓: ペロブスカイト太陽電池など新しい材料ではnが2に近いことがあります。nの値から、再結合のメカニズム(拡張型かSRH型か)を推定できます。
現場でハマるポイント——適用限界と落とし穴
1. 「直列抵抗と並列抵抗は独立」という誤解
シミュレーターではRsとRshを独立に動かせますが、実際の不良セルでは両方が同時に悪化することが多いです。
例えば、マイクロクラックが入ると:
- 電流経路が狭まる → Rs増加
- クラック部分でリーク → Rsh低下
「Rsが増えたらRshも減っていないか?」 常にセットで確認するクセをつけましょう。
2. 開放電圧Vocの温度依存性を軽視しない
「Vocは温度で変わらない」と思っていませんか?
実際には、温度が1°C上がるごとにVocは約2〜3 mV低下します。
\frac{dV_{oc}}{dT} \approx -\frac{V_{oc} - n V_T \ln(G)}{T}
60°Cの環境では、25°C時よりVocが約0.1 Vも低下。システム設計でこれを考慮しないと、インバータの入力電圧不足を招きます。
3. シミュレーターのパラメータ範囲に対する過信
Rsを10Ω、Rshを10Ωなど極端な値に設定すると、変換効率が100%を超えることがあります。
これは、シングルダイオードモデルの適用限界を超えているからです。現実のセルでは:
- Rs: 0.1〜1 Ω(健全なら0.1〜0.5 Ω)
- Rsh: 100 Ω以上(健全なら500 Ω以上)
- n: 1〜2(結晶Siで1〜1.5)
まずは「普通の範囲」で感覚を掴んでから、あえて不良状態を再現するのが上達のコツです。
4. シングルダイオードモデルの限界
このモデルは1つのダイオードでセル全体を近似しています。しかし、実際のセルでは:
- 表面と裏面で再結合速度が異なる(2ダイオードモデルが必要なケース)
- 部分影の影響を表現できない
- 高注入効果(高照度下でのキャリア密度増加)を無視
あくまで「教育用・傾向把握用」 と割り切り、精密設計には専用ソフトを使いましょう。
まとめ——3つの要点
-
I-V曲線の「形」がすべてを語る
- 肩のつぶれ → Rs増加(電極不良・はんだ不良)
- 腰の落ち → Rsh低下(マイクロクラック・リーク)
- 立ち上がりの緩さ → n増大(再結合欠陥)
-
数値計算の核心はニュートン法
- シングルダイオードモデルは陰関数
- 指数関数のオーバーフロー対策が実装のポイント
- 現実的なパラメータ範囲を守る(Rs: 0.1〜1 Ω, Rsh: 100 Ω以上)
-
シミュレーターで「不良の指紋」を覚えろ
- 異常なI-V曲線を見たら、Rs, Rsh, nのどれが原因か瞬時に判断できるようになる
- それが現場でのトラブルシューティング力になる
さあ、あなたの手で確かめてみてください。
▶ 太陽電池セル特性シミュレーター — ブラウザで即動作、登録不要
スライダーを動かすたびに、I-V曲線がリアルタイムで変化します。「Rsを0.3から2.0にしたら、確かに肩がつぶれた!」——その体験が、教科書の知識を現場で使えるスキルに変えてくれます。
NovaSolverでは1,600以上の工学シミュレーターを無料公開中 👉 一覧はこちら