//********************************************************************** /*   『電池内部抵抗測定』 I=V/R  V=E-rI  V+rI=E rI=E-V r=(E-V)/I */ //********************************************************************** unsigned int measurement(unsigned short channel) { unsigned int ad, cnt; // 電圧を50回累積測定する。 ad = 0; for (cnt = 0; cnt < 50; cnt++) { ad += Adc_Read(channel); } return (ad); } //********************************************************************** #define SW PORTB.F0 void main() { unsigned char buf[8]; unsigned int ad2, ad3; double E, V, I, r; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 // A/D変換を使用する。 ANSEL = 0b00001100; // ポートを初期化する。 TRISA = 0b00111110; TRISB = 0b00001111; OPTION_REG.F7 = 0; // LCDを初期化する。 Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); // while (1) { // Vの測定 ad3 = measurement(3); V = ((double)ad3 * 4.8828125) / 50.0; if(V < 100.0) { Lcd_Custom_Cmd(LCD_CLEAR); // Eの測定 ad2 = measurement(2); E = ((double)ad2 * 4.8828125) / 50.0; // Eの表示 WordToStr((unsigned int)E, buf); Lcd_Custom_Out(1, 1, "E"); Lcd_Custom_Out(1, 2, &buf[1]); Lcd_Custom_Out(1, 6, "mV"); } else { // Vの表示 WordToStr((unsigned int)V, buf); Lcd_Custom_Out(1, 9, "V"); Lcd_Custom_Out(1, 10, &buf[1]); Lcd_Custom_Out(1, 14, "mV"); // Iの計算 I = V / 4.7; // Iの表示 WordToStr((unsigned int)I, buf); Lcd_Custom_Out(2, 1, "I"); Lcd_Custom_Out(2, 2, &buf[1]); Lcd_Custom_Out(2, 6, "mA"); // rの計算 r = ((E - V) * 1000.0) / I; // rの表示 WordToStr((unsigned int)r, buf); Lcd_Custom_Out(2, 9, "r"); Lcd_Custom_Out(2, 10, &buf[1]); buf[0] = 'm'; buf[1] = 0xF4; buf[2] = 0x00; Lcd_Custom_Out(2, 14, buf); } Delay_ms(500); } } //**********************************************************************