別の開発案件がドドドドッと割り込んできてしまったため、前回の検討から、大きく期間が空いてしまった。確認したら、なんとおよそ1年も。いかんいかん。前回までの経緯を振り返っておこう。別に何もしていなかった訳ではなく、基礎的な実験と動作検証をしてきたことを以下に記しておく。
前回では、DCDCコンバータ上のマイコン用電源を高効率で作成するための小電力用DCDCコンバータチップについての検証をした。これによって、2W抵抗でやむなく熱にして無駄の消費していた電力ロスを回避することができるようになった。この回路は、実際に組込んで動作確認をしていた。結果、消費電力が少ない場合に出力電圧が上昇するという現象が確認され、そのために、FETのゲート電圧が絶対定格の20Vを超えるという状況が瞬間的に発生し、パワーFETを壊してしまうと言う失敗をしてしまった。出力側にGNDとの間に8~10kΩ程度の抵抗を入れることで、電荷を逃がして電圧の上昇を回避することができることを検証し、安定して動作させることができるようになった。
緑の基板の左下にくっついている蛇の目基板がこの改造を施した部分。
前々回では、PWM幅と信号遅延の関係を解析した。流れる電流や、制御する電圧が変化すると、回路遅延が変化することが確認され、発振防止を回路定数だけで制御する事が難しいことが確認された。ハードウェア(回路)でのみ対応する事は部品点数の増加、つまりはコスト高に繋がるため、ソフトウェアで制御する事とする。しかし、ミッドレンジの安価なPICでは、プログラムメモリ容量の制限があるためあまり高度な処理は困難だ。
そこで、以前より検討してきた制御系の定数を変えた後にその変化が出力に出てくるのを検知するというロジックをソフトウェアで実現してみた。試行錯誤の結果、何とか安定的に動作させることに成功。ソースコードにして40行ほどのロジックだが、これならどんなチープなCPUでも実装できそうだ。応用範囲は結構広そうだ。参考までに、論理部分を以下に記す。
// 制御遅延による発振を避けるためステージ管理をする
// Stage0:モード変更が可能(一定時間経過したら強制的にStage0に)
// Stage1:出力変化が始まるのを待つ(始まったらStage1へ)
// Stage2:出力変化が収束するのを待つ(収束したらStage0へ)
if(ch_count==V_IN){
wait_count++; // 変化待ちカウントアップ
if(wait_count>WAIT_TIME){ // カウンタ満了したら
wait_stage=0; // 強制的にステージ0
stage_count=0; // ステージカウンタリセット
}
switch(wait_stage){ // 変化待ちステージ診断
case 0: // 変化待ちステージ0(待ち不要)
wait_count=0; // 変化開始終了待ちカウンタリセット
pre_duty=DUTY; // 前duty保存
mode_duty_reset(&kitai_ch,&kitai_dir); // モードとdutyを再設定
if(pre_duty!=DUTY){ // Duty変化してたら
wait_stage=1; // 変化開始待ちステージに
pre_value=advalue[kitai_ch]; // 変化比較のため前測定値保存
}
break;
case 1: // 変化待ちステージ1(変化開始待ち)
if(kitai_dir*(advalue[kitai_ch]-pre_value)>=delta[kitai_ch]){ // 変化が閾値以上なら
stage_count++; // ステージ継続カウントアップ
if(stage_count>STAGE1_TIME){ // 閾値以上で安定維持したら
stage_count=0; // カウンタクリア
wait_stage=2; // ステージ2に
pre_value=advalue[kitai_ch]; // 直前値保存
}
}
else{ // 変化が閾値以内(ノイズの影響)なら
stage_count=0; // カウンタリセット
}
break;
case 2: // 変化待ちステージ2(変化完了待ち)
if(abs(pre_value-advalue[kitai_ch])<=delta[kitai_ch]){ // 変化が閾値以内なら
stage_count++; // ステージ継続カウンタアップ
if(stage_count>STAGE2_TIME){ // 閾値以上安定維持したら
stage_count=0; // カウンタクリア
wait_stage=0; // ステージ0に
}
}
else{ // 閾値以上変化したら
stage_count=0; // カウンタリセット
}
pre_value=advalue[kitai_ch]; // 直前値保存
break;
} // 変化待ちステージ診断終了
} // AD4回に1回のDuty見直しサイクル(10kHz時は400us毎)
さあて、基本的な検証は既にできているので、PVを常時動作させるためのDCDCコンバータの完成に向けて気合いを入れて開発を再開しようと思う。