概要

内臓AD変換器と内臓リファレンス電圧を使用して電圧計を作成します。計測電圧は配線図のVINに接続します。外部で1/3倍に分圧しAN5に接続します。リファレンス電圧は2.048VなのでAN5では最大2.048Vを測定できます。10bitの分解能なので最大測定電圧は2.048V*3=6.144V 分解能は6.144V/1024=6mVとなります。
LCD液晶はSC1602を対象としているが、液晶モジュールの電源の接続をVDD,GNDを入れ替えればSC2004でも対応可能。ただしldc2c.cを修正しない場合16文字*2行でしか表示されないので注意。LCD表示用ライブラリは制限はない。
計測は約1秒のおきに実施される。時間はソフトウェアによるディレイ(クロック周波数に依存)で対応。
クロックはUSB-IOで接続済みの12MHzのセラミック振動子を使用しPLLで4倍にしている。書込みはPICKit3を前提とする。
液晶表示例

ADRES=512
VDD=3072mV
回路は次のとおりである。
回路図(PNG) 回路図(PDF) 回路図(DXF)

プログラムの説明

ソースファイル

以下のファイルで構成されている

ad2c.c ・・・ メインプログラム
lcd.c   ・・・ LCD表示用ライブラリ Version 1.00
lcd.h   ・・・ LCD表示用インクルードファイル Version 1.00

ソースファイルのダウンロード ad2c.zip

lcd.c

主にSC1602向けのLCD液晶表示用のライブラリである。
液晶モジュールと接続するポートはマクロで変更可能である。
busyフラグはチェックせずソフトウェアディレイで対応しているためクロック周波数が変更された場合はディレイの調整が必要
ユーザー定義キャラクタに対応
詳細は以下のリンクを参照されたい
lcd.c

lcd2c.c

メインプログラムである。
IOポートの入出力の設定をし、LCDの初期化サブルーチンコール、リファレンス電圧を2.048Vに設定後、ADコンバータの初期化、約1秒おきにAD変換を開始し、変換終了後、LCDに表示します。

/*
 * 電圧計  Version 1.00
 * File:        ad2c.c
 * Target:      PIC18F14K50 48MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/10/08 20:00
 *
 * AN5を使用
 * 外部回路で電圧を1/3倍にして接続
 * 基準電圧は2.048V
 * 最大測定電圧は 2.048*3=6.144V
 * 分解能 6.144/1024=6mV
 * 液晶にAD変換値とmV単位で電圧を表示
 *
 *              各端子の接続
 *              RC0 out     :LED0
 *              AN5 in      :測定電圧の1/3
 *              RC2 out     :LCD RS
 *              RC3 out     :LCD E
 *              RC4-RC7 out :LCD DB4-DB7
*/

#include <stdio.h>
#include <p18f14k50.h>
#include <plib\delays.h>
#include "lcd.h"

#pragma config  FOSC = HS,CPUDIV = NOCLKDIV,PLLEN=ON,WDTEN=OFF,LVP=OFF,MCLRE=OFF

char lcd_buf[34];
void fvr_init(void);

void main(void) {
    ANSEL=0b00100000;    //  AN5を使用
    ANSELH=0;
    SLRCON=0;
    WPUB=0;
    INTCON2=0;
    TRISA=0;
    TRISB=0b11110000;
    TRISC=0b00000010;
    lcd_init();
    fvr_init();
    ADCON2=0b10111110;  //  右詰 20TAD FOSC/64
    ADCON1=0b00001000;  //  リファレンス電圧 +=FVR -=VSS
    ADCON0=0b00010101;  //  AN5 AD有効

    unsigned adv;
    while(1){
        ADCON0bits.GODONE=1;    //  変換開始
        while(ADCON0bits.GODONE);   //  変換終了待ち
        adv = ADRESH<<8;
        adv += ADRESL;  //  AD変換値10bit

        unsigned  mv =adv*6; // V*2048*3/1024=V*6 mV単位
        sprintf(lcd_buf,"ADRES=%i\nVDD=%imV",adv,mv);
        lcd_disp(lcd_buf);
        Delay10KTCYx(200);
        Delay10KTCYx(200);
        Delay10KTCYx(200);
        Delay10KTCYx(200);
        Delay10KTCYx(200);
    }
}

//  リファレンス電圧の設定

void fvr_init(void){
    REFCON0bits.FVR1S1=1;   //  FVRを2.048Vに設定
    REFCON0bits.FVR1S0=0;
    REFCON0bits.FVR1EN=1;
}