A/Dコンバータの読込みPIC16、18、dsPICシリーズでは8〜12ビットの内臓A/Dコンバータが内臓されているPICがあります。CCSコンパイラCCSコンパイラでははA/Dコンバータ読込みに関して以下の4つの例を紹介します。CCSコンパイラA/Dコンバータの読み込み方はすべて同じで以下のようになります。int型の整数を設定します。A/D変換に関係するポートをアナログポートとして使用するのか、デジタルポートとして使用するのか、またA/D変換する際の基準電圧端子として使用するかといった設定をおこないます。PICの内臓A/Dコンバータは逐次比較型です。main関数のはじめで設定します。通常は内部クロックをつかいます。どのポートのアナログ値を読むのか指定します。これらの制御部を1つしかもっていいないので切り替えて使います。同時には読み込めません。A/D変換された値を読み込み、変数にセットします。directive.とあります。実際に観測してみると戻ってくるのは符合なし整数です。戻り値の変数の型は符号なしの整数にするようにしましょう。(16ビット)にするので整数でも符号なし整数でも問題は発生しません。8ビットAD変換の時変数の型をint型(8ビット)にすると基準電圧の1/2以上の値に対し戻り値は負となってしまいます。後閑哲也さんが設計されたものです。<試作品回路図>PIC16F877をつかった場合の回路図を以下に示します。8ビットA/Dコンバータ出力を液晶に表示AD変換された値を整数でよみとると比較電圧の1/2より大きい電圧に対しては値が負になると同時に電圧が大きくなるにしたがって値の絶対値が減少していきます。255この問題は8ビットA/D変換の時変数をint型(8ビット)にした場合に発生します。read_adc();の戻り値は符号なしの整数なので変数は符号なしの整数にした方がよいと思います。A/D変換された値を(符号付)整数で受け取り液晶の1行目に(符号付)整数で表示すること。<試作品回路図>PIC16F877をつかった場合の回路図を以下に示します。A/D変換されたデジタル変換値を液晶の1行目に10進数で表示すること。(→回路図のPDFファイル)PIC16F877をつかった場合の回路図を以下に示します。安定した基準電圧素子としてナショゼミのLM385をつかった例を以下に示します。外部リファレンスによるAD変換<試作品回路図>PIC18F87K90をつかった場合の回路図を以下に示します。電源電圧リファレンスでない場合はADCON1レジスタの書き込みが必要である。おかしなAD変換値となる。1lcd_lib_C18.h//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//C18コンパイラ用に変更したものです。1lcd_lib_C18.c//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//C18コンパイラ用に変更したものです。妥当な実験結果がえられた。GNDに接続する必要はない。ソフトでの設定だけでよい。・リファレンス電圧の出力インピーダンスは低くなければならない。・電圧測定端子に直接基準電圧素子LM285-1.2をつないでもAN端子の入力インピーダンスが高いので基準電圧降下は得られなかった。20KΩのダミー抵抗を接続すると1.2vの電圧降下は得られる。3.0v電源の74HC4050は有効であった。AN0、AN1でA/D変換されたデジタル変換値を液晶の1行目に10進数で表示すること。(→回路図のPDFファイル)PIC16F877をつかった場合の回路図を以下に示します。単電源で特性のよいオペアンプLM2904をもちいて10倍のアンプをつくり測定電圧を増幅してこの出力をAN1に接続しました。出力電圧で0〜2.5Vの範囲のAN1入力電圧を活用することとしました。することで測定電圧の0〜0.25Vが高分解能でA/D変換できることになります。home}<動作結果>A0(=18)がアンプ(ゲイン10倍)を経ない電圧をよんだA/D変換の10ビット値で、A1(=175)がアンプ(ゲイン10倍)を経た後によんだA/D変換の10ビット値です。分解能が1桁あがっていることがわかります。精度を要求される場合に有効な方法だと思います。12ビット、16ビットのA/Dコンバータを外付けするとPICとのインターフェース、処理スピード、コスト等いろいろな問題が発生してきます。C18コンパイラC18コンパイラの場合、内臓ADコンバータからのAD変換値を読込みの基本的な流れは以下のようになります。SFRの設定をおこなう。一部のPICでは直接のレジスタ書き込みも必要となる。読み込みのチャンネルを選択する。AD変換をDisableにする(1)入力電圧を液晶に表示(PIC18F4550)PIC18F4550の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。PICの種類によってOpenADC()関数の引数、及び引数の数が異なります。PIC18F4550の場合はSFRのADCON0、ADCON1、ADCON2レジスタすべての設定がOpenADC()関数の引数でおこなわれます。リファレンス電圧は+5V(PICの電源電圧)とする。液晶には以下を200msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>PIC18F4550の場合の回路図を以下にしめします。1lcd_lib_C18.h//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ//1lcd_lib.cをC18コンパイラ用に変更したものです。1lcd_lib_C18.c//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ//1lcd_lib.cをC18コンパイラ用に変更したものです。5.0vの時の液晶表示を以下に示します。5.0v(2)入力電圧を液晶に表示(PIC18F452)PIC18F452の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。PICの種類によってOpenADC()関数の引数、及び引数の数が異なります。PIC18F452の場合は一部の設定がOpenADC()関数の引数では設定されない為、レジスタに直接書き込む必要があります。)を設定するためにADCON2レジスタの下位4ビットに直接書き込みます。リファレンス電圧は+5V(PICの電源電圧)とする。液晶には以下を200msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>PIC18F452をつかった場合の回路図を以下に示します。1lcd_lib_C18.h//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ//1lcd_lib.cをC18コンパイラ用に変更したものです。1lcd_lib_C18.c//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ//1lcd_lib.cをC18コンパイラ用に変更したものです。clear}<動作結果>入力電圧が2.5vの場合の写真を以下に示します。(3)入力電圧を液晶に表示(PIC18F87K90)<試作品回路図>PIC18F87K90をつかった場合の回路図を以下に示します。1lcd_lib_C18.h//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//C18コンパイラ用に変更したものです。1lcd_lib_C18.c//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//C18コンパイラ用に変更したものです。PIC18F14K50をつかった場合の回路図を以下に示します。lcd_lib_XC8.h//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//XC8コンパイラ用に変更したものです。lcd_lib_XC8.c//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを//XC8コンパイラ用に変更したものです。dsPIC編C30コンパイラの場合、内臓ADコンバータからの12bitAD変換値読込みの基本的な流れは以下のようになります。SFRの設定をおこなう。読み込みのチャンネルを選択する。)内のように直接レジスタにアクセスした方が速いようです。(注2)10ビット用の関数は関数の末尾12が10となります。(1)入力電圧を液晶に表示(dsPIC30F2012)dsPIC30F2012の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。書き込みはICSPを使っています。リファレンス電圧は+5V(PICの電源電圧)とする。液晶には以下を200msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>dsPIC30F2012の場合の回路図を以下にしめします。1lcd_lib.cをもとに、//C30コンパイラ対応、及び分散ポート対応等で変更を加えたものです。1lcd_lib.cをもとに、//C30コンパイラ対応、及び分散ポート対応等で変更を加えたものです。5.0vの時の液晶表示を以下に示します。5V(2)入力電圧を液晶に表示(dsPIC30F4013)dsPIC30F4013の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。リファレンス電圧は+5V(PICの電源電圧)とする。液晶には以下を200msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>dsPIC30F4013の場合の回路図を以下にしめします。1lcd_lib.cをもとに、//C30コンパイラ対応、及び分散ポート対応等で変更を加えたものです。1lcd_lib.cをもとに、//C30コンパイラ対応、及び分散ポート対応等で変更を加えたものです。5.0vの時の液晶表示を以下に示します。入力電圧を液晶に表示する。PIC24FJ64GA002の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。リファレンス電圧は+3.3V(PICの電源電圧)とする。液晶には以下を200msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>PIC24FJ64GA002の場合の回路図を以下にしめします。Integerの誤植である。//SAMPビットのセットでサンプリングを開始する。//バッファーを1個の16ワードバッファとする。1lcd_lib.cをもとに、//C30コンパイラ対応等でに変更したものです。1lcd_lib.cをもとに、//C30コンパイラ対応等で変更したものです。home}<動作結果>液晶の下に写っているのはAN0の端子電圧を表示しているデジタルテスターです。入力電圧を液晶に表示する。PIC32MX460F512L内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。リファレンス電圧は+3.3V(PICの電源電圧)とする。液晶には以下を100msec毎に表示する。入力電圧(単位:ボルト)<試作品回路図>PIC32MX460F512Lの場合の回路図を以下にしめします。Moduke)に実装されているものを使っています。・使用しているユニバーサルキバンは自作のユニバーサルキバンです。Integerの誤植である。//SAMPビットのセットでサンプリングを開始する。//バッファーを1個の16ワードバッファとする。1lcd_lib.cをもとに、//C32コンパイラ対応等で変更したものです。1lcd_lib.cをもとに、//C32コンパイラ対応等で変更したものです。home}<動作結果>液晶の下に写っているのはAN0の端子電圧を表示しているデジタルテスターです。PIC32MXとはその構成が大幅に変更になっています。動くようになったようです。はたで思うよりはるかに難しいようです。PIC32MZ2048ECH100の内臓ADコンバータからAD変換値を読込み、値を液晶に表示した例を紹介します。リファレンス電圧は+3.3V(PICの電源電圧)とする。液晶には以下を100msec毎に表示する。5<試作品回路図>PIC32MZ2048ECH100の場合の回路図を以下にしめします。PLL_FRCを選択する。1lcd_lib.cをもとに、//C32コンパイラ対応等で変更したものです。1lcd_lib.cをもとに、//C32コンパイラ対応等で変更したものです。