雑記/2008-1

<< 2008-1 >>
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

2008-1-12

[公開:any]

[容量計,AVR,LCメーター]
AVRを使ったコンデンサー容量計の製作」で実際に作成しました。(2008-08-30)

header

昨日の「雑記/2008-1-11」の続き。実験中の容量計で1μF以下のコンデンサも測定してみます。

body

小容量コンデンサは、短時間で充電されるため、AVRのタイマーで計るためにゆっくりと充電したほうが良いだろうと充電抵抗を1MΩとして実験してみましたが、0.1μF以下は正常な計算値が得られませんでした。

下のオシロスコープの波形は、測定端子開放時の電圧変化ですが、0Vから2.5Vに達するのに約7.4msもかかっています。このため、容量の小さなコンデンサを十分な速度で充電するだけの電圧の立ち上がりがないことになります。

DSC01224.jpg

ということで、充電抵抗は高速な電圧立ち上がりを得るためにある程度小さなものがいいと思われます。いろいろ試した結果、4.7kΩの抵抗で基準となるコンデンサ1000pF(誤差1%)の充電波形よりも短い時間の立ち上がり時間が得られました。

DSC01240.jpgDSC01241.jpg

上の画像は、4.7kΩの抵抗を使ったもので左が測定端子開放時、右が1000pFを測定したものです。開放時3.5μs、測定時で7.8μsとなりました。
4.7kΩより小さな抵抗値ではさらに高速な電圧立ち上がり時間が得られますが、AVRのタイマーで十分な解像度が得られないためこのぐらいの値が良いと思われます。
また、充電時間の除算に使う基準時間は、基準コンデンサの充電時間より端子開放時の立ち上がり時間を引いたものを使用します。

なお、AVRは、前日までは内蔵RC発信器による8MHzクロックで動作させていましたが、高速なタイマーが必要となりますので、20MHzのセラミック発振器を追加して外部クロック動作としています。

0.01μF(誤差5%)を測定。→0.01016μF
右は以前作成したLCメーターによる測定値。→0.01001μF

DSC01230.jpgDSC01238.jpg

0.1μF(誤差5%)を測定。→0.09724μF
右はLCメーターによる測定値。→0.09723μF

DSC01231.jpgDSC01237.jpg

小数点以下、4桁までピッタリですが、ここまでの精度は当然ありません。今回はたまたまだと思います。


絶対的な精度はありませんが、以前作成したLCメーターとほぼ同じ値が測定できます。

参考までに、今回基準とした1000pF(誤差1%)をLCメーターで測定した結果です。

DSC01239.jpg

以下は、今回のものでコンデンサを測定した結果です。
ポリプロピレン 100pF → 0.00009μF
   〃      680pF → 0.00067μF
積層セラミック 1μF → 0.93157μF
   〃      1.5μF → 1.59932μF
積層チップ    10μF → 11.21165μF
電解コンデンサ  10μF → 10.04543μF
   〃       47μF → 53.19040μF
   〃      100μF → 96.50710μF
   〃      470μF → 510.08731μF
   〃     1000μF → 981.19354μF

通常、新しい未使用の電解コンデンサは、誤差範囲から想定すると、定格(表示)よりも大きな容量を持っているのが多いと思われます。・・・ということは、47μF以上の測定値は、チョット怪しいと思われます。

基準となる正確な容量のコンデンサが得られれば十分な実用性はあると思われます。

2008-1-11

[公開:any]

[容量計,AVR,ATmega168,LCメーター]
AVRを使ったコンデンサー容量計の製作」で実際に作成しました。(2008-08-30)

header

LCメーターの製作」で作ったLCメーターでは、電解コンデンサ等の極性のあるコンデンサが測定できません。また、1μF以上の容量の大きなコンデンサを測定することもできないので、AVRを使って容量計をテスト作成してみます。

body

以前、作ったLCメーターは、フランクリン発振回路の発振周波数の変化からインダクタンスやキャパシタンスを測定しています。コンデンサの静電容量(キャパシタンス)は、実測から1μF程度までは測定できますが、それ以上はうまく測定できません。(発振周波数が低くなりすぎるためだと思われる。)
また、極性を持つコンデンサの測定は出来ないため、電解コンデンサの測定にも使えません。

コレまでのところ、特別、必要というわけではありませんが、CR回路の過渡現象を使った容量計の製作記事をインターネットでいくつか目にしたので、AVRのアナログコンパレータ機能とタイマー機能を使って実験してみました。

コンデンサ容量の測定原理は、コンデンサの充電時間(ある電圧からある電圧に達するまでの時間)を測定し、その時間を容量に換算する方式とします。
今回は、あらかじめ容量誤差の小さなコンデンサ1μFが抵抗を介して0.96Vから2.5Vに達するまでの時間を基準として、測定コンデンサの充電時間を基準時間で除算することにより容量を求めています。

実験回路は、以下です。

c-meter.PNG

作成したプロクラムの動作シーケンスは以下のとおり。

  • スタート時はTr1がONとなった状態で測定するコンデンサは両端がGNDでショートされた状態(つまり、完全に放電された状態)。Tr2もONとなり、抵抗によって分圧された電圧0.96VがAVRのコンパレータの反転入力AIN1に入力される。
  • プッシュSWを押すとTr1がOFFとなり、測定コンデンサへの充電を開始すると同時にタイマー1をスタート。
  • 測定コンデンサの電圧が上昇し、0.96Vに達するとコンパレータの比較出力に連動したタイマー1の値がキャプチャ(補足)され割り込みがかかる。
  • タイマー1の値を記録し、Tr2をOFFとしてコンパレータの反転入力AIN1に2.5Vをセットする。
  • 測定コンデンサの電圧がさらに上昇し、2.5Vに達すると、再びコンパレータの比較出力に連動したタイマー1の値がキャプチャされて割り込みがかかる。
  • タイマー1の値から先ほど記録したタイマー1の値を減算して充電時間を求める。
  • 充電時間を基準コンデンサの充電時間で除算し、容量を求める。


基準コンデンサの測定。
DSC01216.jpg

10μFの測定。→結果:10μF
DSC01217.jpg

47μFの測定。→結果:56μF
DSC01218.jpg

100μFの測定。→結果:102μF
DSC01219.jpg

470μFの測定。→結果:533μF
DSC01220.jpg

1000μFの測定。→結果:1075μF
DSC01221.jpg


・・という具合で、なんとか使えそうです。
問題は、CR回路の抵抗値が固定されている現状では、大きな容量のコンデンサの充電に時間がかかることです。1000μFの場合は15秒程度かかります。
コンデンサの容量に応じて抵抗値をスイッチで手動切替にするか、プログラムで自動切換えにするなどの工夫が必要です。

2008-1-3

[公開:any]

[AVR,ATTiny45,PWM]

header

AVRのATTiny45は、8ピンなのにPWM出力が3系統もあるらしいので、3色LEDをPWM駆動して実験してみます。

body

データシートを見てみるとタイマ0とタイマ1でそれぞれ2系統で合計4系統のPWMが得られるように読めますが、いろいろ試したところ3系統までのようです。(つーか、よくわかりません)
オシロスコープで波形を確認したところ、デューティ比を3系統までは単独で制御できるようです。ただ、タイマは2系統なのでPWM周波数は2種類までとなります。

とりあえず、3色LEDをつないで、各色を単独でPWM制御してみます。

DSC01212.jpg

といっても、静止画じゃよくわからんですけど、1秒ごとに各色のPWMのデューティ比を乱数変化させるようにしてみました。

参考までにAVRStudio4でWinAVR(GCC)を使用して作ったソースです。

#include <avr/io.h>
#include <util/delay.h>

void delay_ms(unsigned int t) { while (t--) _delay_ms(1); }

int main(void)
{
    DDRB =_BV(PB0)|_BV(PB1)|_BV(PB4);      
    TCCR0A =_BV(WGM01)|_BV(WGM00)|_BV(COM0A1)|_BV(COM0B1);
    TCCR0B = 2;        // Timer0 CLK/8
    TCCR1 = 4;        // Timer1 CK/8
    GTCCR = _BV(PWM1B)|_BV(COM1B1);        // PWM1B動作許可

    while(1) {
        OCR0A = (int)(rand() - 1) / 128;
        OCR0B = (int)(rand() - 1) / 128;
        OCR1B = (int)(rand() - 1) / 128;
        delay_ms(1000);
    }
}

ATTiny45は、内蔵RC発振器による8MHzのクロックで動作させます。プリスケーラは、タイマ1とタイマ2ともクロックの1/8としています。よってPWM周波数は、8000000 ÷ 8 ÷ 256 = 3906 ・・約4KHzとなります。
タイマ0でOC0AとOC0Bを出力し、タイマ1でOC1Bを出力しています。rand()関数は、0〜7FFFまでの整数を返すので128で除算して0〜255までのTOP値を得ています。
助長なコードがある可能性がありますが、こんな簡単なものでとりあえず動くみたいです。


▲ページ Top へ...