PIC解説

【PIC】ADCの使い方 サーミスタで温度測定

投稿日:2021-05-14 更新日:

今回はADC (Analog to Digital Converter) の使い方を解説します。PICのIOピンは通常デジタルの入出力しか出来ませんが、ADCを使用することでアナログ入力(電圧測定)をすることが可能になります。ADCの活用例としてサーミスタの抵抗値を測定することで温度を測定してみようと思います。

 

使用する部品

今回使用する主な部品は以下の通りです。

PICについてはADCモジュールが搭載されているものであれば大丈夫です。LCDの使い方についてはこちらの記事を参照してください。https://rikeden.net/?p=501

ADCモジュール

まずはADCモジュールについて簡単に解説します。

先程ADCでアナログ入力が可能になると説明しましたが、実際には完全なアナログ値というのは扱うことが出来ないので、デジタル値で電圧を測定します。

デジタル入力がHigh / Lowの2段階しかないのに対し、アナログ入力では0 ~ 1023 (10bit ADCの場合)の1024段階あります。

この1024段階はある基準(基本はVDDとGND)に対する相対値であり、実際の電圧を表している訳ではないことに注意してください。

ADC測定値-実際電圧

 

続いてPIC16F1579のデータシートを見てみると、冒頭の部分に次の記述が見られます。

Analog-Periferals

10bitというのはADCの解像度であり、10bit = 1024段階で電圧を測定することができます。12chというのはADCに利用できるIOピンの数のことです。気を付けなければならないのは、すべてのIOピンが利用可能という訳ではない点と、同時にどれか1つのIOピンしか測定できないという点です。

 

ADC関連レジスタ

ADCに関連するレジスタとその初期化例を解説します。各ビットについての詳細はクリックすると見られます。

ADCON0

ADCON0

詳細

CHS (Analog Channel Select bits)

ADCの測定を行うチャンネルを指定します。00000 = AN0, 00001 = AN1, ... 01011 = AN11
01100 ~ 11100 = 予約済み11101 = 内部温度計, 11110 = DAC, 11111 = FVR

GO/DONE (ADC Conversion Status bit)

このビットを1にするとADC測定が開始され、測定中は1のままで測定が終了すると0になります。

ADON (ADC Enable bit)

このビットを1にするとADCモジュールが有効化されます。ADCモジュールは消費電力が比較的大きいので、ADCを使用しない場合は0にしておいた方が良いようです。

チャンネルはAN0を使用し、ADCモジュールを有効化させます。

ADCON0 = 0b00000001;

ADCON1

ADCON1

詳細

ADFM (ADC Result Format Select bit)

1:右詰め 0:左詰め(後述)

ADCS (ADC Conversion Clock Select bits)

000 = Fosc/2, 001 = Fosc/8, 010 = Fosc/32, 011 = FRC
100 = Fosc/4, 101 = Fosc/16, 110 = Fosc/64, 111 = FRC

ADCの測定のクロックを指定します。次の表(網掛けの部分は不適切)をもとにFoscに対して適切な分周比を選択します。
ADC Clock Period

ADPREF (ADC Positive Voltage Reference Configuration bit)

00 = VDD, 01 = 予約済み, 10 = 外部参照ピン, 11 = FVR

ADCの上限の基準を設定します。電圧を測定したい場合、電源電圧が正確に分かっていればVDDでの測定結果から求められますが、そうでない場合はFVR(Fixed Voltage Reference)モジュールを基準とすることで電圧が計算できます。

また、このデバイスにはありませんが、下限の基準を設定出来るものもあります。

測定結果は右詰めで、Foscは4MHzで使用し、上限の基準はVDDとします。

ADCON1 = 0b10010000;

ADCON2

ADCON2

詳細

TRIGSEL (Auto-Conversion Trigger Selection bits)

タイマーなどの特定のイベントで自動でADC測定を行うように設定できます。
Auto-Conversion Trigger

自動測定は行いません。

ADCON2 = 0b00000000;

 

ADRESH, ADRESL

ADCの測定結果は10bitなので、ADRESHとADRESLの2つのレジスタにまたがって保存されます。10bitすべて使用する場合は右詰め、上位8bitで十分な場合は左詰めにするとよいです。

測定結果フォーマット

 

サンプルプログラム

ADCの初期化後、実際にADCの測定をするプログラムがこちらです。

今回は1chしか使わないためチャンネルの選択は省略していますが、複数のチャンネルを切り替える場合は、測定開始の前にADCON0レジスタのCHSにチャンネルを指定しておく必要があります。

 

サーミスタ

サーミスタ

サーミスタは温度によって抵抗値の変化する抵抗です。抵抗値を測定することによって温度を計算することが出来ます。

(写真の先端部の太い部分がサーミスタで大部分はリード線です)

サーミスタの抵抗値と温度の関係は次のようになっています。

サーミスタ関係式

(T0, R0はある温度とその温度における抵抗値、Bはサーミスタ固有の定数)

これをTについて解くと次のようになります。

T0, R0, Bは定数ですので、TはRの関数として表されました。

 

分圧そこでRを測定する必要がありますが、ADCで直接Rを測定することは出来ません。ではどうするかというと、基準となる抵抗を用意して、分圧から抵抗値の比を求めてサーミスタの抵抗値を計算します。

基準の抵抗の値をr、ADCの測定結果をAとすると、次の式が成立します。この時、電源電圧には依存しないことに注意してください。

分圧関係式

これをRについて解くと次のようになり、RがAの関数として表されます。

分圧R(A)

これで晴れてADCの測定結果から温度が計算できるようになりましたが、この計算をマイコンにやらせるのは大変なので、あらかじめExcelで計算してデータを用意してしまいましょう。

データシートから、T0 = 25 (℃)、R0 = 10000(Ω)、B = 3435(K) が得られます。rについてはまだ適切な値が分からないので変更できるようにしておき、とりあえず10000(Ω)とします。Excelに先程の計算式を入力します。

ExcelExample

A = 0, 1023の時にゼロ除算のエラーが発生しますが、測定値がそのような値をとることは考えられないので気にする必要はありません。

計算結果をグラフにしてみるとこんな感じです。

グラフ1

実際に使用する環境を考えると、測定範囲は0℃~100℃ で十分なのでその範囲で見てみます。

グラフ2

手持ちの抵抗の中からrの値を適当に選んでみた結果、r = 3200 (Ω)のグラフが一番よさそうでした。(3.3kΩの抵抗をテスターで測ったら3.2kΩでした)

グラフ3

ということでrの値と温度のテーブルが得られました。

 

動作テスト

ADCを使用してサーミスタで温度を測定しLCDに表示させてみました。

動作テスト

比較用として温度センサーBME280の測定結果と並べてみました。どちらも27.0℃ となっており、きちんと温度を測定できていることが分かります。

気温を測定するだけであれば温度センサーと変わりませんが、サーミスタであれば水温なども測定することが出来ます。

以下回路図とプログラムです。

Schematic

温度のテーブルに関しては、10倍して小数第一位までを整数とした上で、見づらいので別ファイルに入れておきました。また、0番目と1023番目にはとりあえず0を入れておきました。

LCDライブラリ

今回の記事は以上となります。最後までご覧いただきありがとうございました。

-PIC解説

執筆者:


  1. サーミスタによる温度測定、サーミスタの抵抗値を読む方法についてあれこれ書いてみました。
    ご一読いただければ。

    A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?
    http://igarage.cocolog-nifty.com/blog/2023/03/post-ad45c1.html

    Arduino サーミスタを使った温度測定で 【ゼロ除算問題】
    http://igarage.cocolog-nifty.com/blog/2023/03/post-4bb96a.html

    ミスが広まる 1/1023 vs 1/1024
    http://igarage.cocolog-nifty.com/blog/2020/01/post-a02d3f.html

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

PIC超入門!ゼロからLチカまでの道【その1:部品購入~IDE導入】

電子工作を始めてみたいけど、何から手を付けていいか分からない…。そんな方のためのゼロからLEDを点滅させる(通称Lチカ)ところまでの超入門講座です。 目次1 PICとは2 必要なもの2.1 1.必須の …

PICでカラーLCDモジュールを動かしてみた話【ST7789】

今回は以前にAmazonで購入したまま積んでいた フルカラーグラフィックLCDをPICで制御してみました。 激ムズというわけではありませんでしたが、いくつかつまずいたポイントがあったので備忘録がてら記 …

PICでUSARTに四苦八苦

今回はパソコンとのシリアル通信に挑戦しましたがなかなか苦労しました。最初に結論だけ言うと、 マイコンのTXは相手のRXに、RXはTXに! 逆に接続するよ! ってことでした。それでは本文↓   …

【PIC】I2Cでセンサーの値を読み取る

電子工作といえば色々なセンサーを使ってみたいですよね。 温度・湿度センサーや加速度センサー、ジェスチャーセンサーなんてものもあります。多くのセンサーはI2C通信で扱えるので一つやり方を覚えてしまえば色 …

PIC超入門!ゼロからLチカまでの道【その4:プログラム書き込み~Lチカ】

前回プログラムが完成したので、あとはプログラムを書き込んで、回路を組み立ててついにLチカです! あともう少しでゴールなので頑張りましょう。 前回の記事はこちらhttps://rikeden.net/? …