目次PIC回路集室温調節装置


室温調節装置 トラブルシューティング

装置製作の過程でいくつかのトラブルが発生しました。参考に掲載します。

タイマー割り込み動作が途中で止まってしまう

原因割り込み処理でメモリのバンクを設定しなかったため。
対処割り込み処理の初めでバンクを0に設定するようにした。

今回処理ではLEDの表示、SWの読み込みをベースレベル(割り込みでない処理)で行い、温度センサーの読み取りをタイマー0の割り込み、外部回路の制御をタイマー1の割り込みで処理しています。ベースレベルの処理のなかで、LEDの制御はPORTBを出力モード、SW読み取りの場合には入力モードで行います。このモードはSFRのバンク1にあるTRISBレジスタの設定を変更して行います。割り込み処理ではベース処理を途中で中断して実行するため、WレジスタおよびSTATUSレジスタを待避しています。そして割り込み処理が終了した時点でそれらのレジスタを割り込み前と同じ内容に戻します。
今回の現象はベースレベルでバンクを1に変えてTRISBレジスタを書き換えている途中で割り込みが発生した場合に起きます。バンクが1に切り替わったままでなので、割り込み処理ではメモリの操作が正常に行えなかったのが原因でした。
他の対処方法としてはベースレベルの処理で割り込まれたくない処理の前でINTCONレジスタのGIEビットを0にして割り込みを禁止し、処理終了時にGIEを1にして割り込み禁止解除をする方法もあります。同じメモリをベース処理でも割り込み処理でも操作する場合には、このような割り込み禁止処理が有効です。

tempcont.asm
397
398
399
400
401
402
403
404
405
406
407
408
;********************************************************
;                 Interruption Process
;********************************************************
int
        movwf   w_save          ;Save W register
        movfw   status          ;Read STATUS reg
        movwf   s_save          ;Save STATUS reg
        bcf     status,rp0      ;Change to Bank0
        btfsc   intcon,t0if     ;Check TMR0
        goto    temp_detect     ;TMR0 time-out
        btfsc   pir1,tmr1if     ;Check TMR1IF
        goto    out_control     ;TMR1 time-out

温度表示が安定しない

原因温度センサーが発振したため。
対処センサーの出力にコンデンサを並列接続した。

今回の装置では室内温度と屋外温度を計測するために2つの温度センサーを使用しています。現象はそのうちの1つで起きました。温度表示がバラバラに変化して安定しません。室内、屋外のセンサーを変えると現象も移ります。要は片方のセンサーのみで起きた現象です。センサーの不良かと思い、センサーを交換してみましたが変わりません。オシロでセンサーの出力を見ると発振していることが分かりました。どうもケーブルの長さが影響しているようです。ケーブルを変える方法も考えましたが、センサーの出力にコンデンサを入れて発振を停止することにしました。
0.1μFのコンデンサを入れることにより発振は止まりました。発振していたときのように大きくは変化しませんが、温度表示は数℃の範囲で変化しています。これは2つのセンサーとも同じでした。最初はそんなものかなと思っていたのですが、コンデンサの容量を2.2μFにしたところ温度表示の微少変化は無くなりました。ただ、本来の温度表示をしてくれないと困るのですが、全く問題はありませんでした。センサー出力回路にはコンデンサを並列に接続しただけで、放電用の抵抗器は付けていません。温度変化は急激でないため、センサーおよびオペアンプの入力端子から放電されているようです。

温度条件以外でも外部駆動回路が動作してしまう

原因BCDスイッチの読み取りが不安定。
対処3回連続して同じ値だけを使用するようにした。

外部回路を駆動する条件は次のような条件です。室温が高い場合の動作モード(UPモード)で説明します。室温がプリセット温度より高く、かつ屋外温度より高い場合に外部回路を動作させます。屋外温度が室内より高い場合にはファンを動作させても意味がないからです。基本的にはこの条件で動作しています。でも、室温がプリセット温度より低い場合でも外部回路が動作する現象が発生しました。ソフトウェアを検証しても悪いところは見つかりません。
そこで、室温とプリセット温度を比較する処理に罠を仕掛けました。室温よりプリセット温度の方が低いと検出したら制御回路2を動作させるようにしました。環境はプリセット温度の方を高く設定しているので、正常な場合には制御回路2が動作することはありません。でも、数分経つと回路2が動作します。この時間は一定ではありません。数分の場合もあれば、数十分の場合もあります。
次にプリセットのBCDスイッチの読み取り処理を調べました。ソフトウェアとしては異常は見あたりません。そこで、読み取った値を待避し、次回の読み取り値と比べる処理を行ったところ、読み取り誤りをするケースがあることが分かりました。原因は定かではありません。最初はスイッチの指定制御が短いためかと思いました。それまではスイッチを指定してから100μ秒後に読み取りを行っていました。これを200μ秒にしてみたのですが、変化はありません。根本原因を調べようとも思ったのですが、毎回起きる現象ではないので究明は難しそうです。そこで、3回続けて同じ値が読み取れれば間違いないと判断し、その処理を追加しました。3回読むのにかかる時間は約25ミリ秒です。一方、温度比較処理は2秒周期です。3回読んでも問題はありません。もし、読み取りが失敗しても、その前に読んだ値が使えるのでこれも問題はありません。また、プリセット温度を変える頻度は少ないので、これまた問題はありません。ということで、根本的な対処ではありませんが、実質的に問題が無いので、この方式を採用することにしました。以後、この現象による誤動作はしていません。

tempcont.asm
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
process8
        movlw   b'01111111'
        movwf   portc           ;Set PORTC
        call    t200us          ;Wait 200 microseconds
        movfw   portb           ;Read PORTB
        xorlw   b'11111111'     ;Reverse bits
        movwf   preset1         ;Save 1st of preset
        movlw   b'00001111'     ;Set mask
        andwf   preset1,w       ;Pick up sw data
        movwf   preset1         ;Save 1st of preset
        movwf   presetw         ;Save preset(Binary)
        movfw   preset10        ;Read 10th of preset
        incf    preset10,w      ;10th of preset + 1
        movwf   presetb         ;Save count
process81
        decfsz  presetb,f       ;Count - 1 = 0 ?
        goto    process84       ;No.
        movfw   repeat          ;Yes. Read repeat counter
        btfss   status,z        ;Repeat counter = 0 ?
        goto    process82       ;No.
        movfw   presetw         ;Yes. Read preset data
        movwf   presetlk        ;Save preset last look
        incf    repeat,f        ;Repeat conter + 1
        goto    proc_end
process82
        movfw   presetlk        ;Read last look
        subwf   presetw,w       ;Preser - last look
        btfss   status,z        ;Preset = last look ?
        goto    precess83       ;No.
        incf    repeat,f        ;Yes. Repeat conter + 1
        movlw   3               ;Set reference data
        subwf   repeat,w        ;Repeat counter - 3
        btfss   status,z        ;Repeat counter = 3 ?
        goto    proc_end        ;No.
        movfw   presetw         ;Read preset data
        movwf   preset2         ;Set preset data
precess83
        clrf    repeat          ;Clear repeat conter
        goto    proc_end

process84
        movlw   10              ;Set add value
        addwf   presetw,f       ;preset + 10
        goto    process81

3端子レギュレータの温度が高い

原因入力電圧が高いため、少しの電流でもレギュレータが発熱する。
対処トランスの電圧を下げ、放熱器を付けた。

この現象は当然といえば当然です。でも、結構見逃しがちです。参考「+5V スイッチング・レギュレータ
最初はAC12Vのトランスを使用していました。この場合、2つのリレーが動作したときのレギュレータ入力電圧は14.15V、電流は0.15Aでした。ですから、レギュレータで消費される電力は ( 14.15V - 5.00V ) x 0.15A = 1.37W です。
トランスをAC10V出力に変えると、2つのリレーが動作したときのレギュレータ入力電圧は11.10Vでした。ですから、レギュレータで消費される電力は ( 11.10V - 5.00V ) x 0.15A = 0.92W になります。0.5Wくらいの差ですが、熱の量は抑えられます。
レギュレータの入力と出力の差は3Vくらい必要なので、最低でもAC8V以上のトランスを使う必要があります。ちなみにトランス出力をAC7Vにしてみましたが、リレーが2つ動作すると正常に働きませんでした。
0.92Wの消費電力でもレギュレータからはかなりの熱が出るので放熱器を付ける必要があります。