画像をクリックすると拡大表示されます。
拡大画像からはブラウザの「←戻る」ボタンで戻ってください。
「PIC18Fを使う」は私が初めてPIC18Fを使うにあたって勉強したことを纏めた記録です。
慣れるためには、何か、使えるものを作ってみるのが1番です。
とりあえず、「換気扇コントローラ」を作ってみようと思い、それに沿った内容であった訳です。
コントローラは、その後、すぐ出来たのですが、回路図とソースファイルの清書が面倒で、UPが遅れてしまいました。
換気扇コントローラは、温室内で2年ほど使用していますが、問題なく動作しています。
大分遅れましたが、ドキュメントを整理しましたのでUPします。
尚、園芸のページの方では概略だけを紹介済みです。
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。
回路は今まで説明した通りですが、電源回路と出力回路が追加されています。
制御回路の電源はトランスレス、出力のオンオフにはトライアックを使っています。
サーミスタの抵抗値から温度を求める為にエクセルの関数を使用して、直線近似の傾きと切片を求めています。
このとき、電源電圧5Vで計算していますので、LM317Lで電源電圧を5Vに合わせています。
今まで同様、C18の評価版を使用しています。
ただし、今までVer3.11でしたが、今回Ver3.31を使用しました。
温室で2年間動作したのはVer3.11ですが、今回、結果に出ないような微細なバグを修正したり、清書したりしたので、
Ver3.31でコンパイルし直しました。
修正後の動作は確認してあります。
プロジェクト
使用メモリ
Ver3.11とVer3.31に大きな違いはありませんが、リンクスクリプトファイルに互換性が無く、置き場所(パス)も変わって
いるので、一旦、プロジェクトからリンクスクリプトファイルを削除して、新しいファイルを追加します。
ファームウエアのダウンロード (ZIP圧縮されています。)
温度値により、出力をオンオフするだけですから、ソフトは簡単です。
ただし、設定値編集中も、EEPROMに書き込み中も、バックグラウンドで出力制御を行っているので、
構造が、やや複雑です。
設定値の入力と出力制御のどちらかを選択するような構造にすればば、非常に簡単になり、今回は、そちらの方法でも問題
ありません。
ただし、装置によってはパラメータ入力中も止められない場合もあり、今回は、こちらを想定してみました。
adconv.c
A/D変換部分です。
C18の組み込み関数は使っていません。
CCP割り込みで起動されます。
CCPはソフトウエアタイマーの基準時間にもなっているので、1mS周期で起動されます。
cnf1320.c
PIC18F1320のコンフィギュレーションが書かれています。
delay.c
ディレールーチンです。
動作中は他の作業が出来ません。
eeprom.c
PIC内蔵のデータEEPROMの読み出し関数、書き込み関数です。
書き込み完了には5mS程度を必要とし、CCSCの組み込み関数等では書き込み完了まで待ちますが、
このプログラムでは待たずに他の処理に飛ばします。
従って、ロック関数を独立させ、後でロックします。
input.c
4個の押しボタンのチャッタ取りを行います。
方法はタイマー0の割り込みルーチン内で入力時間をカウントします。
レベル入力、長押し、ONパルス、OFFパルスの4種類の入力が取り出せます。
パルス入力はメインルーチン1回分だけ有効です。
interrupt.c
タイマー0、CCP、2種類の割り込み処理が書かれています。
lcdlib4l.c
液晶表示器に関するサブルーチンです。
クロックスピードが上がると初期化出来ない(かもしれない)バグがあったので修正しました。
ポートの下位4ビットに接続します。
ポートや制御信号のアサインはglobal.hの中で宣言しています。
main.c
メインルーチンです。
num_set.c
設定値を入力するためのルーチンです。
output.c
通常動作中の出力制御と温度表示を行います。
timer.c
16ビットのソフトウエアタイマーで1mSのCCP割り込みルーチンでカウントアップされます。
使用するタイマーの最大数は予め宣言しておきます。(余っても良い。)
宣言した数×4バイトのメモリを消費します。
メモリに余裕があれば、何個でも実装出来ます。
delayと違って、起動後、他の処理を実行出来ます。
タイムアップはポーリングでチェックします。
global.h
複数のソースファイルから呼ばれる変数、関数、型は、ここで宣言しておきます。
実装は各ソースファイルに振り分けてありますが、global.cを作って、ここに纏めても良いと思います。
18f1320_g.lkr
リンカーに指示を出すチップ毎のファイルで、システムに用意されているものを拾ってきます。
コンパイラのバージョンにより、名称や内容が微妙に変化するようです。
装置外観 | 装置内部 |
装置は温室内で換気扇の温度制御に使用します。
自動灌水装置で水が掛かりますので、防滴構造にしなければなりません。
せっかくの防水ケースですが、液晶表示器の表示窓を切り欠いてしまいました。
上から透明アクリル板を貼り、シールしています。
AC100Vで24時間動作させる装置ですので、単に動作するだけではいけません。
安全性、耐久性、耐候性、操作性が良く無ければいけません。
通常画面
電源を投入で赤のパイロットランプが点灯し、短時間、起動メッセージを表示します。(あまり意味無し)
その後、通常画面に移って、測定温度値とEEPROMから読み出した温度設定値を表示します。
温度とサーミスタの抵抗値との関係は−5℃〜+45℃の間でリニアライズしましたので、この範囲外では
測定温度の精度が極端に落ちます。
私の温室内では、この範囲外になることは、まず、ありません。
万が一、範囲外になったとしても、設定範囲外ですので、動作に影響は与えません。
通常画面
温度設定値の入力
パネルのMODE釦を長押しすると設定値入力画面になります。
設定値以上の温度で出力はオフになります。
温度設定値入力画面
ここでDOWN、又はUP釦を押すと数値が増減します。
長押しすると増速します。
入力範囲は10℃〜40℃で分解能は1℃です。
初期値は25℃で、万が一、電源投入時に正常範囲内の設定値が読み出せなかった時は、この値に書き直されます。
数値を変更しても書き込まなければ結果は反映されません。
ENT釦を長押しすれば、設定値がEEPROMに書き込まれ、通常画面に戻ります。
設定中もバックグラウンドで出力制御は行われています。(変更前の設定値で)
設定値入力を中止するには再びMODE釦を押します。
以前のままの設定値で通常画面に戻ります。
ヒステリシスの入力
オンする温度とオフする温度が同じではハンチングを起こします。
この為、オンする温度とオフする温度に差(ヒステリシス)を付けます。
パネルのENT釦を長押しすると設定値入力画面になります。
ヒステリシス設定画面
入力範囲は0.1℃〜5℃で分解能は0.1℃、初期値は1℃です。
入力方法は温度設定値の場合と同じです。
温度設定値が25℃、ヒステリシスが1℃の場合、25℃でオンし、24℃未満でオフします。
これと同じ物を個人で製作するのは自由ですが、感電や事故等のトラブルには一切、責任を持ちません。
電源がトランスレスですので、デバッグには多少、危険を伴います。
最初、電源と制御回路を切り離し、別々に動作を確認し、確認後ケースに組み込みます。
制御回路のデバッグは、別に用意した定電圧、定電流電源で行います。
しっかりしたケース、保護ヒューズは鉄則です。
電圧をドロップさせるコンデンサーの種類、耐圧にも注意します。
今回、使用したのは2.2uF、AC250V耐圧のメタライズドフィルムコンデンサーで、秋月のトランスレスチャージャーに
付属していたものを流用しました。
ケースに組み込んだ時、蓋の部分の部品が本体部分の部品と接触しないように注意します。
AC100Vの充電部とDC回路の充電部と接触すると悲惨な結果になります。
通常の家庭用の換気扇は紐を引っ張らないと電源が入らないため使えません。
紐を引くことにより、電源が入ると同時にシャッターを開けているのです。
自動制御するには、紐の無い「電動シャッター付き」の換気扇を使う必要があります。
外観や取り付け寸法は同じで、紐が無いだけです。