CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

PID制御

ファンのコントロールをPID制御でやってみます。

そこまで必要か?というのともはや486CPU関係無くなってますが・・

 

制御量uは偏差eに対する比例項、積分項、微分項にそれぞれのゲインを乗じて合計した連続関数

で表されますが離散的な時間間隔では前状態との加減算で近似でき、プログラムの順次処理に落としこめます

PC上のファンコントロールAPLで1秒のタイマイベントごとに取得された温度から1スロット分のPID計算を行い、得られた制御値をPWM設定値としてコマンド出力するようにしました

 

操作パネルに目標値SVKp、Ki、Kdの各ゲインの入力ボックスを追加しています

 

 

ON/OFF制御

ファンコントロールAPLのタイマイベントに取得した温度に対するファンの制御コマンドを追加し自動制御可能にしました

まずは簡単なON/OFF制御(コタツ制御)です。目標温度40℃、ヒステリシス幅を±2℃(42℃でファンON、38℃でファンOFF)とした時の温度(赤色)、ファンのPWM値(緑)のプロットが以下です。

ファンの制御は完全なON/OFFではなく80%/20%としてあります

このように40℃を中心に制御されていますが当然リプルはあります

さらにヒステリシス幅を±0.5℃にするとこうなりました。温度は安定しますがファンのON/OFFが数秒で繰り返されるので結構うっとおしかったりします

 

コントロールAPL

ホストPC上で486CPUボードと通信するファンコントロールAPLを作ってみました。1秒のタイマイベントごとに486CPUボードへ「R」コマンドを送出してその返値を摂氏温度に変換して表示、ロギング。任意のタイミングで「W」コマンドによりファンを0~100%のデューティで回転させることができます

 

最初の15分、ファンを回転させずに放置、15分後にファンをフル回転(PWM値250=100%)させたときのログでグラフ描画させるとこうなります(横軸:秒)

温度はじりじり上がっていき20~30分で60℃以内の平衡状態になりそうです。冷却ファンは30mm角で見かけ頼りないですが結構強力で5分くらいで初期状態に近いくらいまで冷やすことができています。

もっとも現状CPU自身はシリアルの中継をする簡単な処理しかしてない訳でこれがALU/FPUをこき使うプログラムになるともっと発熱するのかもしれません。それでもだいたい40℃を目標値とおいて良さそうです

ファンコントロール(3)

ホストターミナル上でCPU温度やファンの制御量を見ることができるようになりましたが対話式の手動なのでデータのログやファンの最適化制御ができません。ここはさらに上位のホストPC側でのアプリケーションを作ってみます

まず温度読取りがサーミスタ電圧そのもののA/D変換値で判りにくいのでリニアライズと温度直読できるようにします。

サーミスタ103JTの温度T-抵抗値R(t)特性は

  B:B定数3435K、T0:基準温度25+273K、R0T0のときの抵抗値10kΩ

がデータシートに示されています。一方サーミスタと負荷抵抗RLで分圧された電圧をPICのA/Dコンバータでレシオメトリックに測定するのでカウント値N

                       (ADC入力インピーダンスは省略)

  RL:負荷抵抗 常温でスパンの中央くらいになるよう8.2kΩを選択

となり、ここからTで解くと

カウント数Nと温度T(℃)の関係はこんな感じで実用的な範囲20~100℃はカバーしています

都度、実数計算するのも大変だしカウント数Nは整数の離散的な値しかとらないのでexcel計算値から配列で埋め込み、表引きにしてしまいます

Nは実用的な300~1000、結果は10倍にして整数に丸めてあります

 

ファンコントロール(2)

PICのシリアル入出力をそのままホストPCに接続すれば486CPUとは独立してファンの制御ができますが、ここはいったん486ボードのアプリケーションとして作ってみます。

前に書いたようにPICのシリアルはAm85C30のチャンネルBに直結できるので、チャンネルBの入出力をチャンネルAに中継してホストPCに接続するようにしました。

キャラクタ単位でほとんどそのまま中継しているだけですが数値の入出力だけはマンマシンI/Fを考慮して可読化しています

これをモニタからロード、実行しました。

「R」コマンドでサーミスタ電圧のA/D値を取得、「W」コマンドでファンのPWM制御量を0~250(デューティ0~100%)で設定できます。

ファンコントロール

基板裏面に実装したPIC12F1822に冷却ファンのコントロールFWを入れ込んでみます。

まずCPUの温度を測定するセンサですがプラスチックフィルムでラミネートされた超薄型サーミスタ103JTヒートシンクに銅箔テープで貼り付けました

これは25℃の時の抵抗値が10kΩ、変化率を示すB定数も定格化されているので校正無しでだいたいの温度が読み取れそうです。

ヒートシンクに冷却ファンを固定してCPUにセット。ロゴ面が汚れるのがイヤなのでグリスや熱伝導テープは使わずに乗っかっているだけです

 

 

PICに書き込んだファームウェアはこのような感じ。シリアルのコマンドでサーミスタ電圧の読取り、ファンへのPWM信号出力を指示できます

 command:’R’                                   response: temp(L),temp(H) 

    command:'W',pwm(L),pwm(H)     response:'Z' 

久々にPICのコーディングしましたが多重化されたピンの機能設定でいつも引っかかります。

アナログ入力、PWM出力、シリアル入出力と機能を明示的に設定しても共用するデジタルポートの入出力設定の影響を依然として受けるのが解せません。設定したピン機能を最優先して共用する機能は切離しても良さそうなのですが

ハード完成

最後に残っていたパラレル拡張コネクタ20ピンをくっつけて実装部品がすべて完了しました。PPICS82C55Aがアクセス速度の問題かチップ自体の不良なのかよくわからないのですがときどき指定した通りの出力が出ずビット抜けすることがあるのでuPD71055-10に差し替えてあります

 

裏面です。今回は珍しくハード設計ミスが無くパタン修正、ジャンパは無しでいけました(グルーロジックのミスはCPLD修正で吸収できたので)

反省点としては

・やはりZIFソケットに干渉して四隅の取付孔の1つか使えないこととジャンパポストが実装できないこと

・Dsubコネクタの上側の取付孔がパタンや部品に近すぎて菊座金が使えなかったこと

・CPUピンの隣接するVCC/GNDピン間に1608サイズのパスコンのパタンを用意していましたが、跨るくらいの大きいサイズがいいだろうと後付けした部分が少し汚い

・シリアルコントローラAm85C30に自前の水晶を抱かせればよかったです。そうすればボーレートの自由度が上がったのですが

 

先代のボードと並べてみるとこんな感じ。150mm×200mmが100mm×100mmになったので面積比では1/3です

今回はタイマ8253、割込みコントローラ8259は割愛してしまいましたがNMICPLDに引き込んであるので固定周期のタイマも組み込んでインターバル割込みをさせてみることはできそうです