<< | 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 |
[公開:any]
[容量計,AVR,LCメーター]
「AVRを使ったコンデンサー容量計の製作」で実際に作成しました。(2008-08-30)
昨日の「雑記/2008-1-11」の続き。実験中の容量計で1μF以下のコンデンサも測定してみます。
小容量コンデンサは、短時間で充電されるため、AVRのタイマーで計るためにゆっくりと充電したほうが良いだろうと充電抵抗を1MΩとして実験してみましたが、0.1μF以下は正常な計算値が得られませんでした。
下のオシロスコープの波形は、測定端子開放時の電圧変化ですが、0Vから2.5Vに達するのに約7.4msもかかっています。このため、容量の小さなコンデンサを十分な速度で充電するだけの電圧の立ち上がりがないことになります。
ということで、充電抵抗は高速な電圧立ち上がりを得るためにある程度小さなものがいいと思われます。いろいろ試した結果、4.7kΩの抵抗で基準となるコンデンサ1000pF(誤差1%)の充電波形よりも短い時間の立ち上がり時間が得られました。
上の画像は、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
0.1μF(誤差5%)を測定。→0.09724μF
右はLCメーターによる測定値。→0.09723μF
小数点以下、4桁までピッタリですが、ここまでの精度は当然ありません。今回はたまたまだと思います。
絶対的な精度はありませんが、以前作成したLCメーターとほぼ同じ値が測定できます。
参考までに、今回基準とした1000pF(誤差1%)をLCメーターで測定した結果です。
以下は、今回のものでコンデンサを測定した結果です。
ポリプロピレン 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以上の測定値は、チョット怪しいと思われます。
基準となる正確な容量のコンデンサが得られれば十分な実用性はあると思われます。
[公開:any]
[容量計,AVR,ATmega168,LCメーター]
「AVRを使ったコンデンサー容量計の製作」で実際に作成しました。(2008-08-30)
「LCメーターの製作」で作ったLCメーターでは、電解コンデンサ等の極性のあるコンデンサが測定できません。また、1μF以上の容量の大きなコンデンサを測定することもできないので、AVRを使って容量計をテスト作成してみます。
以前、作ったLCメーターは、フランクリン発振回路の発振周波数の変化からインダクタンスやキャパシタンスを測定しています。コンデンサの静電容量(キャパシタンス)は、実測から1μF程度までは測定できますが、それ以上はうまく測定できません。(発振周波数が低くなりすぎるためだと思われる。)
また、極性を持つコンデンサの測定は出来ないため、電解コンデンサの測定にも使えません。
コレまでのところ、特別、必要というわけではありませんが、CR回路の過渡現象を使った容量計の製作記事をインターネットでいくつか目にしたので、AVRのアナログコンパレータ機能とタイマー機能を使って実験してみました。
コンデンサ容量の測定原理は、コンデンサの充電時間(ある電圧からある電圧に達するまでの時間)を測定し、その時間を容量に換算する方式とします。
今回は、あらかじめ容量誤差の小さなコンデンサ1μFが抵抗を介して0.96Vから2.5Vに達するまでの時間を基準として、測定コンデンサの充電時間を基準時間で除算することにより容量を求めています。
実験回路は、以下です。
作成したプロクラムの動作シーケンスは以下のとおり。
・・という具合で、なんとか使えそうです。
問題は、CR回路の抵抗値が固定されている現状では、大きな容量のコンデンサの充電に時間がかかることです。1000μFの場合は15秒程度かかります。
コンデンサの容量に応じて抵抗値をスイッチで手動切替にするか、プログラムで自動切換えにするなどの工夫が必要です。
[公開:any]
AVRのATTiny45は、8ピンなのにPWM出力が3系統もあるらしいので、3色LEDをPWM駆動して実験してみます。
データシートを見てみるとタイマ0とタイマ1でそれぞれ2系統で合計4系統のPWMが得られるように読めますが、いろいろ試したところ3系統までのようです。(つーか、よくわかりません)
オシロスコープで波形を確認したところ、デューティ比を3系統までは単独で制御できるようです。ただ、タイマは2系統なのでPWM周波数は2種類までとなります。
とりあえず、3色LEDをつないで、各色を単独でPWM制御してみます。
といっても、静止画じゃよくわからんですけど、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値を得ています。
助長なコードがある可能性がありますが、こんな簡単なものでとりあえず動くみたいです。