前回の続きです。
測定した周波数がばらつく原因調査でしばらく試行錯誤を繰り返してはまってしまいました。
まず、ACラインからフォトカプラで信号をとっていたので、どこからノイズがまぎれこんだのか?など考え、オシロで波形をチェックしますがおかしなところはありません。オシロの周波数測定機能で測っても安定しています。
じゃあ、より安定な信号をだせるDDS信号発生器に信号源を変えて、同じように測定してみます。が、同じように測定される周波数は安定しません。さすがに水晶振動子を基準に動いているDDSがこんなに安定しないわけはないので、ソフトウエアの問題だなと気づきます。
そこからまた、どこがおかしいのか解らずしばらく悩んでいましたが、測定された値にある傾向があったことからやっと気づくことができました。
タイマーの構成とタイミングチャートで説明したいと思います。
レシプロカルのタイマーの構成はこのような設定にしていました。

TIMER1のスタート/ストップはTimer2のからの信号でコントロールしており、Timer2がスタートしたときに同時にスタート、Timer2がストップしたときに同時に終了する設定です。Timer2は被測定信号の立ち上がりをカウントし、ARRレジスタに設定した値(ここではNとします)までカウントしたらタイマーがストップします。
Timer1は基準クロックをカウントしており、カウンタの値からTimer2が動いていた時間=被測定信号Nパルス分の時間が計測できているという算段です。
タイミングチャートはこんな感じになりますが....

問題ないと思っていましたが、よく見るとおかしなところがありますね。
そうです、Timer2がイネーブルになってから被測定信号の立ち上がるまでの空白時間があることにやっと気づきました!(チャートで青色にした部分)測定信号は全くランダムに入ってくるので、最悪半周期分の空白時間が存在することになり、その間にも基準クロックはカウントされていくので、真の値よりもより多くのパルスがカウントされ周波数が真値からずれることになります。
原因がやっとわかったので、すぐに修正できるかと思いましたが、タイマーを自在に動かせる力量がないので、STMicroの分厚いデータシートのタイマーの部分を1〜2週間読み込み、最終的には
http://radiokot.ru/forum/viewtopic.php?p=1495961#p1495961
を参考にさせていただき、やっとまともに動くものができました。
まずタイマーの設定は以下のように修正します。修正箇所が赤字にしてあります。

修正箇所はTimer2のみになりますが、まずTimer1を動かすトリガ信号はOC1REFにします。OC1REFが1になっている間だけTimer1が動くことになります。動作モードはPWM2モードに設定し、最初の被測定信号パルスが入カされカウンタが1になったときOC1REFが1になりTimer1もスタート、カウンタの値がARRレジスタに設定した値NになったときにOC1REFが0、Timer2もTimer1もストップします。
タイミングチャートはこんな感じ。

最初のブランク時間がなくなり、Timer1の動作が被測定信号の立ち上がりにきちんと同期するようになりました。
ACラインの周波数を測定してみましたが、かなり安定してました。(写真1枚じゃ安定度はわからないですね)±0.05Hz以内には変動はおさまっています。世の中の電力消費量にもよると思いますので、この原稿を書いている深夜だと安定してるのでしょう。完成したら、昼夜の周波数変動の差があるかなどみてみたいですね。

やっているうちにもう少し深掘りしたくなってきました。次回は測定精度について考察したいと思います。