値の表記の無いチップ・コンデンサの容量を確認する必要がある。
購入時に容量は分かっているので、どのチップがどの値なのか判別が付けば良く、場合によっては値の相対的な大小が分かるだけでもいい。
普通に測定器を買っても大した値段ではないが、充電時間でも計れば比較は出来るんだろうということで、検索するとよさそうな例が見つかったので参考にさせていただいて、自作することにした。
具体的にはこちらのページの「キャパシタンスの測定」( 開発環境がmikroC )を参考にフリー版のMPLAB XC8の環境(最適化があまり効かない)で使えるように直した。
変更点1
LCD表示用のルーチンはmikroC用のものなのでMPLAB環境では全く使えない。
「PIC16F84A + SC1602BS + XC8」で用いたコードを使うようにすべて書き直した。
変更点2
上のサイトの例では変数にfloatを用いたりして計算処理し、ちゃんとF(pF)に換算して測定値を表示している。
表示用にsprintfを使い、さらにfloatまで持ち出すと、XC8がフリー版という制約でPIC16F88ではメモリが足りないので、TIMER1の生の値をそのまま表示するだけとした。
変更点3
精度的ににどうなのか分からないが、容量が大きな場合は、8MHz、プリスケーラ1:1ではカウンターが足りなくなるので、プリスケーラを変更して測定できるようにした。
ブレッドボードでテスト中の様子。
とりあえず手持ちのラジアルリードなコンデンサで実測してみたら、ほとんど直線に乗った。
左が容量(pF)、右が8MHz、プリスケーラ1:1でのTimer1のカウント値だ。
0pFの56はコンデンサを接続していないときの値。
意味はよく分からないが、0-56を除けば決定係数とやらが0.999943691となったので、TIMER1の値とコンデンサの容量は直線で近似できるとみていいのだろう。
上に書いたように、「はて、22μFはどっちだったっけ?」的な用途なら十分すぎると言える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
// CONFIG1 #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off) #pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) // CONFIG2 #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode enabled) #include <xc.h> #include <stdio.h> #include "lcd4.h" #define _XTAL_FREQ 8000000 void main(){ unsigned int timer1; char buf[15]; OSCCONbits.IRCF = 0b111;//8 MHz CMCONbits.CM = 0b011;//Two Common Reference Comparators ANSEL = 0b00000000; TRISA = 0b01111111; TRISB = 0b00001111; OPTION_REGbits.nRBPU = 0; __delay_ms(1000); Init_LCD4(); __delay_ms(500); while(1){ if(PORTAbits.RA3 == 1){ Set_Pos(0x00); Puts_LCD4("T1CKPS 1:1"); T1CONbits.T1CKPS = 0b00;//1:1 }else{ Set_Pos(0x00); Puts_LCD4("T1CKPS 1:2"); T1CONbits.T1CKPS = 0b01;//1:2 } TMR1L = 0; TMR1H = 0; PORTAbits.RA7 = 1;//放電 __delay_ms(1000); PORTAbits.RA7 = 0;//充電開始 while (CMCONbits.C1OUT == 0){ } T1CONbits.TMR1ON = 1;//Timer1 ON while (CMCONbits.C2OUT == 0){ } T1CONbits.TMR1ON = 0;//Timer1 OFF timer1 = TMR1H; timer1 = timer1 << 8; timer1 = timer1 | TMR1L; sprintf(buf, "T1Cnt = %u", timer1); Set_Pos(0x40); Puts_LCD4(" "); Set_Pos(0x40); Puts_LCD4(buf); __delay_ms(1000); } } |
追記
チップ・コンデンサを測ってみた。
値が飛び飛びに広範囲なので対数グラフにした。
多少精度は落ちるが、ほぼ直線に乗る。
チップはブレッドボードに挿せないので、こんなものをでっち上げて、これに挟んでから測定した。
使ったパーツは3つ。
ブレッドボード用のジャンパー線を真ん中で切断して被覆を剥いたもの。
適当な長さの銅箔テープ2本。
布をカーテンがわりにつるすのに使うプラスチックのクリップ1つ。
ジャンパー線を銅箔にハンダ付けしてからクリップに貼り付けるだけだ。
こんな間に合わせの道具じゃ測定精度もクソもあったもんじゃねえと思ったが、それでも上述のとおり、値の分からなくなったコンデンサの値を購入時の記録と照らし合わせて推定するという用途には十分すぎる。
PIC16F88は200円、抵抗は6本で6円、2SC1815が5円、プリント基板を作る予定でこれが150円、LCDが500円で、合計すると900円というところか。
LCDもPICも当然使いまわすから除外すると、実質は200円というところ。
この、パーツを使いまわせるというのが自作のいいとこだと思う。
あと、こんな手抜きの装置でも用途に応じて十分に活用することが出来る点もメリットだ。
使えそうなのでプリント基板を作成した。
「PIC16F88でコンデンサの容量を比べる(プリント基板作成)」