LCD表示器を用いた電流計、電圧計(2011/02/21) Last update:2011/03/06 Build:2011/03/06
LCD表示器を利用してPIC工作で使う電流計(こちらが主)、電圧計を製作した
バックライトなしタイプの液晶文字表示装置を秋月電子で500円/個で購入 PIN配置とPIN番号は下表のとおり
回路図は ”電子工作etc”さんのページ から借用しました。 回路図の作成には水魚堂さんの BSch3Vを を使わせて貰っています。 EXCELで描いた部品配置です 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, " "); } } } //* ************************************************** */ページ上部に移動します
|