この記事では、TI TMS320F28335 DSPを使用した単相グリッドタイドインバータの完全なプロジェクトソースコードについて説明します。このコードは、太陽光発電や蓄電システム向けの並網インバータ開発に直接対応しています。EPwmモジュールによる高精度SPWM波形生成、ADCモジュールによるグリッド電圧/電流のリアルタイムサンプリング(AD_28335.c)、ECAPによるグリッドゼロクロスキャプチャ同期ロックフェーズ、PIE割り込みベクターやSysCtrl/CpuTimers/MemCopyなどのシステムコンポーネントが統合されています。制御アルゴリズム部分には、再利用可能なPID_28335.c(双環制御:電流内環+電圧外環調整)、FFT_16.c(16点定点FFT、低オーバーヘッドでのハーモニック検出)、IQmathLib.h(TI公式定点数演算ライブラリ)が含まれています。また、人機インターフェース層としてLEDステータス表示と12864液晶画面表示サポート(Lcd_12864.c)も提供されます。
1. 単なる例題ではなく、グリッドに直結可能な単相グリッドタイドインバータコア
本コードセットは、単なるデモや半完成品ではありません。実際のハードウェアで検証された、完全なグリッド接続機能を持つエンジニアリングレベルの制御ファームウェアです。EPwmモジュールはHRPWMモードを使用し、ADCサンプリングは厳密にPWM周期の中点でトリガーされ、ECAPはグリッド電圧ゼロクロス後、テーブル照合法と線形補間によるサブマイクロ秒級のフェーズロックを実現します。誤差は±0.3°以内です。
2. 全体設計と論理構造
2.1 ハードウェア資源配分と時間軸協調
F28335の外設クロックツリー、割り込み優先順位、DMAチャネルは手動で設定する必要があります。このコードの核心となる設計思想は、制御サイクル全体をミリ秒級、マイクロ秒級、ナノ秒級の3つの時間尺度に分割し、各外設モジュールが役割を果たし、厳密なタイミングを守ることです。
- 主制御サイクル (10kHz): CPU Timer0によってトリガーされます。このサイクルでは、電流ループPID計算、電圧ループPID計算、SPWM占空比更新、LCD更新(非ブロッキング)、LED状態確認を行います。
- ADCサンプリングタイミング: ADC開始信号はTimerではなくEPWM1モジュールのSOCAイベントによってトリガーされます。具体的には、EPWM1カウンタがTBPRD/2に到達すると、SOCAパルスを発行し、ADC SOC0チャネルをトリガーして、グリッド電圧(CH0)、インバータ出力電流(CH1)、直流母線電圧(CH2)をサンプリングします。
2.2 ソフトウェアレイヤー
- ハードウェア抽象化層 (HAL):
DSP2833x_SysCtrl.cはPLL倍率設定、ウォッチドッグ有効化、低消費電力モード設定を行います。 - ミドルウェア層:
AD_28335.cはADCレジスタを直接操作せず、AD_ReadVoltage()やAD_ReadCurrent()のような意味的なインターフェースを提供します。 - アプリケーションロジック層:
PID_28335.cとFFT_16.cが主要なアルゴリズムです。
2.3 技術選択背景
なぜ16点FFTなのか?16点FFTでは、サンプルレート10kHzに対して周波数分解能は625Hzとなりますが、これは単相グリッド標準(IEEE 1547)で必要な2~25次ハーモニック(100Hz~1.25kHz)を十分に識別できます。
3. コアモジュール解析
3.1 EPWMモジュール
以下はSPWM波形生成の要点です。
// SPWM生成関数
void generateSpwm() {
int phase = 0;
for (int i = 0; i < 256; i++) {
int dutyCycle = sineTable[i] * modulationIndex;
setPwmDuty(phase, dutyCycle);
phase++;
}
}
// 死区時間設定
void setupDeadTime() {
EPwmRegs->DBCTL.bit.IN_MODE = 1;
EPwmRegs->DBRED = 300; // 上昇エッジ死区300ns
}
3.2 ADCサンプリングとグリッド同期
ADCモジュールは以下の手順で信頼性を確保します。
// ADCサンプル処理
void processAdcSample() {
uint16_t rawValue = readAdcChannel(0);
uint16_t calibratedValue = applyCalibration(rawValue);
uint16_t filteredValue = medianFilter(calibratedValue);
float voltage = convertToVoltage(filteredValue);
}
3.3 PIDコントローラー
双環構造は以下の通りです。
// PID計算関数
float pidCalculate(PIDController* pid, float error) {
pid->integral += pid->Ki * error;
clamp(&pid->integral, pid->outMin, pid->outMax);
float derivative = pid->Kd * (error - pid->lastError);
pid->lastError = error;
return pid->Kp * error + pid->integral + derivative;
}
3.4 FFTハーモニック分析
16点FFTは以下の方法で実装されています。
// FFT実行関数
void runFft(int16_t* input, Complex* output) {
for (int stage = 0; stage < 4; stage++) {
for (int butterfly = 0; butterfly < 16; butterfly++) {
int idx1 = butterfly;
int idx2 = butterfly + (1 << stage);
Complex temp = multiplyComplex(output[idx2], twiddleFactors[stage][butterfly]);
output[idx2] = subtractComplex(output[idx1], temp);
output[idx1] = addComplex(output[idx1], temp);
}
}
}
4. 工程構築と焼成プロセス
CCS 12.x環境での設定やハードウェア接続時のチェックリストも記載されています。