NETLIST STUDIO GUIDE
制御回路
Buckを一から構成し、PWM、PID、閉ループ、dead timeを段階的に確認します。
この章の境界
この章のControl、独自ブロック、Firmware、Feedbackはexperimentalです。まずシミュレーションだけで操作し、生成されたC++、I/O割当、安全値、回路モデル、解析条件を確認します。
⚠️ この章の50 V Buckは学習用シミュレーション条件です。この記載だけで実機を製作、通電、接続しないでください。感電、発火、蓄積エネルギー、半導体破壊を防ぐ定格・絶縁・保護設計は別途必要です。
制御Projectでは、次の流れを作ります。
回路の測定点 → CircuitProbeInput → PID → PWM → CircuitActuatorOutput → 回路の制御source
└──────────────→ Scope
回路のみでは制御電圧/電流sourceは設定した初期値の固定DCとして計算されます。時間ごとに指令を変えるには制御を含むFeedbackを使います。
練習3: Buck回路を配置する
最初は50 kHz、目標24 Vの非同期Buckモデルを作ります。盤面の位置ではなく、次の電気的接続を正本にしてください。
| 部品 | 値/model | 接続と役割 |
|---|---|---|
V001 DC電源 | 50 V | +をDC bus、-をGND |
M001 N-MOSFET | NMOS_POWER_DEFAULT | DrainをDC bus、Sourceをswitch node |
VCTRL001 制御電圧出力 | 初期0 V、範囲0〜10 V | MOSFETのGate–Source間を駆動 |
D001 Schottky diode | D_SCHOTTKY_POWER | AnodeをGND、Cathodeをswitch node |
R002 | 1 Ω | switch nodeから出力側へのseries要素 |
IP001 Iプローブ | - | R002とL001の間へ直列配置 |
L001 | 470u H | switch node側から出力nodeへ直列配置 |
C001 | 100u F、初期電圧0 | 出力nodeからGND |
R001 load | 20 Ω | 出力nodeからGND |
VP001 Vプローブ | label出力電圧 | 出力nodeをGND基準で測定 |
- power stage: 電源、MOSFET、diode、L、C、load、GNDの電力経路を確認します。
- probe/actuator:
IP001、VP001、VCTRL001の位置と向きを確認します。 - binding設定: 選択した測定点または制御出力をどのControl blockへ公開するか確認します。
接続を検証する
- DC bus、switch node、output node、GNDの4つを順に強調表示します。
IP001が電流経路へ直列に入り、別配線で迂回されていないことを確認します。VP001がoutput nodeへ接続されていることを確認します。VCTRL001の初期値が指令範囲内で、最小値が最大値より小さいことを確認します。- SPICE入力で
V001、M001、VCTRL001、D001、R002、IP001、L001、C001、R001を確認します。
MOSFETやdiodeの向きが逆の場合は、値を調整する前に回転と端子を修正します。通常TRANでVCTRL001を固定DCとして使ってもPWM動作にはならないため、その結果を閉ループ動作と解釈しないでください。
回路と制御グラフをbindingする
- 回路上の
VP001を選び、Inspectorのフィードバック入力として使用を有効にします。 - 対応する
CircuitProbeInputが作成されたことを確認します。 VCTRL001を選び、Inspectorのbinding状態とCircuitActuatorOutputを確認します。計測・制御paletteから新しい専用制御出力を配置した場合は、対応ブロックも同じ操作で作成されます。- 上部で
制御へ切り替えます。 - 入力ブロックが
VP001、制御先ブロックがVCTRL001を指していることを確認します。
表示中のRefID、物理量、入力/出力方向が回路上の対象と一致していることを確認します。似た名前の別RefIDへ自動で付け替わることはありません。
RefIDを変更、削除、複製した場合はbindingを再確認します。回路の見た目が同じでも、別RefIDへ黙って接続されることはありません。
PWMだけのopen-loopを作る
閉ループへ進む前に、固定Dutyで経路を1段ずつ確認します。
Constant、PWM、Scopeを配置します。Constant.out → PWM.dutyを接続し、Constantを0.5にします。PWM.out → CircuitActuatorOutput.inを接続します。Constant.out → Scope.inも接続し、labelをDuty指令、step表示、単位%にします。- PWMを次の値へ設定します。
- Duty指令: Constantの
0.5をPWMへ入力します。 - PWM: 50 kHz、0〜10 VのGate波形へ変換します。
- actuator/Scope: 回路制御出力へ渡す経路と観測経路を分けて確認します。
| PWM設定 | 値 |
|---|---|
| frequency | 50000 Hz |
| low/high | 0 V/10 V |
| initial phase | 0 |
| Duty update | period-boundary |
Feedbackのsample timeを1us、durationを10msにします。PWMではfrequency × sampleTime <= 0.1が必要です。この例は50000 × 0.000001 = 0.05で条件内です。
モデル診断にerrorがなければビルドしてシミュレーションを1回実行し、Gate command、出力電圧、インダクタ電流、Dutyを確認します。理想BuckのVout≈Vin×Dutyは最初の目安ですが、起動過渡、model、series抵抗、diode降下、rippleがあるため完全一致は要求しません。
PIDで閉ループにする
Constantをもう1つ配置し、labelを目標24V、値を24にします。PIDを配置します。- open-loopの
Constant 0.5 → PWMを削除します。 - 次の接続を作ります。
目標24V.out ─────────────→ PID.setpoint
VP001のCircuitProbeInput.out → PID.measurement
PID.out ─────────────────→ PWM.duty
PID.out ─────────────────→ Scope.in
PWM.out ────────────────→ VCTRL001のCircuitActuatorOutput.in
- setpointとmeasurement: 目標24 Vと
VP001の測定値をPIDへ入れます。 - PIDからPWM: PID出力をDuty指令としてPWMへ渡します。
- 診断と出力: Scope、actuator、右側のPID診断を確認します。
最初の学習値として、次を入力します。
| PID設定 | 値 |
|---|---|
| Kp | 0.01 |
| Ti | 10ms |
| Td | 0 |
| Tf | 100us |
| 出力最小/最大 | 0.05/0.95 |
| 積分初期値 | 0.505 |
| derivative | measurement |
| anti-windup | predictive conditional |
| update | every tick |
全fieldを確定し、PID診断を読みます。空欄、入力途中の-や1e、最小値以上の最大値、非finite値がある間はBuild/Runへ進みません。
閉ループシミュレーションを実行する
- 実機I/O設定で数値形式、入力、出力方式、安全値を確認します。
- Feedbackがsample time
1us、duration10msであることを確認します。 - model diagnosticsとfeedback diagnosticsのerrorを0にします。
ビルドしてシミュレーションを実行します。- 完了後に
結果または波形を開きます。
同じmodelと検証用topologyでは、8〜10 msの出力平均23.7〜24.3 V、startup最大40 V未満、出力ripple 0.3 Vp-p以下が回帰目安です。手作業で部品、配線、model、PIDを変えたProjectへ、この数値を合格保証として流用しないでください。
中止した実行の未完成結果は採用されません。回路、制御graph、I/O、timingを変更すると以前のFeedback結果は古い状態になるため、同じ条件で再実行してください。
結果を診断する
共通時間軸で、最低限次を表示します。
| 系列 | 見ること |
|---|---|
| 出力電圧 | 目標、startup overshoot、定常偏差、ripple |
| インダクタ電流 | peak、ripple、異常な増加 |
| Gate command | 0/10 Vの遷移、edge数 |
| PID指令Duty | controllerが要求した比率、飽和 |
| PWM適用Duty | 周期境界で実際に適用された比率 |
PID指令と適用Dutyは、period-boundaryのため瞬間的に一致しない場合があります。指令が上限または下限へ張り付く場合は、極性、measurement、目標、初期値、Kp/Tiを順に確認します。電流が増加し続ける場合は、結果を採用せず回路と制御を停止して見直します。
PWM同期PIDへ進む
基本の閉ループが理解できた後だけ、PwmSynchronizedSampleとtriggered PIDを追加します。
- measurementを
PwmSynchronizedSample.inへ接続します。 - PWM Dutyを同期sampleの
dutyへfan-outします。 value → PID.measurement、update → PID.update、dt → PID.dtを接続します。- sample phaseを
0.75、PID updateをtriggeredにします。 - 例としてKp
0.01、Ti10ms、Td1ms、Tf100usを使います。
- 標準階層: 関連するblockを階層内へまとめ、breadcrumbで現在位置を確認します。
- 同期経路: PWMのDutyとmeasurementから
value、update、dtを作ります。 - 公開port: 階層外と接続する入出力の名前と方向を確認します。
公開portは見た目の位置ではなく、port名、方向、signal typeで外部接続を定義します。階層化後もsetpoint、measurement、Duty、updateの意味が変わっていないことを確認します。
sample phaseは0以上1未満です。50 kHz、base tick 1 µs、duration 10 msではcontroller sampleは10001点、同期updateは500回が目安です。PWM同期はswitching rippleの同じ位相を測るための方法であり、電流制限や実機ADC timingを自動設計する機能ではありません。
相補PWMとdead time
half-bridgeへ拡張する場合はComplementaryPWMを使い、上下Gateを別の制御先へ一対一でbindingします。turn-on delayは各PWM周期より短くし、例として上下各400nsを設定できます。
- turn-offは即時、反対側のturn-onだけを遅延します。
- 遅延中はboth-offとし、上下同時ONを許可しません。
- safe stateはboth-offです。
- 変換後は出力平均、overlap 0、最小both-off時間、温度と損失を再評価します。
dead timeを設定しただけでshoot-through防止が実機保証されるわけではありません。driver遅延、MOSFETのturn-off、Miller効果、配線寄生を実測してください。
完了チェック
- Buckのpower stage、測定点、Gate制御sourceを一から配置した。
- 固定DC sourceとFeedbackで動的に更新されるsourceの違いを説明できる。
- ConstantからPWMへのopen-loopを先に確認した。
setpoint → PID ← measurement → PWM → actuatorの閉ループを作った。- 指令Dutyと適用Duty、出力電圧、インダクタ電流を同じ時間軸で確認した。
- PWM同期、相補PWM、dead timeの制約と実機との差を説明できる。