楽々PIC

水田除草と言うブログを書いていますが、PIC関連の記事が意外に人気で驚いています。 PICを使った電子工作に興味を持つ方が多いことを知って、一緒にPICを学ぶブログを作りたいと思いました。 「楽々PIC」は教材と言うよりも少し実用性?のある楽しい道具を作りながら学ぶブログを目指します。

ディジタル温度センサー4

ディジタル温度センサー3」で紹介した割り込み処理からフックで実行されるプログラムの内、DS18B20+ にコマンドを送信(書き込み)する部分と、温度データを読み出している部分のアセンブラソースを紹介します。 クロック周波数8MHzでの実施例です。 実行サイクル数やNOPコマンドで時間調整している為、クロック周波数が異なる場合には調整が必要です。

下図がコマンドを送信(書き込み)する部分です。

write2

先の書き込みスロットを終了する為に 1.5usec 間 1-Wire-バスを解放した後で、書き込みスロットの先頭で 1.5usec 間バスに Low を出力します。 その後送信データに従ってバスに High または Low を出力して割り込み処理を抜けます。 最初の 1.5usec は次の割り込みまでのタイマー設定を行う間に確保されます。 2つ目の 1.5usec は送信データのシフトとNOP命令で確保しています。

下図は、温度データを読み出している部分のアセンブラソースです。

read2

先のスロットを終了させる為に 1.5usec 間 1-Wire バスを解放した後で、1.5usec 間バスに Low を出力し、さらに 9.5usec 経過した時点でバスを読み出して割り込み処理を抜けます。 クロック周波数が8MHzでは10usec程度の待ち時間は割り込みを抜けずにNOPで処理する方が安定するし、他の(低位)割り込み処理にも不具合は予想されないと思います。

関連記事のインデックスは右記事の末尾にあります。 → ディジタル温度センサー


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。





ディジタル温度センサー3

DS18B20+ で温度測定をする為に「ディジタル温度センサー2」で紹介したように1秒間を超える手続き(ポート入出力)が必要です。 この間も温度制御や赤外線リモコン受信を並行して進める為に、可能な限り割り込み処理で必要な手続きを進める必要があります。

1-Wire バス・プロトコルは少々面倒な部分がありますが、今回の目的を実現する分には予め決まっているタイミングで以下4種類の処理を組み合わせて淡々と進めるだけで、複雑な分岐処理はありません。

1. ポートに Low を出力
2. ポートに High を出力
3. ポートを入力ポートに設定
4. ポートの値をサンプリング

RRP1320-1-04-2 の温度センサーを DS18B20 に置き換える為、他の処理(例: 赤外線リモコン受信)よりもシビアなタイミング管理が必要な 1-Wire バス・プロトコル用に、高位割り込みに設定した TIMER3 割り込みを使うことにしました。
DS18B20 は RB0 に接続し、RB0 について先の4種類の処理を行います。 クロックは内臓 8MHz のままです。

タイミングがシビアなので、割り込み発生の都度分岐するのではなくて、割り込み直後に前述4種類の内(予め決められた)いずれか一つの処理を行い、次のタイミング(割り込み)に備えて TIMER3 を設定し、次回割り込み時に実行するプログラムを指定(予約)することにしました。

TIMER3 割り込みの都度指定されたプログラムを実行する為に、フック( HOOK )を使っています。 データ・メモリーとプログラム・メモリーが分かれている PIC の場合はフックと呼べないかも知れませんが、TIMER3 割り込み処理の先頭で所定のデータ・メモリー( 3byte )を参照して指定(予約)されたアドレスにジャンプします。

下図は、TIMER3 割り込みを処理する高位割り込みプログラムのアセンブラ・ソースです。

inthigh-0

割り込みフラグをクリアして直ぐに、データ・メモリーに指定(予約)されたアドレスにジャンプしています。(10~13行目)

下図はジャンプ先の一例で、リセットパルスの後でデバイスの存在パルスをサンプリングするプログラムです。 ディジタル温度センサー2 に示したタイミング図の内、リセット・パルスの丸囲みSに相当するタイミングで実行されます。

inthigh-2

44行目でサンプリングを行い、結果を dsstf < 1 > に反映させるとすぐに次の割り込みタイミングを規定する為に(予め準備された) TIMER3 を設定しています。(46,47行目)

続いて、次の割り込み時に次々回の割り込みタイミングを規定する TIMER3 の設定値を準備し、次回割り込み時のフックアドレスを指定(予約)します。 続く書き込み(送信)処理に必要なワークの準備を済ませて、最初の図の15行目にジャンプしています。
67行目に RETFIE  FAST と書いても良いのですが、フックを使うと解り難いソースになる為、少しでも読みやすくする工夫のつもりです。

関連記事のインデックスは右記事の末尾にあります。 → ディジタル温度センサー


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。




ディジタル温度センサー2

ディジタル温度センサー DS18B20+ を一つだけ接続して温度変換をさせ、値を読み出す際に使ったポート制御の定数は下図の通りです。 図をクリックして別ウィンドウで見れば数値も読み取れると思います。

DS18B20実績

太い実線はポートを出力に設定してPICから出力しているタイミングです。 細い実線はプルアップ抵抗( 4.7k )によるもので、2点鎖線はオープン・ドレインの DS18B20 の出力( Low = 0 )タイミングです。 DS18B20 の 1-Wire バス・プロトコルの詳細は多くのWebページで紹介されていますから、ここでは実績値だけを紹介します。

DS18B20 を一つだけ接続し、パラサイト・パワーと言う方式で給電しています。

DS18B20 に温度変換を行わせる為に以下の手順が必要です。

1. 初期化 → SKIP ROM → CONVERT T → 1-Wireバス給電

上図のリセットパルスに始まる初期化に続いて、SKIP ROM ( CCh ) 8bit に続いて CONVERT T ( 44h ) 8bit を書き込み(送信)します。 8bit のデーターは最下位 bit を先頭に8個の書き込みスロットを続けて送信します。 合計16個の書き込みスロットの直後から800msecの間ポート出力を High に保ち、DS18B20 に給電し続けます。
ディジタル温度センサーに紹介した最初のオシロ波形を参照して下さい。


1-Wire バス給電期間の終了を待って、温度変換結果を読み出します。

2. 初期化 → SKIP ROM → READ SCRATCHPAD → 12bitだけ読み込み

上図リセットパルスに始まる初期化に続き、先ほどと同様に SKIP ROM ( CCh ) 8bit , READ SCRATCHPAD ( BEh ) 8bit を書き込み(送信)し、続いて上図の読み込みスロットを12回繰り返します。 読み込みスロットの所定のタイミングでサンプリングした値は読み出し順に以下の通りです。 温度データの単位は℃です。
(0) 温度データの 2^-4 bit
(1) 温度データの 2^-3 bit
(2) 温度データの 2^-2 bit
(3) 温度データの 2^-1 bit
(4) 温度データの 2^ 0 bit
(5) 温度データの 2^ 1 bit
(6) 温度データの 2^ 2 bit
(7) 温度データの 2^ 3 bit
(8) 温度データの 2^ 4 bit
(9) 温度データの 2^ 5 bit
(10) 温度データの 2^ 6 bit
(11) 温度データの+/- 値1の時氷点下

今回は(0)~(2)を読み飛ばし、(3)~(10)を使って小数点以下の値を四捨五入、氷点下の場合は全て0℃、99℃より高温は全て99℃にクリップして使います。 また、CRC による誤り検出を行いません。


関連記事のインデックスは右記事の末尾にあります。 → ディジタル温度センサー 


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



ディジタル温度センサー

RRP1320-1-04 温度誤差」に書いたように、A/D変換の基準電圧による測定誤差が大きい為、ディジタル温度センサーを試してみました。 センサーは Maxim の1wireデジタル温度センサー DS18B20+ で、-55~+125℃まで測定可能で、-10~+85℃は±0.5℃の精度と言うことです。 電源電圧は3.0~5.5Vで、1-Wire(GNDを加えて2本)だけで電源供給と双方向ディジタル通信が可能です。 基準電圧のような厄介なものは DS18B20 内部で解決し、ディジタル信号で高精度の測定結果を得られるのが魅力です。

1-Wire バス・プロトコルは初挑戦でしたが、ただ一つの DS18B20 とPICとの間で相互通信を行い、温度測定が出来るようになりました。 PIC18F1320 のポート( RB0 )を 4.7k プルアップして DS18B20 の DQ 端子に接続し、DS18B20 の VDD , GND の両端子を GND に接続するサテライト・パワーを使っています。

1-wire回路

DS18B20 を一つだけ接続し、「燻煙器」のような用途を想定している為、以下2通りの通信だけで実現しています。
1. 初期化 → SKIP ROM → CONVERT T → 1-Wireバス給電
DSC00245

2. 初期化 → SKIP ROM → READ SCRATCHPAD → 12bitだけ読み込み
DSC00246

今後、何回かに分けて詳細を紹介したいと思います。


以下は関連記事のインデックスです。


ディジタル温度センサー2 
 DS18B20+ を一つだけ接続して温度変換をさせ、値を読み出す際に使ったポート制御の定数は下図の通りです。

ディジタル温度センサー3 
 TIMER3 割り込みの都度指定されたプログラムを実行する為に、フック( HOOK )を使っています。 データ・メモリーとプログラム・メモリーが分かれている PIC の場合はフックと呼べないかも知れませんが、TIMER3 割り込み処理の先頭で所定のデータ・メモリー( 3byte )を参照して指定(予約)されたアドレスにジャンプします。

ディジタル温度センサー4 
 割り込み処理からフックで実行されるプログラムの内、DS18B20+ にコマンドを送信(書き込み)する部分と、温度データを読み出している部分のアセンブラソースを紹介します。 クロック周波数8MHzでの実施例です。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。




燻煙器 補助ヒーター

燻煙器用の補助ヒーターを組み立てて、温度上昇試験を行いました。 15Ωのセメント抵抗を、2直4並列に接続したもの2回路を DC12V で使い、合計で 38.4W のヒーターです。 試作した燻煙器の内部温度を、周囲温度 +25.6 まで高めて飽和しました。 燻煙器の温度抵抗は 0.67℃/W と前回の 0.69 より小さな値になりました。 燻煙器を構成する杉板に反りや縮みが見られますから、燻煙器の温度抵抗が変化していると思われます。 杉板の他に、もっと安定した材料を検討する必要がありそうです。 同時に自己責任で使う分はともかく、他の誰かが使う場面を考えれば、万一に備えて内壁だけでも防火対策が必要そうです。

DSC00244

上図のヒーターですが、前回DC5Vでの実験時に室温で通電し、セメント抵抗の表面温度が火傷しない程度になるように抵抗値を選んでいます。だつもりでしたが、今回の2本直列1本当たりDC6Vで測定すると周囲温度+70℃位になっています。 表面温度が高すぎる場合は放熱板を付けたり、間欠通電、あるいは抵抗値を選び直す必要がありそうです。 また、現状ではセメント抵抗の数が多くて手間がかかります。

もう少し工夫して数を減らす必要がありますが、クーラーボックスの内部温度を制御してイースト発酵に使うような場合には安価で手軽な方法だと思います。

燻煙器の試作実験は、スモークウッドの発熱だけで制御目標温度を超えた場合の放熱機構の評価に移る予定です。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



ダウンロードコーナー
記事検索
アンケートに御協力下さい


アーカイブ
楽々PIC 宛てBlogMail


--- ご了承下さい ---

注意して記事を書いていますが、記事及びリンク先の情報による不利益について、一切責任を負い(負え)ません。
QRコード
QRコード
アクセスカウンター

    Atsuhiro Imai

    バナーを作成


    livedoor プロフィール
    • ライブドアブログ