Topページ コンセプト 設計 製作 制御ソフト モニターソフト 問い合わせ

★ 温度自動制御ファンコントローラ ★

PCケースに内蔵し、ファンの音を激減させるファンコント−ラ。
複数の温度センサから複数のファンをコントロールでき、PCと
USB接続して各種設定も変更できる、高機能コントローラ!!
注)本ホームページを参考にして製作されたものに関して保証はできません。 自己責任において製作してください。



【目次】
1.コンセプト・基本構想
2.システム構成・CPU
   2.1 演算処理部の機能
   2.2 CPLDの選択と演算処理部構成
3.設計
   3.1 回路設計
   3.2 パターン設計
   3.3 CPLDの合わせこみ
4.製作
   4.1 基板製作
   4.2 部品実装とCPLDダウンロード
5.制御ソフトウェア
   5.1 ファンとサーミスタの特性
   5.2 温度制御
   5.3 PCとの通信
   5.4 制御ソフトの概要とファイル構成
   5.5 ダウンロード・開発環境
   5.6 組み込みと動作確認
6.モニターソフト
   6.1 基本機能・開発環境
   6.2 ファイル構造
   6.3 インストールと使い方
7.ダウンロードその他


1.コンセプト・基本構想

ページ先頭へ
 PCの騒音を激減させることを目的として、自動制御ファンコントローラを 検討しました。ターゲットはオリジナルウッドPCケースなんですが、 通常のPCケースでも使えるように、ある程度汎用的で目立たないコントローラの 条件を検討します。
 まず、PC内部ですが、通常ケース内部の空気に放熱し、その空気をファン等に よって流動させることによって放熱します。よく、木製だと熱がこもるとか いうことがありますが、それは、金属ケースの場合だと放熱器から空気に伝導し、 空気から金属ケースに伝導した熱が金属ケースの外側で放熱されるの対して、 木の場合、内部の空気熱を外に放熱する効率が金属より悪いということになります。 っということは、ウッドケースでも内部の空気をうまく流動させ、排気することで 充分な放熱効果が得られるはずだということになります。
 そこで、オリジナルウッドケースは 電源内蔵のファンに加えて3つの放熱ファン(吸気用2個、排気用1個)を使って います。今回のファンコントローラはこの3つのファンをコントロールすることを 主目的とします。ただし、ターゲットがオリジナルウッドケースのみでは ちょっとおもしろくないので、汎用的に使えるように4つのファンを制御できる しくみにしようと思います。
 次に自動制御というからには温度制御になりますので温度センサが必要です。 最近は秋月通商等で温度に比例する IC等が販売されています。しかし、3線式で電源が必要であるため、今回は 一般的なサーミスタを使用することにしました。今回のファン制御は、 PCケース内部の空気流動性を確保して、内部放熱板から内部空気へ効率的な放熱を 確保しつつ、ファンの騒音を激減させることが目的になりますので、PCケース 内部の空気温度を測定することが重要となります。そこで、サーミスタを 4個使って、各部の温度測定を可能にします。
 さらにPCショップ等でよく売っているファンコントローラは、5インチベイに 取り付けて手動でボリュームを回してファンの回転数を調節するものがほとんど なんですが、それでは5インチベイを占有してしまう上に、手でいちいち回転数を 調節しなければなららず、めんどくさいことこの上ないといった感じです。 また、最近はLAN、USB、IEEE1394、サウンド等といった今までPCIボードで 実現していた機能がかなりマザーボードに搭載されるようになっています。 そこで、あいているPCIスロットを利用し、ファンコントローラはPCIスロットに 取り付けることにします。PCIからは12Vと5Vの電源のみもらい、PCとの通信は USBを使用することにします。
 以上の検討結果をまとめると、今回のファンコントローラは以下のような 5項目の条件を満たすものとなります。
  1. 温度モニタによる自動制御が可能なこと(手動は必要ない)。
  2. 空冷ファンを4つコントロールできること。
  3. 温度測定用のサーミスタを4つ接続できること。
  4. 5インチベイを占有せず、PCIスロット等に装着できること。
  5. PCからコントロールできること(USBでできることが望ましい)。
んんんん...こんなファンコントローラは見たことありません。
やっぱりオリジナルのものを作ってしまうしかないようです。。。

2.システム構成・CPU

2.1 演算処理部の機能

ページ先頭へ
 ここで、システム構成を設計します。1章での要求機能から、全体のシステムは 図2−1のようなブロック図になります。まずは「CPUおよび周辺回路」の 中を設計します。
 温度センサ(サーミスタ)が4chということは必然的に4chのADコンバータが 必要です。温度管理のためのADコンバータですので、変換速度や精度は 大して必要ありません。それよりも簡単に実現できる方が大事です。 従って、1チップCPU内臓のAD変換器を使用すれば充分です。
 つぎにファン出力ですが、ファンの制御(空気流量制御)はデジタル回路で 一番実現しやすいものとしてPWM制御にします。従って、PWM出力が4ch必要です。 また、たいていのファンには、回転数のセンサ出力がありますので、 パルス入力として4chになります。PWM出力が4ch、パルス入力が4chの計8chの パルス入出力が必要になります。
 CPUを使うので、ソフトウェアのダウンロードや温度モニタ、ファン回転数の モニタ等をできるようにします。そこで、PCとの通信が必要になりますが、 初期のソフトウェアのダウンロード等はRS-232Cで行うのが一般的です。 しかし、最近はUSBが一般的なので、通常使用時はUSB通信にしたいと思います。 そこで、シリアル・USB変換ICを利用してRS-232CとUSBの両方通信できるように します。
 以上のような検討を踏まえて、演算処理部の機能は
  1. AD入力4ch
  2. パルス入力4ch
  3. PWM出力4ch
  4. シリアル通信1ch
  5. USB通信1ch(シリアル・USBは切り替え式でかまわない)
となります。
 これで演算処理部の基本機能がはっきりしたので具体的なデバイスの構成を 検討します。まず、AD変換器については、ワンチップマイコン内蔵の8〜10bit 逐次型ADコンバータで充分です。問題はパルス入出力で、回転センサ入力として インプットキャプチャ機能つきタイマが4chか外部割り込みとして4ch、 PWM出力が4ch必要です。インプットキャプチャあるいは外部割り込みとしての タイマは16bit程度の大きさが欲しいところですが、PWM出力は8bit程度の分解能が あれば充分だと考えられます。これらの条件と開発のしやすさ、入手性等を 考慮すると、おのずとCPUは RENESIS のH8シリーズに絞られます。ここで、 手元に2004年4月号のトランジスタ技術に付属していたH8 CPU基板がありましたので これを利用することにしました。この基板にはH8/3694がついていて、 内部構造は図2-2のように、内臓周辺は表2-1のようになっており、まさに今回の 自動温度制御にピッタリです。この基板はサンハヤトから売り出されており、 サンハヤトの通信販売にてMB-H8Aという型番で¥2,100で購入できます。

表2-1:H8/3694F内臓周辺機能および用途
機能 仕様 用途
フラッシュメモリ 32KByte プログラム実行用
RAM 1KByte プログラム実行用
シリアル通信 SCI 1ch デバッグ用およびUSB用
AD変換器 10bit 逐次型 8ch 4chサーミスタ電圧入力、4chI/Oポート
タイマW 8bit タイマ 内部時間制御用インターバルタイマ
タイマA 8bit タイマ 8bit PWM出力 1ch
タイマV 16bit タイマ 4chファン回転センサ入力


図2−2:H8/3069F内部ブロック図

 ただし、そのままでは 8bit のPWM出力4chに対応できません。 そこで今回はCPLDを利用し、H8/3694FのタイマAで1chのPWM出力、CPLDで残りの 3chのPWM出力をまかなうことにしました。

2.2 CPLDの選択と演算処理部構成

ページ先頭へ
 ここで、8bit PWM出力のCPLD論理回路構成の規模を調べ、どのタイプの CPLDであれば問題なく入るか検証してみます。
 CPLDはザイリンクスとアルテラの2大メーカーがありますが、今回はザイリンクス のものを使用することにしました。論理合成からシミュレーションまで全て フリーのソフトで実行でき、デバイスの値段もアルテラに比べて安価です。
 まず、8bitのフリーランカウンタとコンペアレジスタを組み合わせた PWM出力ロジックを3ch分つくりました。それだけでは基本周期が変更できない ので、10bit のフリーランカウンタを1ch増やし、基本周期のベースになる クロックプリスケーラとして作成しました。ザイリンクスのWebPackでデバイスを 指定して論理合成・配置配線を行った結果、8bit PWMロジック3つと4bit の プリスケーラのロジックでXC9572という非常に安価で小さいCPLDでも大丈夫な ことがわかりました。そこで、今回はXC9572の44ピンPLCCパッケージのものを 使用する事にしました。

 以上の結果から、今回の自動温度制御型ファンコントローラは図2−3のように 温度センサのアナログ入力はH8/3694FのAD変換、クーラーファンの回転センサは H8/3694F、タイマWのインプットキャプチャ(4chあり)、PWM出力は、H8/3694Fの タイマVで1ch、残りの3chをXC9572で実現するシステム構成としました。  これらをまとめると、システム全体では図2−4のようになります。


3.設計・基板製作

3.1 回路設計

ページ先頭へ
温度センサ入力回路
 システム構成が決まったところで、回路設計を行います。 サーミスタの入力回路は4ch分あり、10KΩプルアップでサーミスタを駆動して ローパスフィルタを経由し、直接MB-H8Aのアナログ入力に入れます。 最近は秋月通商等で温度センサとしてアクティブ出力のもの売っているので、 サーミスタ用のコネクタは一応電源も入るようにしておき、温度測定ICを 接続できるようにしておきます。

ファン回転センサ入力回路
 ファン回転センサ入力回路はごく一般的なもので、プルアップ・ローパスフィルタ 経由後、74HC14で受け、CPUのタイマ入力(インプットキャプチャ入力)に 接続します。

ファン駆動回路
 ファン駆動回路は、4V駆動可能なFETを利用したドライバ回路となっています。 ON抵抗も小さく、耐圧も高いので、オープンドレインで直接駆動するタイプです。 今回4chのファンを駆動するので、1chはCPU、残りの3chはCPLDからのPWM制御と するため、CPUのタイマVの出力(TMOV)とCPLDのI/O端子に接続します。

シリアルおよびUSB周辺回路
 次にPCとの通信回路です。基本的にPCとの通信はシリアル通信です。そこで、 まずはMAX232を利用して、PCのCOMポートと接続できるようにします。ただし、 今回はUSBでPCと接続できるようにします。ここで、とっても便利なのが、 シリアル・USB変換を行うIC、フェアチャイルドのFT-232BMです。ICのパッケージも QFPでありながらピン間が0.8mmあるので大きな問題なく自作可能です。 FT-232BMによるUSBと、通常のシリアル通信を切り替えて使用できるようにするため、 5VレベルのTxD/RxD通信ラインをCPLDに経由し、切り替えて使用できるように しました。

CPLD周辺回路
 CPLDに関しては、バスがICの外部端子に出ているCPUではないので、I/Oポートで 接続します。基本的には、4bitのデータバス、3bitのアドレスバス、WR信号に 見立てた計8本をCPUのPort50〜Port57と接続します。あとは予備として数本 CPLDのあまったI/O端子と接続しておきます。また、CPLDにはDIP-SWも接続 しておき、何かあれば使えるようにしておきます。

その他
 リセットについては、H8の中にリセット回路が入っているのですが、 CPLDも確実にリセットしたいため、外づけでM51953を使ったリセット回路を 構成しました。74HC14を使った簡易リセット回路でも問題ないと思います。 電源については、PCからの5V/12V電源を利用するのでコンデンサをつけるだけに しています。

 以上で回路設計の説明は終わりです。回路図はpdfファイルになっているので、 図3−1の回路図をクリックして pdfファイルあるいは画像イメージをダウンロードしてください。 また、パーツリスト図3−1の回路図 をクリックすれば表示されます。



図3-1:マルチファンコントローラ回路図


3.2 パターン設計

ページ先頭へ
 今回の基板はPCの内部に納めることを前提としています。そこで、 どうやって納めるかですが、USB接続しやすく、どんなPCにも納まるということで PCIスロットに装着できる形としました。ただし、PCIスロットでは12V電源が 細い1ピンのみにしか割り当てられていないため、同時に4つのファンを 駆動するには少々不安です。そこで、PCIスロットにささる形というだけで、 電源は別途PCの電源を接続するようにします。また、このサイトで紹介している ウッド製PCケースに装着する場合はケース内の空いた部分スペーサ&木ネジで 搭載することもでできるので、基板にネジ穴を設けることにします。
 パターンの設計には、フリーの基板設計用CAD、PCBEを利用し、両面基板として 設計しました。基板の大きさはPCI装着用のパターン部も含め、最大で 105mm×140mm程度となるため、サンハヤトの34KR (150mm×200mm 両面ポジ感光基板)を使用しました。PCIスロットに装着 しなくてもよければ100×140mm程度になりますので、その場合は33KRを 使用できます。また、レジストやシルク印刷等を含め、製品みたいな基板を 作りたければ、少々値がはりますが、p-ban.com 等の業者にお願いして作ってもらってもいいと思います。今回はそんなに 難しいパターンではないので、自分で作ることにしました。

 自分で作る場合、プロが作るようなスルーホールはできないので、表と裏を 接続する部分は、PLCCやQFPのチップの下は避けるように引き回します。 また、表面実装品が多いので、部品および信号線の配置は1層目(表)を中心に行い、 2層目(裏)は電源、グランドを中心に配線します。34KRでは元の基板の サイズが大きいので、だいぶ使用しない面があまります。現像材やエッチング液の 節約のため、使用しない面はなるべく銅箔を残すようにします。
 なお、今回はXillinxのCPLDを使用しますので、合わせてCPLDのダウンロード ケーブルも製作してしまいます。ちょうど入る大きさでしたので、今回の 基板パターン図にダウンロードケーブル用のパターン(2枚分)も含めました。
回路図はxilinxから公開されているようですが、それだけではおもしろくないので、 TCK, TDI, TDOの信号合わせて点灯するLEDを追加しました。
  →JTAGダウンローダ回路図: Bsch3Vファイル[jtagcable.ce3]
  →JTAGダウンローダ回路図: pdfファイル[jtagcable.pdf]
  →JTAGダウンローダ回路図: メタファイル[jtagcable.EMF]
パターン図は表3−1にそれぞれリストしておきます。

表3−1:基板パターン図
PCBE基板パターンデータ PCBEファイル シルクパターン図 pdfファイル
1層目パターン図 pdfファイル 1層目確認用パターン図 pdfファイル
2層目パターン図 pdfファイル 2層目確認用パターン図 pdfファイル

3.3 CPLDの合わせこみ

ページ先頭へ
 パターン図ができあがったので、CPLDの端子アサインも決定しました。 ここで2.2節で作成したCPLDの基本的なロジックをボードに合わせて修正します。 CPLDのロジックはverilogで記述しています。 2.2節では8bit PWMロジックを3ch分、PWMクロック用プリスケーラ、を作りました。 それに加えて、DIPスイッチによりH8のシリアル通信をRS232CとUSB(FT232BM)に 切り替えるロジックを加え、ボードに合わせて端子設定を固定します。また、 使用しないポートで未接続のものは出力ポートとして定義して固定値を出力 するか、ボード上でVccかGNDに接続してレベルを固定します。今回は 5本ほど後付で端子を固定し、その他は0固定値の出力端子として定義しました (verlogファイル参照)。
 内部ロジックが出来上がったらxillinxのWebPackを使用して論理合成、配置配線を 行います。本当はシミュレーションを行って動作確認した方がいいのですが、 今回は簡単なロジックなので、特にシミュレーションは行いませんでした。 シミュレータはxillinxであれば、WebPackと一緒にmodelsimもフリーで 使えるものをインストールできます。端子アサインに関してはWebPackの ツールの中で端子を指定できますのでそれを利用するか、直接ucfファイルを 編集します。ちなみに、今回使用したucfファイルはverlogソースファイルと 一緒に参照できるようにしておきます。
 WebPackで配置配線まで完了したらCPLDの内部ロジックの作成完了です。

CPLD verilog ソースコード pwmout.v
CPLD ucf ファイル(CPLDのピンアサイン定義) pwmout.ucf
CPLD jedファイル(配置配線データ) pwmout.jed
(ダウンロードする場合は右クリックして「対象をファイルに保存」を 選択してください。)



4.製作


4.1 基板の製作

ページ先頭へ
 パターンができあがったら、OHPフィルムに1層目、2層目別々に印刷 します。印刷面と基板を密着させるため、1層目は反転印刷です。印刷が できたら、1mm厚程度の透明なプラスチック製のビニール板かアクリル板をはさみ、 両面のパターンがピッタリ一致するように調整して両面テープで1層目、2層目の フィルムを張り付けます。フィルムの間に基板を挟みこみ、感光させます。 感光は普通の蛍光燈でもできるのですが、やはり感光用の道具(サンハヤトが 売り出していライトボックス等)を使ったほうがいいでしょう。今回は最少で 0.3mm幅のパターンですが、感光はかなり長めの時間行い、現像はちょっと 熱めの温度で行った方が感光した部分としていない部分の境界がシャープに なります。現像が完了したらエッチングを行います。エッチングも少々 高めの温度(45℃位)で多めのエッチング液を使用した方がきれいに エッチングできます。エッチングが完了すると、図4-1、図4-2のようになります。



図4-1:ボード部品面


図4-2:ボード半田面

エッチングが完了したら、そのままの状態で穴あけ、加工を行います。部品面と 半田面をつなぐスルーホールの部分は0.6mm、通常の穴は0.8mm、太めの端子が入る 部分(ピンヘッダ等)は1.0mmそれ以外のものは部品やねじの大きさに合わせた 径の穴を開けます。穴あけが終わったらカッターでファンコントローラの部分と JTAG書き込み器の部分を切り出します。ファンコントローラの方はPCIスロットに 入る形ですので、それに合わせて加工します。カッターや金のこを利用して 外形を切り出し、やすりで角を取ります。PCIのスリットの部分は金のこで 切込みを入れいると大体ちょうどいい幅になります。
 これで基板の加工は完了ですので、アルコールを使って感光剤をきれいに ふき取り、丁寧に水洗いしてよく乾燥させます。乾燥後、フラックスを塗って 基板作成完了です。フラックスはスプレー式の法がきれいにぬれるかもしれません。 なお、基板洗浄後、なるべく早く乾燥させてフラックスを塗ったほうがいいです。 あまり時間を置くと、銅箔面が汚くなってしまい、半田がのりにくく なってしまいます。レジストをつけるのも手ですが、コストもかかるし作業も たいへんなので今回はフラックスを塗るだけにしました。完成した基板を 図4-3、図4-4に示します。



図4-3:ボード部品面(基板作成完了)


図4-4:ボード半田面(基板作成完了)


4.2 部品実装とCPLDへのロジックダウンロード

ページ先頭へ
★CPUボード以外の実装
 基板ができあがったら部品を実装します。まず最初にスルーホールになる部分 に鈴メッキ線等を通し、部品面、半田面両側を半田付けします。次に抵抗、 コンデンサ等のチップ部品、FT232BM、74HC14、74HC04、XC9572、MAX232等の 表面実装タイプのICをつけます。FT232BMは0.8mmピッチのQFPタイプの パッケージです。最初にパッドの部分に半田をつけ、次にICを載せて 半田付けします。くれぐれも隣の足とブリッジしないように注意してください。 また、よく目視確認してしっかり半田付けされていることを確認してください。 よく見たら半田がちゃんとついてなかったということはよくあります。 XC9572は44ピンのPLCCパッケージです。まずICをひっくり返してピンの部分を 半田メッキし、基板のパッドの部分も半田メッキします。次にICを載せ、 隅の1ピンを使って仮止めし、ICを固定します。最後にピン全部をしっかりと 半田付けします。これで表面実装品はすべて実装したので、次にリード 部品を実装します。抵抗、コンデンサ、トランジスタ、LED等の部品をつけ、 最後に一番背の高いコネクタ等をつけます。なお、この時点では まだCPUボードはつけません。ここまでのできあがりを図4-5に示します。
★PCIアングルの作成
 ここで、PCI取り付け用のアングルを加工してしまいます。まず、PCショップ等に よく販売しているPCI空きスロット用のアングルを用意し、それにUSB用の角穴を あけます。他のPCIボードを参考にしながら現物あわせで位置を確認してから、 ドリル等で穴を開け、やすりで徐々に広げながら角穴にしていきます。板厚は 約1mm程度と薄いはずですのでそんなに大変な加工ではないと思われます。 PCIのアングルの加工が終了したら、基板に取り付けるL型の金具を加工します。 DIY店等で売っているアルミのL字型アングルを小さく切り出し、基板に固定する ためのねじ穴(穴ではなくU字型の切り込みでもOK)を加工します。PCIアングル とは接着剤等でつけてしまってもかまいません。大きな半田ごてを持っていれば L字型の金具とPCI用のアングルは半田でつけてしまうと導通も確保できて良いと 思います。接着剤でつけた場合はGNDとPCIアングルとを何らかの形で導通するように してください。できあがったアングルを図4-6に示します。

図4-6:(a)PCIアングル(フロント側)
図4-6:(b)PCIアングル(リア側)
★JTAGダウンローダーの作成
 ここで先にCPLDのJTAGダウンローダーを作ってしまいます。図4-7のように部品を 実装します。74HC125の足はスルーホールもかねているので、忘れずに部品面、半田面 両方で半田付けしてください。同時にダウンロード用のケーブルも作ってしまいます。 JTAGダウンローダーとファン制御基板を接続するもので、8ピンストレート ケーブルです。8ピンのレセプタクルがなければ10ピンのストレートケーブルで 代用してもかまいません。
 ここで、ファン制御基板、JTAGダウンローダーの両方の電源にテスタをあて、 ショートしていないかどうかを確認します。ショートしている状態でいきなり PCの電源を入れいるとPC側の電源が壊れてしまうこともあるので、必ず電源が ショートしていないことを確認し、ショートしていれば修正してください。 基板か部品実装のどこかで間違いが発生しています。
 電源がショートしていなければとりあえず電源を入れてみます。電源を入れると FT232BMに接続されているLEDが点灯するかもしれませんが、これは点灯しても しなくても気にしなくていいです。電源を入れてみて問題がなさそうであれば CPLDのロジックダウンロードを行います。
★CPLDロジックのダウンロード
 図4-8のようにJTAGダウンローダーとファン制御基板のJTAGポートを接続し、 かつPCとJTAGダウンローダーをパラレルケーブルで接続します。ファン制御基板の 電源を入れてxillinxの書き込みソフトiMPACTを使用して書き込みます。xilinxの WebPack Project Navigatorを起動し、Device Configuration を選択すれば 自動的にiMPACTが起動し、問題なければそのままロジックをダウンロードして CPLDに書き込むことができるはずです。問題があれば、iMPACT上でエラーメッセージ が表示されるはずなので、それを参考に修正してください。よくあるのは Deviceが見つからないというエラーか、JTAGダウンロードケーブルに問題あり というエラーです。Deviceが見つからないというエラーであればファン制御基板、 ダウンロードケーブルに問題ありというエラーであればJTAGダウンローダーが ちゃんとできていないということになります。なお、iMPACTの使用方法やCPLD ロジックのダウンロードの仕方等はxillinxのホームページやその他インターネットの 情報を参考にしてください。



図4-8:CPLD書き込み時の接続


★CPU基板の実装と仕上げ
 CPLDのロジックが正常にダウンロードされたらCPU基板を実装します。CPU基板 取り付けようの穴はスルーホールも兼ねているので、部品面と半田面の両方に 半田付けする必要があります。したがって、通常のピンヘッダをそのまま使用 できません。ピンヘッダを使う場合はプラスチックの台座のようなものを取る 必要があります。今回は抵抗等のリード部品の切れ端を利用しました。最終的に できあがった基板は図4-9のようになります。ここで再度、テスターで電源が ショートしていないかどうか確認します。ショートしていなければ電源を 入れてみて何事も起こらないことを確認してください。
 最後に、ケーブル類を揃えます。サーミスタ用のケーブル、PCと接続する シリアルケーブルを作成しておきます。
 これで基板への部品実装は完了です。自動温度制御ファンコントローラの ハードウェアが完成しました。いよいよソフトウェアの作成に取りかかります。

図4-9:ファンコントローラボードの完成



図4-10:ボード上のコネクタ


5.ソフトウェア開発

5.1 ファンとサーミスタの特性

ページ先頭へ
(1)ファンの特性
 DCファンは通常、DCモータと回転センサで構成されています。よく市販されている ファンコントローラはファンに与える電圧を調整して回転数をコントロールするもの がほとんどです。しかし、CPUにより温度制御を行う場合は電圧を制御するとなると 回路構成はどうであれ、基本的にDAコンバータが必要となり、回路規模が大きく なってしまいます。そこで、今回はPWM制御を行うことにしました。 ファンの特性からして、以下の2点について制御ソフトウェアに盛り込んでいます。
  • 起動トルク
     DCファンの特性として、静止摩擦力やその他の問題から回転開始の時に ある程度大きな電力が必要で一度回り始めると回転を下げることができます。 デューティ比でいくと、デューティ比を50〜60%以上にしないと回転を開始 しませんが、一度回転してしまうと、30〜40%まで下げることができます。 したがって、低回転をコントロールしようとする場合は、一度高いデューティ比で 回転を開始させ、その後、希望するデューティ比に下げる必要があります。  今回のファンコントローラはデューティ比が0から0以上に変化するとき、 2秒間100%のデューティ比を出力し、ファンの回転を起動した後、希望する デューティ比に設定するようにしました。これにより、40%程度のデューティ比で ゆっくりと回転させることができます。
  • 最低デューティ比
     ほとんどのファンでは、φ80[mm]以上の大きなファンと、φ60[mm]以下の小径の ファンで回転可能な最低デューティ比が大きく異なります。φ80[mm]のファンでは 最低デューティ比が40%を下回ると停止してしまうものが多くあります。また、 φ60[mm]のファンではデューティ比20%程度まで回転しますが、デューティ比70% 程度を上回るとほとんど最高回転数に達してしまうものも多くあります。 そこで、φ80[mm]以上のファンとφ60[mm]以下のファンで異なるデューティ変換 テーブルを使用し、最低デューティ比もそれぞれ別々に設定することに しました。
  • 回転センサの動作可能範囲
     通常、DCファンは回転センサを持っており、1回転あたり2発のパルスを出す ようになっています。これはホール素子等を利用したセンサとアンプにより 構成されており、出力はオープンコレクタになっているものが多いです。 ただし、ファンの回転制御はファンに与える電源そのものをPWM制御しますので、 回転センサそのものもPWM信号でON/OFFされてしまいます。実験的に確認した 結果、少なくとも1種類はデューティ比60%未満で回転センサが正常に動作しなく なりました。そこで、回転センサはを利用した回転数計算は行いますが、 モニタ用のみとして温度制御には使用しないことにしました。
  • PWM基本周期
     PWMの基本周期を低くした方が低回転域でのコントロール性は良くなります。低い デューティ比でもON時間は長いので、それだけ回転力があります。しかし、 低い周波数、特に回転パルスの周波数と競合するような周波数になると 回転センサのローパスフィルタが構成できなくなってしまい、ファン回転数が 読み取れなくなってしまいます。PWMで駆動するのはファンの電源なので、 当然回転センサは(特にローレベル出力時)、PWM信号が載ってしまいます。 電源がPWMですのでノイズではありません。
     さらに、PWMの基本周期を10KHz程度にすると安いファンではPWM信号に従って モーターのコイルが鳴ってしまい、”ピーーーー”とうるさい音をたてます。 以上の結果から、基本周期は20KHz程度の聞こえない程度の周波数に設定しました。
(2)サーミスタの特性
 サーミスタはさまざまな種類が市販されており、xx電子の103AT等がよく 使われるようです。使用するサーミスタの温度/抵抗値のデータを入手して 電圧・温度および電圧・デューティ比変換テーブルを作成する必要があります。 今回は手持ちのサーミスタを使用したため、サーミスタの温度特性が不明でしたので サーミスタを接着剤で固めて防水加工し、お湯につけて温度特性を実測しました。 その結果をもとに、表5-1のような変換テーブルを作成しました。103ATについては 作成したテーブルがソースコードに含まれています。
表5-1:今回使用したサーミスタの特性(温度特性とAD変換値)
温度 抵抗 AD値 温度 抵抗 AD値 温度 抵抗 AD値 温度 抵抗 AD値
20℃ 13.67 591 36℃ 6.39 399 52℃ 3.13 244 68℃ 1.60 141
21℃ 13.04 580 37℃ 6.12 389 53℃ 3.01 237 69℃ 136 1.54
22℃ 12.37 566 38℃ 5.82 377 54℃ 2.87 228 70℃ 1.48 132
23℃ 11.71 552 39℃ 5.55 365 55℃ 2.75 221 71℃ 1.43 128
24℃ 11.18 541 40℃ 5.30 355 56℃ 2.63 213 72℃ 1.35 122
25℃ 10.73 530 41℃ 5.06 344 57℃ 2.52 206 73℃ 1.31 118
26℃ 10.21 517 42℃ 4.84 334 58℃ 2.41 199 74℃ 1.27 115
27℃ 9.7 504 43℃ 4.63 324 59℃ 2.32 193 75℃ 1.24 113
28℃ 9.27 493 44℃ 4.44 315 60℃ 2.21 185 76℃ 1.20 110
29℃ 8.86 481 45℃ 4.26 306 61℃ 2.13 180 77℃ 1.16 106
30℃ 8.48 470 46℃ 4.07 296 62℃ 2.05 174 78℃ 1.10 102
31℃ 8.05 457 47℃ 3.91 288 63℃ 1.96 167 79℃ 1.07 99
32℃ 7.73 446 48℃ 3.73 278 64℃ 1.89 162 80℃ 1.03 96
33℃ 7.35 434 49℃ 3.58 270 65℃ 1.82 158
34℃ 7.01 422 50℃ 3.42 261 66℃ 1.73 151
35℃ 6.69 410 51℃ 3.28 253 67℃ 1.66 146


5.2 温度制御

ページ先頭へ
 まず最初にファン制御を実行する温度範囲を決定します。Pentium等が定格通りに 動作する周囲温度範囲はおそらく約70℃(60℃かも?)までです。また、 季節的なものを考えると、夏であれば、PC自体がおかれる環境が35℃程度まで あがります。PCの筐体内が35℃以下であれば、CPUクーラーのファンも回っているし、 電源ファンは回りっぱなしなので、取り立ててその他の冷却ファンを動かす 必要はありません。そこで、ファン制御を行う温度範囲としては基本的に 35℃〜70℃までとします。  ただし、35℃でファン回転ON/OFFを切ってしまうと、ちょうど35℃近辺でファンが 回ったり止まったりを繰り返してしまいますので1〜2℃のヒステリシスを 持たせます。
 結果として、温度上昇時は35℃〜70℃(70℃以上は最高回転数に固定)、温度 下降時は33℃まで(33℃以下は停止)をファンコントロール制御対象温度とします。  次に、制御方法です。最初はPID制御を検討したのですが、以下のような理由により 比例制御のみとしました。
  1. 温度変化の速度はゆっくりとしたものであるため、制御周期を選べば静的状態 とみなすことができる。制御周期を0.1秒とすると、0.1秒間での温度変化は それほど大きくない。したがって、微分項(温度の時間的な変化率)を 制御パラメータに加えたとしてもほとんど影響ない。
      →PID制御のI項(微分項)は無視できる。
  2. PCケース内の温度制御を行うので積分項(D項)は必要ない。過去の温度履歴の 加算値を制御パラメータに加えても意味がない。
      →PID制御のD項(積分項)は無視できる。
 以上のような結果により、温度によるベース制御(ベースデューティ比)は 表5-2のようしました。サーミスタの測定温度に比例して冷却ファン駆動信号の デューティ比が変化する簡単なものです。
 実際のソフトウェアは特にデューティ比を計算する必要もないので、サーミスタ 電圧(AD値)からマップ参照でいきなりデューティ比を求める形としました。
表5-2:温度とデューティ比
温度 duty
80mm
duty
60mm
温度 duty
80mm
duty
60mm
温度 duty
80mm
duty
60mm
温度 duty
80mm
duty
60mm
温度 duty
80mm
duty
60mm
30℃ 0% 0% 40℃ 49% 31% 50℃ 66% 54% 60℃ 83% 77% 70℃ 100% 100%
31℃ 0% 0% 41℃ 50% 34% 51℃ 67% 57% 61℃ 85% 79% 71℃ 100% 100%
32℃ 0% 0% 42℃ 52% 36% 52℃ 69% 59% 62℃ 86% 82% 72℃ 100% 100%
33℃ 40% 20% 43℃ 54% 38% 53℃ 71% 61% 63℃ 88% 84% 73℃ 100% 100%
34℃ 40% 20% 44℃ 55% 41% 54℃ 73% 63% 64℃ 90% 86% 74℃ 100% 100%
35℃ 40% 20% 45℃ 57% 43% 55℃ 74% 66% 65℃ 91% 89% 75℃ 100% 100%
36℃ 42% 22% 46℃ 59% 45% 56℃ 76% 68% 66℃ 93% 91% 76℃ 100% 100%
37℃ 43% 25% 47℃ 61% 47% 57℃ 78% 70% 67℃ 95% 93% 77℃ 100% 100%
38℃ 45% 27% 48℃ 62% 50% 58℃ 79% 73% 68℃ 97% 95% 78℃ 100% 100%
39℃ 47% 29% 49℃ 64% 52% 59℃ 81% 75% 69℃ 98% 98% 79℃ 100% 100%

 表5-2はひとつのサーミスタ測定温度に対するベースデューティです。今回の ファンコントローラはマルチですので、4つのサーミスタを使用して4つのファンを コントロールできるようにします。したがって、4つのサーミスタから導き出される デューティ比を総合して最終的なターゲットとなるファンの回転数をコントロール することになるため、ファンの回転制御は表5-1による温度→デューティ比変換を thを温度としてf(th)とすると
        duty = a x f(tha) + b x f(thb) + c x f(thc) + d x f(thd)
となります。ただし、
        duty : あるファンに与えるデューティ比
        tha, thb, thc, thd : 4つのサーミスタA〜Dの測定温度
        a, b, c, d : 4つの測定温度に対する係数で
        a + b + c + d = 1.0 を満たすものとする。
であり、それぞれの温度によるデューティ比の混合率を調整した結果が 最終的なデューティ比となります。この係数a, b, c, d はソフトウェア上、ファン4つ 分あるので、ka[4], kb[4], kc[4], kd[4]という変数で扱っています。また、 ソフトウェアでは
        a + b + c + d = 1.0 を a + b + c + d = 64
となるように設定しています。


5.3 ホストPCとの通信

ページ先頭へ
 今回のコントローラはPC本体内部に実装する構成ですので、外からは稼動状況が 見えません。そこで、PC上で稼動状況や設定変更ができるようにします。 機能的には、温度、デューティ比、ファン回転数等の稼動状況モニタ、使用する サーミスタ、ファンのチャンネル設定、自動制御・マニュアル制御の指定と マニュアル制御時のデューティ比指定、および設定した項目のフラッシュメモリへの 書込み命令等が通信項目となります。通信自体はPCとシリアルですので、 相互通信の仕様を表5-3のように決定しました。表5-3中、[n]は1byteの数字(主に チャンネル番号)[nnn]は3byteの数字で、すべてアスキーコードとなります。 また、各コマンドは終端として'\n\r'(改行・復帰コード)をつけます。

表5-3:PCからコントローラへ送信するコマンドフォーマット
コマンド byte数 説明 コマンド byte数 説明
 e\n\r 3 エコーバックON(端末用)  E\n\r 3 エコーバックOFF(デフォルト)
 x\n\r 3 デバッグ出力開始  X\n\r 3 デバッグ出力停止(デフォルト)
 m\n\r 3 モニタ出力開始  M\n\r 3 モニタ出力停止(デフォルト)
 p\n\r 3 基本パラメータの書き込み  S[n]n\n\r 5 [n]ch ファンON
 S[n]N\n\r 5 [n]ch ファン停止  S[n]t\n\r 5 サーミスタ[n]ON
 S[n]T\n\r 5 サーミスタ[n]OFF  S[n]f\n\r 5 [n]ch 固定Duty指定
 S[n]F\n\r 5 [n]ch 固定Duty解除  S[n]U[nnn]\n\r 8 [n]ch 固定Duty設定
 S[n]A[nnn]\n\r 8 [n]ch サーミスタ係数A設定  S[n]B[nnn]\n\r 8 [n]ch サーミスタ係数B設定
 S[n]C[nnn]\n\r 8 [n]ch サーミスタ係数C 設定  S[n]D[nnn]\n\r 8 [n]ch サーミスタ係数D 設定
 S[n]I[nnn]\n\r 8 [n]ch 最低Duty 設定  S[n]P[n]\n\r 6 [n]ch ファンタイプ設定
 Q[n]D\n\r 5 [n]ch 現在のDuty比要求  Q[n]K\n\r 5 [n]ch サーミスタ係数A〜D要求
 Q[n]F\n\r 5 固定Duty状態要求  Q[n]N\n\r 5 稼働チャンネル要求
 Q[n]T\n\r 5 稼働サーミスタ要求  Q[n]R\n\r 5 ファン回転数要求
 Q[n]I\n\r 5 最低Duty比要求  Q[n]P\n\r 5 ファンタイプ要求

表5-4:コントローラから受信するデータフォーマット
コマンド byte数 説明
 M[n]R[rrrr]T[ttt]D[ddd]\n\r 16 モニタデータフォーマット
  [n]  :対象となるチャンネル
  [rrrr]:現在の回転数(0000〜9999[rpm])
  [ttt] :現時の温度(000〜999[1/4℃])
  [ddd] :現在のデューティ比(000〜100[%])
 U[n]D[ddd]D[xxx]\n\r 12 演算結果によるDuty比[ddd]および実際のDuty比[xxx]
 K[n][aa][bb][cc][dd]\n\r 12 現在のサーミスタ係数[a], [b], [c], [d]
 N[n]C[1|0]\n\r 6 [n]chの稼動ステータス(1=稼動、0=停止)
 T[n]C[1|0]\n\r 6 [n]chのサーミスタ有効ステータス(1=有効、0=無効)
 F[n]C[1|0]D[ddd]\n\r 10 [n]chの固定デューティ比およびステータス (1=固定、0=自動、[ddd]=デューティ比)
 I[n]M[ddd]\n\r 8 [n]chの最小デューティ比([ddd]=最小デューティ比)
 R[n]F[1|0][rrrr]\n\r 10 [n]chの回転数(1=フェイル、0=正常、[rrrr]=回転数)
 P[n][1|0]\n\r 10 [n]chのファンタイプ(1=φ60[mm]ファン、0=φ80[mm]ファン)
 Memory Dump 200 デバッグ用のメモリダンプ表示


5.4 制御ソフトの概要とファイル構成

ページ先頭へ
(1)制御ソフトの概要
 ファンの使用・停止の選択やマニュアル・自動制御選択、デューティ比の係数等 の制御動作に関係する各パラメータは構造体としてひとつにまとめてあります。 また、この構造体はフラッシュメモリへの書込みの都合上、特に必要のないものも 含めて大きさが128Byteになるようにしてあります。
リスト1:保存するシステムパラメータ構造体

/**** フラッシュメモリ保存システムパラメータ ****/
typedef struct {
    /* フラッシュメモリへ保存する必要のあるパラメータ */
    unsigned int        head;           /* 2/002: ヘッダ */
    unsigned char       onch;           /* 1/003: 稼働チャンネルフラグ */
    unsigned char       onth;           /* 1/004: サーミスタ有効フラグ */
    unsigned char       fxch;           /* 1/005: 固定デューティ指定フラグ */
    unsigned char       fantype;        /* 1/006: b00=φ80mm, b01=φ60mm */
    unsigned char       reserveB[2];    /* 2/008: 予約 */
    unsigned char       fxd[4];         /* 4/012: 固定デューティ比 */
    unsigned char       mnd[4];         /* 4/016: 最低デューティ比 */
    unsigned char       ka[4];          /* 4/020: 18サーミスタA 係数 */
    unsigned char       kb[4];          /* 4/024: 22サーミスタB 係数 */
    unsigned char       kc[4];          /* 4/028: 26サーミスタC 係数 */
    unsigned char       kd[4];          /* 4/032: 30サーミスタD 係数 */

    /* 特に必要ないが大きさを128Byteにするため一緒にしたパラメータ */    
    unsigned int        rpm[4];         /* 8/040: FAN回転数 */
    unsigned int        pnm[3][4];      /*24/064: 回転パルス数 */
    int                 thf[4];         /* 8/072: サーミスタ温度 */
    unsigned int        ad[4];          /* 8/080: AD変換データ */
    unsigned char       chd[4];         /* 4/084: chデューティ比(計算値) */
    unsigned char       crd[4];         /* 4/088: 実際のデューティ比 */
    unsigned char       bsd[4];         /* 4/092: サーミスタのBase Duty */
    unsigned char       rpmf;           /* 1/093: 回転センサフェイルフラグ */
    unsigned char       reserveC;       /* 1/094: 予約 */
    unsigned int        pc[4];          /* 8/102: ファン回転パルスカウンタ */

    unsigned char       tf;             /* 1/103: 時間フラグ */
    unsigned char       c100m;          /* 1/104: 100msec生成用 カウンタ */
    unsigned char       c500m;          /* 1/105: 500msec生成用 カウンタ */
    unsigned char       c1000m;         /* 1/106: 1sec 生成用カウンタ */
    unsigned char       duty4;          /* 1/107: TimerV PWM出力用duty比 */
    unsigned char       sending;        /* 1/108: */
    unsigned int        nblk;           /* 2/110: */
    int                 ob_sp;          /* 2/112: */
    int                 ob_ep;          /* 2/114: */
    int                 ib_sp;          /* 2/116: */
    int                 ib_ep;          /* 2/118: */
    unsigned char       md;             /* 1/119: */
    unsigned char	reserveD;	/* 1/120: */
    unsigned char	fill[8];
} sysParam, *sysParamPtr;

 次に、制御ソフトウェアは大きくわけて初期化処理、メインループ、 割り込み処理、メンテナンス処理の4つに分けられます。また、ファン制御は 制御演算による自動温度制御か、マニュアル設定による固定デューティ比出力か を選択でき、さらに各chともサーミスタおよびファンが接続されているかいないかを 選択できます。
初期化処理
初期化処理は主に制御用パラメータ、周辺モジュールの初期化および計測値の 初期値設定等をを行います。
  1. 制御用パラメータの初期化
    温度係数、マニュアルコントロールフラグおよびデューティ比、 最少デューティ比、ファンおよびサーミスタの稼働・停止等の基本的な 設定情報をフラッシュメモリの基本設定値領域から読み込みます。 フラッシュメモリに書込まれていなければデフォルトの値を設定します。
  2. 周辺モジュールの初期化
    使用する周辺モジュールを初期化します。SCI, TimerA, TimerV, TimerW AD変換器, I/Oポート等とともに、シリアル通信で使用するFIFOソフトウェア バッファも初期化します。周辺モジュールの各設定値は表5-5に示します。 ウォッチドッグタイマやIIC等のモジュールは使用しません。 初期設定完了後、シリアル通信の送受信割り込みを許可し、Timer Wの タイマーカウントアップ動作をスタートさせて初期化終了です。
  3. 計測値の初期設定
    回転数、温度、デューティ比等の計測データを初期化します。また、AD変換 値のフィルタリング処理も初期化しておきます。
メインループ
基本的な演算を行うメインループです。25msec、100msec、500msec毎に 決められた処理を実行し、電源が切れるまでくり返し実行されます。
  1. 25msec毎の処理
    シリアル通信入力バッファをチェックし、ホストPCからのコマンドがあれば それを実行します。シリアル端末等への応答性と処理する負荷を考慮し、 25msec毎に実行する形式(ポ−リング)としました。
  2. 100msec毎の処理
    ファン制御処理を行います。実際のファンの制御周期は100msecです。 AD変換結果(サーミスタの電圧)を取り込みフィルタリング、テーブル参照を 行って温度を計算すると共に、ファンのデューティ比を計算します。 ファンのデューティ比はファンタイプの指定(φ80mm以上のファンかφ60mm 以下のファン)によって変換マップを切り替えます。 次に、ファン稼働および自動制御が選択されていれば計算したデューティ比を 設定し、マニュアル制御が指定されていれば固定デューティ比を出力します。 ファン停止が指定されている場合はデューティ比0%を出力します。
    ファン制御演算完了後は出力デューティ比と回転数計算結果を元に 回転センサのフェイル判定を行います。PWM出力がある(デューティ比が最低 デューティ比以上)のに、10秒間連続して回転パルスが入力されなければ 回転センサがついていないか、故障したと判断しフェイルフラッグをたてます。
  3. 500msec毎の処理
    回転数が0rpmもしくは出力デューティ比が0%の時、ファン起動用の高トルク 発生用のタイマを初期化します。ファン起動時(回転開始時)は、このタイマ を使用して約2秒間100%デューティを出力し、確実に回転を開始させます。
     また、500msec毎の処理ではモニター処理を行います。CPUからモニタ実行 コマンドが送られてくると、500msec毎に回転数、温度、デューティ比等の 制御演算結果をPCに送信します。
割り込み処理
割り込み処理は、SCI、TimerA, V, WのH8内臓周辺モジュールの割り込みが あります。外部からの割り込みはありません。
  1. SCI割り込み
    送信データエンプティおよび受信完了割り込みが有効です。いずれも FIFOソフトウェアバッファとSCI関連レジスタの調整を行います。
  2. Timer A割り込み
    TimerAはシステム時間計測用です。25msec, 100msec, 500msec, 1000msecの 時間を示すフラグを設定します。
  3. Timer V割り込み
    ch4 のPWM出力用です。TimerVオーバーフロー時にデューティ比を変更します。
  4. Timer W割り込み 回転パルス計測用です。4つのレジスタをインプットキャプチャとして使用し、 インプットキャプチャ割り込みが発生する度にrpmパルスカウンタを インクリメントします。
メンテナンス処理
主にフラッシュメモリ管理です。システム基本設定値をH8内臓 フラッシュメモリへ書込んだり、起動時に基本設定値を読み出したりします。

表5-5:周辺モジュール設定値
モジュール レジスタ名 設定値 備考
TimerA TMA 0x12 TimerA 割り込み周期=26.2144[msec]
TimerV TCORA 0x00 PWM Level0出力タイミング(基本周期)
TCORB 0xff PWM Level1出力タイミング(デューティ比)
TCRV0 0x11 PWM 基本周期=26.2144[msec]
TCSRV 0x1a 初期Duty0%としてコンペアマッチ停止
TCRV1 0xe3 外部トリガOFF、クロック=φ/128
TimerW TMRW 0x48 通常タイマ動作、カウント停止
TCRW 0x30 FreeRun timer、クロック=φ/8、Output Leve=0
TEIRW 0x7f Overflow割り込み禁止、全ch割り込み許可
TSRW 0x00 ステータスクリア
TIOR0 0xee Ach, Bch 両エッジインプットキャプチャ
TIOR1 0xee Cch, Dch 両エッジインプットキャプチャ
AD変換器 ADCSR 0x53 AN0〜3スキャンモード、割り込み許可、AD変換停止
ADCR 0x7e 外部トリガ禁止
I/Oポート PMR1 0x02 TxD端子使用、他は汎用I/Oポート
PCUR1 0xff 全端子内部プルアップ有効
PCR1 0x3f ポート1全て入力端子
PDR1 0x00 ポート1 データレジスタ初期化(念のため)
PCR2 0x04 ポート2 TxD端子のみ出力指定
PDR2 0xff ポート2 データレジスタ初期化(念のため)
PMR5 0x00 ポート5 汎用I/Oポート指定
PCR5 0xff ポート5 全ポート出力指定(CPLDへのデータ出力用)
PDR5 0x00 ポート5 データレジスタ(出力値)初期化
PCR7 0x70 ポート7 P74 TMOV出力指定
PDR7 0x8f ポート7 データレジスタ初期化
PCR8 0x01 ポート8 P80のみ出力ポート
PDR8 0x00 ポート8 データレジスタ初期化
SCI SCR3 0x00 Length=8bit、Parity=なし、Stopbit=1、clock=φ/1
SMR 0x00 送受信動作許可、ここではまだ割り込み禁止
BRR 10(DEC) ボーレート=57600bps指定(設定後1bit送信時間待つ)
IRQ IENR1 0x50 TimerAの割り込み許可

リスト2:システムパラメータ構造体の初期値

        sysp.head = 0x0001;
        sysp.ka[0] = 64;  sysp.kb[0] =  0;  sysp.kc[0] =  0;  sysp.kd[0] =  0;
        sysp.ka[1] =  0;  sysp.kb[1] = 64;  sysp.kc[1] =  0;  sysp.kd[1] =  0;
        sysp.ka[2] =  0;  sysp.kb[2] =  0;  sysp.kc[2] = 64;  sysp.kd[2] =  0;
        sysp.ka[3] =  0;  sysp.kb[3] =  0;  sysp.kc[3] =  0;  sysp.kd[3] = 64;
        sysp.mnd[0] = 30;
        sysp.mnd[1] = 30;
        sysp.mnd[2] = 30;
        sysp.mnd[3] = 30;
        sysp.fxd[0] = 100;
        sysp.fxd[1] = 100;
        sysp.fxd[2] = 100;
        sysp.fxd[3] = 100;
        sysp.onch = 0x0f;
        sysp.onth = 0x0f;
        sysp.fxch = 0x00;
        sysp.fantype = 0x11;
    

(2)フラッシュメモリの領域設定
 フラッシュメモリはベクタ領域、システムパラメータ保存領域、 フラッシュメモリ書き込みプログラム領域、制御ソフトウェア本体の領域の 4つの領域に分けて使用します。システムパラメータをフラッシュメモリに 書込む時は0x800からの1KByte分をRAMにコピーし、RAM上で実行します。 また、今回3ブロック目(0xc00〜0xfff)の領域は使用しません。

ブロック アドレス サイズ 内容
1 0x0000
|
0x03ff
1KByte  ベクタ領域(0x00〜0x33)
2 0x0400
|
0x07ff
1KByte  システムパラメータ保存領域
3 0x0800
|
0x0bff
1KByte  システムパラメータ書き込みプログラム
4 0x0c00
|
0x0fff
1KByte  未使用領域
5 0x1000
|
0x7fff
32KByte  制御プログラム領域(プログラム本体)
(2)ファイル構成
 ファンコントローラのソフトウェアは以下のようなファイルから構成されます。 サーミスタやファンを他のものに変更し、マップを変更する必要がある場合は deviceディレクトリの下に新しいファイルを準備し、それをmain.cでインクルードして コンパイルしてください。
Cソースファイル
main.c 制御ソフトウェアメイン処理 system.c 内臓周辺モジュール処理
chario.c シリアル通信関連処理 flash.c フラッシュメモリアクセス処理
monitor.c ホストPCへのデータ送信処理    
ヘッダーファイル(include/)
include/h8_3694.h H8/3694レジスタ定義 include/fancnt.h システムパラメータ構造体定義
デバイス定義ファイル(device/)
device/unknown.h 今回使用したサーミスタのマップ device/103at.h 石塚電子のサーミスタ103ATのマップ
アセンブラ
vector.s 割り込みベクタルーチン ramcrt0.s スタートアップルーチン
asm.s アセンブラ関数 progsysp.s フラッシュメモリ書き込みソフト本体
その他
h8rom.x リンカスクリプト Makefile  


5.5 ダウンロード・開発環境

ページ先頭へ
★ソフトウェアの書込み
 プログラムをコンパイルしたらファンコントローラにダウンロードします。 H8/3694Fに対応した書込みソフトを利用して次のような手順で書き込みます。
  1. コンパイル完了後、"fancnt.mot"が生成されていることを確認
  2. ファンコントローラとPCのCOMポート(シリアル通信ポート)を接続 (接続ケーブルは自作)。
  3. DIP-SWのNo.1をON(これで電源投入後ブートモードになります)。
  4. 電源を接続してブートモードで起動。
  5. 書き込みソフトを利用して"fancnt.mot"を書込む。
  6. 電源をはずし、DIP-SWのNo.1をOFF、No.2をON(USB通信に切り替え)
以上で、ソフトウェアのセットアップは完了です。

★USB通信の準備
 今回はUSB通信デバイスとしてフェアチャイルド社のFT232BMを使用するので、 FT232BM用のドライバをインストールします。
     http://www.ftdichip.com/Drivers/FT232-FT245Drivers.htm
から仮想COMポートドライバ(VCPの方)をダウンロードしてインストールします。 インストール手順は以下のようになります。
  1. ドライバをダウンロードして解凍しておく。
  2. USBケーブルをPCとファンコントローラに接続し、ファンコントローラの電源を 入れる。
  3. PC上で"新しいデバイスを発見しました"みたいなメッセージが出て、新しい ドライバインストールのウィザードが現れるので、まずはUSB-Serialドライバを インストールする。
  4. インストール完了後、もう1回ドライバインストールのウィザードが現れるので 仮想COMポートドライバをインストールする。
インストール方法の詳細についてはインターネットのいろんなサイトで公開している ので、そちらを参考にしてください。 D2XXの方は使用しません。

★ソースコード、開発環境他  ソフト開発環境は cygwin 上でgccを使ってコンパイルしました。プログラムの ダウンロード(書き込み)はフリーでもいろいろなソフトが出ているので それらを利用して書込むことができます。
なお、cygwinは開発環境関係を全てインストールしてしまうことをお薦めします。 gccのconfigureがうまく通らない場合があるようです。

☆ファンコントローラ・ソフトウェア
fancnt-v1.0.tgz
☆開発環境
(1) コンパイラ(gcc)
リングサーバー:http://www.ring.gr.jp/pub/GNU/gcc
GNUサーバー:ftp://ftp.gnu.org/pub/gnu/gcc
(2) 書き込みソフト・ツール類他
Best Technology: 開発環境一式: http://www.besttechnology.co.jp/
VectorのH8関連ページ: http://www.vector.co.jp/vpack/filearea/other/h8/
YahooのH8関連ページ: http://computers.yahoo.co.jp/download/vector/other/h8/
@niftyのH8関連ページ: http://www.nifty.com/download/other/h8/
gooのH8関連ページ: http://download.goo.ne.jp/software/category/other/h8/

5.6 組み込みと動作確認

ページ先頭へ
★動作確認
 ハードもソフトもできたところで以下の手順で動作確認します。
  1. ファンコントローラにサーミスタ、ファンを接続し、USBでPCと接続します。
  2. ファンコントローラに電源を入れます(PCの電源ケーブルを接続)。
  3. TeraTerm等の端末ソフトを立ち上げ、USBの仮想COMポートを接続します。 USBの仮想COMポートはファンコントローラの電源が入っていないと接続 できないので、ファンコントローラ起動後に端末ソフトを立ち上げます。
  4. [m][Enter]と入力すると図5-1のようなモニタデータが出力されます。 M0R.... はch0のデータ、M1R..... はch1のデータを示します。このデータが 0.5秒毎に4ch分出力されていればOKです。
  5. サーミスタをドライヤ等で暖めると、指定した温度以上(ソフトウェアを 変更していなければ35℃以上)でファンが回りはじめます。
  6. 温度や接続を変えていろいろ試してみます。
温度に合わせてファンの回転数が変化すればOKです。また、端末上には 温度、デューティ比、回転数等のデータが表示されます。

★組み込み
 できあがったボードはPCIスロットに装着します。PCIスロットが一杯の 場合は、スペーサを使って別途ケース内の適当な場所に固定します。図5-2は オリジナルウッドケースに装着した例です。 オリジナルウッドケースはディスプレイを横にずらせば正面からPCIボードの 取り外しや装着ができる構造になっているため、今回も非常に簡単に ファンコントローラの装着ができました。通常のPCケースでは重たいケースを 引き出して、横からカバーをはずして、無理な体勢でやらなければならないところ でした。図5-2中、本ファンコントローラの上は モデムボード、下はTVチューナーボードです。
 PCIスロットに装着した後は、サーミスタおよびファンの接続です。 サーミスタは、図5-3のように、ケース上部(4)、ドライブベイよりの吸気部分(3)、 マザーボードのメインメモリ近く(2)、CPU近く(1)の4ヶ所に配置しました。 これに対し、ファンは、CPU近くの排気ファン(1)、正面パネルにつけてある PCIスロットへの吸気ファン(3)、ドライブベイにある吸気ファン(4)の3つです。 動作はデフォルトのままですので、サーミスタ(1)に対してファン(1)が対応して いおり、サーミスタ(2)に対応するファンはつけていません。

 動作状態を見る限りはまったく問題ないようすで、吸気・排気ファンとも うまくデューティ制御されています。肝心の騒音の方は激減し、常時回転している 電源ファン以外の音はほとんど消えました。ファンコントローラが見事にファンの 騒音を消しました。


6.モニターソフト

6.1 基本機能・開発環境

ページ先頭へ
 モニターソフトは温度、出力デューティ比、回転数等の表示と、 ファンコントローラの基本的なパラメータの設定を行うソフトウェアです。 通常のモニタウィンドウと設定を行うセットアップウィンドウから構成されます。
 開発環境として、言語はpython、ウィンドウ環境はwxPythonを使用しました。 pythonとwxPythonの組み合わせは、LinuxでもMacでもWindowsでも動作するGUI ソフトウェアを手早くまた見た目もよく作るには最適な物だと思います。 できあがったウィンドウも非常に見栄えがいいです。
 できれば、python, wxPython, pyserialをPCにインストールするのがいいと 思いますが、今回はpy2exeを使ってpythonがなくても単独で実行できるものも つくりました。各言語やライブラリ、実行ファイル、ソースコードのダウンロードは 7.ダウンロードその他にリンクを載せておきますので、 そちらからダウンロードしてください
モニターソフトウェア基本機能
  1. 温度、回転数、出力デューティ比、ファン稼働状態のモニタを行う。
  2. ファンコントローラの以下の項目を設定する。
    • ファン稼働状態設定(自動制御、固定デューティ出力、OFF)
    • ファンタイプ(φ80mm/φ60mm)の設定
    • 固定デューティ出力の場合の出力デューティ比
    • 自動制御する時の最低デューティ比
    • 自動制御の場合の各計測温度の係数
    • 上記項目のファンコントローラへの送信およびフラッシュメモリへの書込み
    • ファンコントローラとの通信ポートの選択(COM1〜COM8)
開発環境(開発言語)
  1. 言語:python Version 2.4.2 (Windows上で作成)
  2. ウィンドウ環境(Widget):wxPython-h2.6-win32-unicode-2.6.1.0-py24
  3. シリアル通信(Windowsのみ):pyserial-2.2
  4. Windows実行ファイル生成:py2exe-0.6.3win32-py2.4

6.2 ファイル構造

ページ先頭へ
 モニターソフトは、wxPythonとpyserialのライブラリを中心に構成されています。 通常、Windows上で python を実行すると、コマンドプロンプトが表示されてい しまいます。pythonに付属しているpythonw.exeを使えば、コマンドプロンプトは 表示されません。python の pyファイルだけでコマンドプロンプトを表示させない 方法もあると思いますが、よくわからなかったのでそのままです。従って、 py2exeを使用して生成した実行ファイル fanmonitor.exe はpythonがなくても 単独で実行できますが、コマンドプロンプトが表示されてしまいます。
 各ファイルと内容は以下のようになっています。
FanMonitor.py
モニタソフトのトップレベルオブジェクトです。モニタソフトの一番上のフレーム の記述がされています。
comData.py
ファンコントローラとの通信および各データを保持するオブジェクトを 記述してあるファイルです。ファンコントローラから取得した設定値情報は このファイル内のオブジェクトが保持しています。
fanwin.py
モニタウィンドウの実体が記述してあるファイルです。
setupwin.py
セットアップウィンドウ(ダイアログウィンドウ)の実体が記述してある ファイルです。

FanMonitor.exe
pythonw.exeへのリンクで、引数としてFanMonitor.pyを指定してあります。
setup.py
py2exeを実行する時に使用するファイルで特にモニターソフトを使用する上では 特に必要はありません。

fanmonitor.ini
COMポートの情報を保持しているファイルです。セットアップウィンドウで選択した COMポート番号が入っています。

6.3 インストールと使い方

ページ先頭へ
 まずはインストール手順について説明します。 「7.ダウンロードその他」から必要なファイルを ダウンロードします。python、wxPython、pyserial に関してはインターネットで 多くの情報を入手できると思いますので、それらの情報をもとにインストールして ください。一般的なインストールで問題ありません。
★python版のインストール
pythonがインストールしてある環境では、 fanmonitor-py.lzhをダウンロードして 一式を適当な場所に解凍してください。pythonがデフォルトの "C:\Python24"フォルダにインストールしてある場合は以下の作業をします。
  1. FanMonitor.exeを右クリックしプロパティを選択
  2. ショートカットタブの作業フォルダの内容を、解凍したフォルダに 修正します。
これでインストールは完了です。使い方にもよりますが、FanMonitor.exeの ショートカットを使いやすいところにコピーしてもかまいません。 pythonがデフォルトの"C:\Python24"フォルダにインストール されていない場合は、次のような手順でFanMonitor.exeを実行できるように してください。
  1. FanMonitor.exeを右クリックし、プロパティを選択
  2. ショートカットタブのリンク先の欄の内容に、pythonw.exeがありますので、 これを正しい場所に修正します。
  3. 作業フォルダの欄の内容を解凍したフォルダに修正します。
これでFanMonitor.exeをダブルクリックすればコマンドプロンプトは 表示されずにマルチファンコントローラのモニターソフトのみが起動します。 FanMonitor.pyをダブルクリックすると、コマンドプロンプトが表示されます。

★バイナリ版のインストール
pythonがインストールされていない環境では、 fanmonitor-bin.lzhをダウンロードして 一式を適当な場所に解凍してください。解凍した場所にFanMonitor.exeがあるので、 これをダブルクリックして実行すればモニターソフトが起動します。 こちらのバイナリ版はコマンドプロンプトが表示されます。

 以上でインストールは完了です。 モニターソフトを起動すると、図6-1のようなウィンドウが立ち上がります。



図6-1:モニターソフトの起動画面
★使い方
 モニターソフトを起すると、図6-1のようなウィンドウが立ち上がります。 図6-1では温度やデューティ比等が表示されていますが、初期設定のCOMポートが あっていない場合はまともに表示されません。最初に使う時は以下の手順で COMポートの設定を行ってください。
  1.ファンコントローラにPCの電源を接続して、PCを起動する。
  2.USBを接続する。
  3.起動画面の「setup」ボタンをクリックし、図6-2のような セットアップウィンドウを表示する。
  4.右上のPort:の欄で正しいCOMポートを選択する。
  5.セットアップウィンドウ下部の左から2番目「PortSave」ボタンをクリック
  6.セットアップウィンドウ下部の左の「close」ボタンをクリックし、 セットアップウィンドウを閉じる。
  7.起動画面の「Exit」ボタンをクリックしてモニターソフトを終了し、 再度モニターソフトを立ち上げる。
これでモニターソフトが正しく動作します。デフォルトのまま動作させる場合は これで完了です。設定を変更する場合は以下の手順で行います。
  1.セットアップウィンドウで各種設定値を変更する。
  2.セットアップウィンドウの「Apply」ボタンをクリックし、 ファンコントローラに設定値を送信し、試してみる。
  3.設定値がOKであれば、「Save to Board」ボタンをクリックし、 ファンコントローラのフラッシュメモリに書き込む。
  4.セットアップウィンドウの「close」ボタンをクリックし、ウィンドウを 閉じる。
これで新しい設定値で動作を開始し、電源が切れても新しい設定値は有効です。 自分のPCに適合した設定値にしてください。
 モニターソフトは自動制御ですので、普段モニターソフトを起動しておく 必要はありません。何もしなくても放っておけば指定された設定値で動作します。
 なお、ファン回転数[rpm]の値は接続するファンによって正しく表示できたり できなかったりします。ファンの電源そのものをPWM駆動しているため、 低デューティ比では回転センサがまともに動作しない場合があります。回転数は 参考に表示しているだけで自動制御とは関係ないので、まともに表示されなくても 問題ありません。



図6-2:モニターソフトのセットアップ画面

 素晴らしいファンコントローラができました。一つで4chの温度計測を 行い、複合した形で4つのファンを自動制御します。通常ではOSとは全く 関係なく、温度によりファンを自動制御し、必要であればUSBで接続して各種 設定値を変更できます。こんな高機能なファンコントローラはちょっと 見たことないでしょう。。。
PCに標準装備したくなりました。。。

7.ダウンロードその他

ページ先頭へ
各種ダウンロード、リンク情報をまとめておきました。

●モニターソフトウェア
fanmonitor-py.lzh (python版)
fanmonitor-bin.lzh (バイナリ版)
●ファンコントローラ・ソフトウェア
fancnt-v1.0.tgz
●CPLDロジック
pwmout.v(CPLD内部ロジック)
pwmout.ucf (CPLD ucf ファイル:CPLDのピンアサイン定義)
pwmout.jed (CPLD jedファイル:配置配線データ)
●開発環境:Python
日本Pythonユーザ会(python ダウンロード可)
●開発環境:wxPython
wxPython ホームページ(wxPythonダウンロード可)
●開発環境:pyserial
pySerial ホームページ(pySeiralダウンロード可)
●開発環境:py2exe
py2exe ホームページ(py2exe ダウンロード可)
●開発環境:gcc
リングサーバー:http://www.ring.gr.jp/pub/GNU/gcc
GNUサーバー:ftp://ftp.gnu.org/pub/gnu/gcc
●開発環境:書き込みソフト・ツール類他
Best Technology: 開発環境一式: http://www.besttechnology.co.jp/
VectorのH8関連ページ: http://www.vector.co.jp/vpack/filearea/other/h8/
YahooのH8関連ページ: http://computers.yahoo.co.jp/download/vector/other/h8/
@niftyのH8関連ページ: http://www.nifty.com/download/other/h8/
gooのH8関連ページ: http://download.goo.ne.jp/software/category/other/h8/



これで高機能な自動温度制御マルチファンコントローラは全て完了です。 安心してとっても静かなPCを快適に使ってください。