2012年4月21日土曜日

コンデンサの容量計(Cメータ)の作成

今の天気 晴れ、気温 5度。
ここもやっと春だよ、暖かい・・・synctonです、こんばんは。

SWAS-G/LFO作成中なのですが発振周波数が思ったより高く(予定の10倍)なってしまって原因がつかめないまま色々調査やテストをやっているのですが、発振周波数に直接関係してくるコンデンサの容量を測定する機材を持っていません。
そこでコンデンサの容量計を作ってみようかと思っています。
とりあえず手元にある PSoC マイコンで出来ないかと色々検索してみると、いくつかのやり方があるみたいです。
  1. コンデンサに充電または放電する時間から求める方法
  2. 交流インピーダンスから求める方法
  3. CR発振器の発振周波数から求める方法
1の充放電の時間から求める方法は直感的にわかりやすかったので、さっそく以下のサイトを参考に実装を試みてみました。
PSoC容量計:ここは「はじめてのPSoCマイコン」の著者:桑野雅彦さんのサイトのようです。
これを参考に実装してみましたが、ダウンロードしたプロジェクトファイルが PSoC Designer 4 用で今使用中の 5.2 とは少し違うようで上手く実装できません。

2の方法は「はじめてのPSoCマイコン」第八章 交流インピーダンスの測定テクニックとインピーダンス&容量&湿度計の製作に載っていたのですが難しすぎて手も足も出ませんでした。

そこで3の発振周波数から求める方法にしてみました。
タイマーIC555を使用して矩形波を作成し、 PSoC(CY8C29466-24PXI) マイコンで周波数を測定しコンデンサの容量を算出することにしました。
周波数カウンタは Cypress の PSoC アプリケーション・ノート[AN2283] を参考に実装。発振器の部分は以前LFO作成で使用した回路から不要部分を削除して作ってみました。


ブレッドボードでテストしてみたところ、そこそこ良い感じです。
1000pFのコンデンサを測定中・・・
発振器部分の回路図は・・・
555を使用した発振器。標準的な回路です。
ちなみにシミュレート結果の周波数は約4.799kHz
なるべく正確な値を出せるように抵抗(Ra,Rb)はテスターで測って 100kΩ ちょうどの物を探して使用しています。
幾つかのコンデンサを使用しての実測してみた。また、検証用にオシロスコープ(OWON PDS5022)でも発振周波数を測定してみた。
結果は・・・

容量 実測値 周波数 オシロ 種類 備考
100pF 136.85 pF 35.152 kHz 35.45 kHz ポリエステル・フィルム
1000pF 1022.126pF 4.7055 kHz 4.740 kHz ポリエステル・フィルム
0.1uF 0.122uF 39.52 Hz 39.85 Hz 積層セラミック 値がなかなか安定しない
2.2uF 2.168uF 2.218 Hz 2.235 Hz 積層フィルム

#積層セラミックって、安定性を要求される発振器では使用しない方が良いのかな・・・
PSoC のプログラムはアプリケーション・ノート[AN2283]のプロジェクトをそのまま使用して、DisplayValue() 関数の中身のみ以下のように差替え。
void DisplayValue(void){
double  Capacitance = 0.0;
double  Ra = 100.0*1000.0; // 100kohm 抵抗の実測値をここに指定する。単位はΩ。
double  Rb = 100.0*1000.0; // 100kohm 抵抗の実測値をここに指定する。単位はΩ。
 LCD_Control(0x01);
 //コンデンサ容量表示
 Capacitance = 1.443 / ( (Ra + (2.0 * Rb)) * fFreqValue);
 cursor(0,0);
 // 1pF = 0.000 000 000 001
 // 1nF = 0.000 000 001
 // 1uF = 0.000 001
 // 1mF = 0.001
 // 1 F = 1
 if (Capacitance < 0.000000001) {
  printf("%08f pF" , Capacitance * 1000000000000.0);
 } else if (Capacitance < 0.00000001) {
  printf("%08f pF" , Capacitance * 1000000000000.0);
 } else if (Capacitance < 0.000001) {
  printf("%08f uF" , Capacitance * 1000000.0);
 } else if (Capacitance < 0.001) {
  printf("%08f uF" , Capacitance * 1000000.0);
 } else {
  printf("%08f F" , Capacitance * 1.0);
 }
 
 //周波数表示
 cursor(1,0);
 if(fFreqValue == 0.0) {
  printf("Underrange");
 } else if(fFreqValue < 0.0) {
  printf("Overrange ");   
 } else {
  if(fFreqValue < 1000.0) {
   printf("%08f Hz",fFreqValue);
  } else {
   printf("%08f kHz",fFreqValue / 1000.0);
  }
 }
}
printf() 関数は pastelmagic の開発TIPS にあったものを使用させていただきました。

今のところPSoC内蔵のクロック(精度2.5%)を使用しているのですが精度を上げるために 水晶振動子を付けた方が良いかも・・・
あとは箱に入れて完成にもって行きたいと思っています。
どこかに良いケースないかなぁ~

では・・・

0 件のコメント:

コメントを投稿