ようこそNICのホームページへ(なが〜い試運転中 from 2001/5/12) 
HP パソコン 健康 落語 海外 思うまま 電子工作


LCD表示器を用いた電流計、電圧計(2011/02/21)

Last update:2011/03/06    Build:2011/03/06

 LCD表示器を利用してPIC工作で使う電流計(こちらが主)、電圧計を製作した  

LCD表示器SC1602Bを用いた電流計です。PIC工作に利用

1.LCD表示器 SC1602BS−Bの購入

バックライトなしタイプの液晶文字表示装置を秋月電子で500円/個で購入
PIN配置とPIN番号は下表のとおり
PIN番号 名称 種類   説明
Vdd 電源 電源+5V
Vss 電源 電源グランド
V0 入力 コントラスト調整
RS 入力 レジスター選択
R/W 入力 リード/ライト
入力 イネーブル
DB0 入出力 データバス(ビット0)
DB1 入出力 データバス(ビット1)
DB2 入出力 データバス(ビット2)
10 DB3 入出力 データバス(ビット3)
11 DB4 入出力 データバス(ビット4)
12 DB5 入出力 データバス(ビット5)
13 DB6 入出力 データバス(ビット6)
14 DB7 入出力 データバス(ビット7)
 ページ上部に移動します

2.回路図は”電子工作etc”さんのページから借用

回路図は ”電子工作etc”さんのページ から借用しました。

回路図の作成には水魚堂さんの BSch3Vを を使わせて貰っています。


EXCELで描いた部品配置です

 ページ上部に移動します

3.16F88用のプログラム

16F88用のプログラムも ”電子工作etc”さんのページ から借用しました。mikroCで書いています。

mikroCのプログラムです
//**********************************************************************
/*
  『電圧&電流計』
     2010/11/18 に http://www8.plala.or.jp/InHisTime/page053.html 
     からコピーした 
     コメントは自分の理解のために私が大部分記入 
     mikro c を使用 
*/

/*  ********************* 理解のために私がコメントを追加
 2010/11/19 ---------> 2011/2/19  (完成) 
  101118_16F88_LED_1.c
 16F88 PIN
  1:RA2/AN2/CVref/Vref-        アナログ入力2(電流)で使用
  2:RA3/AN3/Vref+/C1OUT                今回 Vref+使用
  3:RA4/AN4/T0CKI/C2OUT        使用せず(入力設定)
  4:RA5/MCLR/Vpp                   使用せず(入力設定)
  5:Vss                              GND
  6:RB0/INT/CCP1(1)                使用せず(入力設定)
  7:RB1/SDI/SDA                    使用せず(入力設定)
  8:RB2/SDO/RX/DT                  使用せず(入力設定)
  9:RB3/PGM/CCP1(1)                使用せず(入力設定)
 10:RB4/SCK/SCL                  デジタル出力 (LCD D7)
 11:RB5/SS/TX/CK                 デジタル出力 (LCD D6)
 12:RB6/AN5/PGC/T1OSO/T1CKI      デジタル出力 (LCD D5)
 13:RB7/AN6/PGD/T1OSI            デジタル出力 (LCD D4)
 14:Vdd                             +5V
 15:RA6/OSC2/CLKO                デジタル出力 (LCD E)
 16:RA7/OSC1/CLKI                デジタル出力 (LCD R/W)
 17:RA0/AN0                      デジタル出力 (LCD RS)
 18:RA1/AN1          アナログ入力1(電圧)で使用
*/

//**********************************************************************

unsigned	int	measurement(unsigned short channel)
{
	unsigned	int		ad, cnt;
	//
	ad = 0;
	for (cnt = 0; cnt < 50; cnt++) {
		ad += Adc_Read(channel);   //  50回の合計 
	}
	return (ad);
}

//**********************************************************************

void main()
{
	static	unsigned	char	buf[8], cnt;
	static	unsigned	int		v1, v2, i1;
	static	double					ad, offset;
	//
	OSCCON = 0b01110000;		// クロックは8Mhz
	CMCON  = 0b00000111;		// コンパレータは使用しない。
	// A/D変換を使用する。
	ANSEL  = 0b00000110;  // AN1,AN2をアナログで使用 「1」:アナログ 「0」:デジタル
	ADCON1.VCFG1 = 1;     // Vref+ を使用
	ADCON1.VCFG0 = 0;     // GND   を使用 (Vref- を使用しない)
	// ポートを初期化する。
	TRISA  = 0b00111110;  // ポートAデータ入出力の方向 0:出力、1:入力
	  /* RA7:出力 RA6;出力 RA5:入力のみ(使用せず) RA4:入力 (使用せず)
	     RA3:入力 RA2;入力 RA1:入力     RA0:出力
	  */
	TRISB  = 0b00001111;  // ポートBデータ入出力の方向 0:出力、1:入力
	  /* RB7;出力 RB6;出力 RB5;出力 RB4;出力
             RB3:入力(使用せず) RB2:入力(使用せず) RB1:入力(使用せず) RB0:入力(使用せず) 
	  */
	// LCDを初期化する。
	Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6);
	Lcd_Custom_Cmd(LCD_CURSOR_OFF);
	Lcd_Custom_Cmd(LCD_CLEAR);
//	Lcd_Custom_Out(1, 1, "V&I Meter V1.0");
//	Delay_ms(500);
//	Lcd_Custom_Cmd(LCD_CLEAR);
	//
	offset = 0.0;  // 電流抵抗相当分の電圧を補正する 
	//
	while (1) {
		// 電圧の測定
		ad = 0.0;
		for (cnt = 0; cnt < 10; cnt++) {
			ad += measurement(1);  // AN1を読む 50回の合計を10回合計する(500回) 
		}
		ad = (ad / 500.0) * 2.44140625 * 11.0;  // 500回の平均を取り、11倍   mV単位 
		//     2500mV ÷1024= 2.44140625 
		ad = ad - offset;   // 電流抵抗相当分の電圧を補正する 
		v1 = (unsigned int)(ad);
		v2 = (unsigned int)(ad / 100.0);  // 数値を1/100する 
		if ((v1 - (v2 * 100)) >= 50)
			v2++;       // 四捨五入? 
		// 電圧の表示
		WordToStr(v2, buf); // 数値を文字に変換(8文字分) 
		buf[6] = 0x00;      //  
		buf[5] = buf[4];    // buffer(4)の数字をfuffer(5)へ移動 
		buf[4] = '.';       // buffer(4)の位置に小数点を入れる buffer(0)〜buffer(3)はそのまま
                //                     この操作で1/10したことになる。1/100と併せてmVからVへ変換 
		Lcd_Custom_Out(1, 1, buf); // LCD 1行目の1コラムからバッファーの文字を表示 
		Lcd_Custom_Out(1, 7, "V"); // LCD 1行目の7コラムに”V(ボルト)"を表示 
		// 電流の測定
		ad = 0.0;
		for (cnt = 0; cnt < 10; cnt++) {
			ad += measurement(2);  // AN2 を読む 50回の合計を10回合計する(500回) 
		}
		ad = (ad / 500.0) * 2.44140625 / 11.0;  // 500回の平均を取り、11で割り戻す 
		offset = ad;
		// i1 = (unsigned int)(ad * 10.0); // 0.1Ω抵抗なので10倍する(1Ω換算)
                i1 = (unsigned int)(ad ); // 1Ω抵抗なのでそのまま(1Ω換算)  
		// 電流の表示
		WordToStr(i1, buf);
		Lcd_Custom_Out(1, 9, buf);
		Lcd_Custom_Out(1, 14, "mA");
		//
		buf[0] = 0xFF;
		buf[1] = 0x00;
		for (cnt = 1; cnt <= 16; cnt++) {
			if ((i1 / (13 * cnt)) == 0)  //   220mA/16≒13 220mAでフルスケール
				break;
			Lcd_Custom_Out(2, cnt, buf);
		}
		for (; cnt <= 16; cnt++) {
			Lcd_Custom_Out(2, cnt, " ");
		}
	}
}
//* ************************************************** */
 ページ上部に移動します

4.できあがりの写真です

右の写真はLCD表示器を取り付けた状態です
左の写真の左上から右上へ外部電流が流れます。
電流計の電源は下中央の赤黒線から006P電池で供給。
  電流測定用の基準抵抗はオリジナルの0.1Ωから変更し1Ω(1%)抵抗を使用
 ページ上部に移動します

電子工作へ     HomePage