Arduino UNO R3で周波数を計る
UNO R3での周波数計測回路、過去、あれこれ作ってきました。
その応用で、トランジスタ技術2025年6月号 に
「VCO回路V-f特性の自動スイープ測定器」というタイトルで、
VCOの制御電圧を変えながら出てくる周波数を計るという
回路を載せてもらいました。
これの発端が、
・2019年12月20日:Arduino UNOで周波数カウンタ
・2021年5月1日:Arduino UNOで周波数カウンタ:アナデバの電力計用ICのために
今回のトラ技記事でも、タイマー1(16bit)のインプットキャプチャ
機能で周波数カウント用のゲートを作っています。
しかし、そのキャプチャ周期を1msとして、前回値との差分で
出したカウント値を積み重ねて、周波数としています。
10ms(100Hz)ゲートなら1msを10回。
0.5秒(2Hz)ゲートなら1msを500回。
ゲート時間の基本単位が1msで、好きな周期で周波数が
得られます。
※低周波なら周期計測のほうが良いのですが
それはまた別問題。
アナデバの電力計では、ハードウェアで1秒のゲートパルス
を作りましたが、今回のは1ms=1kHzというATmega328Pでも
出しやすい周波数です。
タイマー1個で作れる
無符号で加算すれば、タイマーカウンタのオーバーフローを
無視して積算することができます。
こんな具合です。
これで、1ms=1kHzのゲート時間を作っておけば、その整数倍で
いくらでも好きなカウント時間に拡張できます。
インプットキャプチャで得られた総パルスから周波数を
求められるので、0.1秒(10Hz)周期で得たカウント値を
この場合は10Hzが最小桁
10回の移動平均しながら処理すれば、1秒ゲートと同じ
最小桁1Hzの周波数が0.1秒ごとにえられます。
周波数の変化を見るとき、1秒待たなくても0.1秒ごとに
動きが分かります。
電力計では1秒のを10回移動平均して、
0.1Hzを読んでます。
最近のコメント