PIC16F182xの濡れ衣晴らし・・・
2016-02-13
直前の記事で「PIC16F182xは周波数カウンタに向いていない
」と宣ったここのブログ主ですが、悔しさ紛れに「PIC16F1938」でカウント実験をしようとソフト改修・・・すると、割込処理にバグを見つけてしまいました
このバグは、丁度クロック周波数の半分のところ(ナイキスト周波数)でカウントが頭打ちとなり、それ以上のカウントが上手くいかない・・・という風に見える、ある意味絶妙な不具合。それも、C言語として2行の処理順序が逆というだけのもので、端から疑ってもいなかったところでした。嗚呼、昔取った杵柄(こう見えても、昔はバリバリの制御系ソフト開発者)は何処・・・
そして、そのままPIC16F1938で実験を続けたら、ひとまず20MHzを超える周波数をきちんとカウントできることを確認するに至り、「ここはPIC16F182xに掛けた濡れ衣を晴らさないと、全国のPICを愛して止まない方々、特に『拡張ミッドレンジ最高
』と偏愛されておられる方々からお叱りを受けてしまう
」と反省し、できる限りきちんと実験をやり直すことにしました。
実験自体は至極簡単です。PICで周波数カウンタを作成する場合、上限周波数に近づくと「取りこぼし」が発生するため、実際に測定した周波数よりカウントされる周波数値が下がります。そこで、発振周波数が判るようなSGや別の校正された(測定周波数が信用できる)周波数カウンタがあれば、この「差」を監視し、もし測定周波数が下がってきたらそこを「上限周波数」とすればよいことになります。
以下の実験は、VDDは5VでPICのクロックを外部の「12.8MHzTCXO」から供給し、Timer0またはTimer1でどこまでカウントするかの調査になります。
まずはPIC16F1827。このPICでは、PICの外部クロックとTimer1が別のポートで制御できるため、Timer1を使っての実験。毎度のナンチャッテ・スナップにしてみました。

以前に手に入れた中華DDSを被測定対象としていますが、この発振周波数の校正は、現時点で我が家の「周波数測定基準」となっている「心臓部を改良してイケてる筈の中古カウンタ」で校正してあります。15.6MHzまでの低い周波数では、スナップのように「+1Hz」と「±0Hz」辺りで安定します。さらに100KHz上げると・・・

こんな風に数Hzの取りこぼしが生じます。これは、周波数を上げれば上げるほど顕在化します。このように、取りこばしが生じ始める周波数を「最高周波数」として調査したのが今回の実験です。
さぁ、この調子で調査した結果を以下に示します。
実験1:PIC16F1827 Timer1測定で15.6MHz
実験2-1:PIC16F1829 Timer0測定で15.0MHz
実験2-2:PIC16F1829 Timer0測定で15.3MHz
※実験2は、2つのPICの個体差を確認した
そもそも、Timer0と1ではカタログスペックが違います。参考にPIC16F1829のデータシートから抜粋。

このスペック(赤囲みの部分)から、Timer0をうまく使うと50MHz(20nsの場合)、Timer1なら約16.6MHz(非同期設定で60ns)をひとまずの目安と考えるわけですが、どうもそうではないよう・・・かと言って、ここのブログ主がほざいた「6.5MHz限界説」よりは上の方まで大丈夫なことは明白ですね。そして、PIC16F1938のTimer0の実測値は以下のようになりました。
実験3:PIC16F1938 Timer0測定で24.1MHz⇒20.8MHz
ブレッドボードのバラック実験ですから、きちんと基板に押し込めばもう少し個々の実験結果より高いところまでイケそうですが、少なくとも「ポピュラーな拡張ミッドレンジ8ビットPICで周波数カウンタを作成する際の目安」にはなりそうです。これでひとまず「濡れ衣」は晴らしたことにして下さい
補足 2016.02.27
この実験では、PICのカウンタ入力の前に簡易な1石のアンプ(2SC1906使用、固定バイアス)を置きました。また、中華SGの出力は50Ω終端で-8dBm程度ですが、このアンプとの整合は全く取れていません。もう少し大きい信号を入力すれば、さらに高い周波数まで特性が伸びるかも知れませんが、12.8MHzクロックで走るPICにC言語の組み合わせでは別の問題(カウント部のオーバーラン等)が出てくる可能性があります。カリカリのアセンブラ・チューン・・・そこまでの必要がないため、今回の実験結果は「お手軽C言語で作る場合の参考」という形で終えています。
修正 2016.02.27
実験3の24.1MHzという結果は、実は入力ピンの浮遊容量をキャンセルして高周波特性を少しでも伸ばすべくショットキーダイオード(1SS106)を入れたものであったことを思い出しました。実験1,2はこれを施していなかったため、今日改めて単純なショートの形で測定し直したら、測定限界が20.8MHzとなりました。
このダイオードで浮遊容量をキャンセルする方法ですが、高域は伸ばせるものの低域が犠牲になるようで、さらなる追試が必要・・・気が向いたら実験してみようと思います。


このバグは、丁度クロック周波数の半分のところ(ナイキスト周波数)でカウントが頭打ちとなり、それ以上のカウントが上手くいかない・・・という風に見える、ある意味絶妙な不具合。それも、C言語として2行の処理順序が逆というだけのもので、端から疑ってもいなかったところでした。嗚呼、昔取った杵柄(こう見えても、昔はバリバリの制御系ソフト開発者)は何処・・・

そして、そのままPIC16F1938で実験を続けたら、ひとまず20MHzを超える周波数をきちんとカウントできることを確認するに至り、「ここはPIC16F182xに掛けた濡れ衣を晴らさないと、全国のPICを愛して止まない方々、特に『拡張ミッドレンジ最高


実験自体は至極簡単です。PICで周波数カウンタを作成する場合、上限周波数に近づくと「取りこぼし」が発生するため、実際に測定した周波数よりカウントされる周波数値が下がります。そこで、発振周波数が判るようなSGや別の校正された(測定周波数が信用できる)周波数カウンタがあれば、この「差」を監視し、もし測定周波数が下がってきたらそこを「上限周波数」とすればよいことになります。
以下の実験は、VDDは5VでPICのクロックを外部の「12.8MHzTCXO」から供給し、Timer0またはTimer1でどこまでカウントするかの調査になります。
まずはPIC16F1827。このPICでは、PICの外部クロックとTimer1が別のポートで制御できるため、Timer1を使っての実験。毎度のナンチャッテ・スナップにしてみました。

以前に手に入れた中華DDSを被測定対象としていますが、この発振周波数の校正は、現時点で我が家の「周波数測定基準」となっている「心臓部を改良してイケてる筈の中古カウンタ」で校正してあります。15.6MHzまでの低い周波数では、スナップのように「+1Hz」と「±0Hz」辺りで安定します。さらに100KHz上げると・・・

こんな風に数Hzの取りこぼしが生じます。これは、周波数を上げれば上げるほど顕在化します。このように、取りこばしが生じ始める周波数を「最高周波数」として調査したのが今回の実験です。
さぁ、この調子で調査した結果を以下に示します。
実験1:PIC16F1827 Timer1測定で15.6MHz
実験2-1:PIC16F1829 Timer0測定で15.0MHz
実験2-2:PIC16F1829 Timer0測定で15.3MHz
※実験2は、2つのPICの個体差を確認した
そもそも、Timer0と1ではカタログスペックが違います。参考にPIC16F1829のデータシートから抜粋。

このスペック(赤囲みの部分)から、Timer0をうまく使うと50MHz(20nsの場合)、Timer1なら約16.6MHz(非同期設定で60ns)をひとまずの目安と考えるわけですが、どうもそうではないよう・・・かと言って、ここのブログ主がほざいた「6.5MHz限界説」よりは上の方まで大丈夫なことは明白ですね。そして、PIC16F1938のTimer0の実測値は以下のようになりました。
実験3:PIC16F1938 Timer0測定で24.1MHz⇒20.8MHz
ブレッドボードのバラック実験ですから、きちんと基板に押し込めばもう少し個々の実験結果より高いところまでイケそうですが、少なくとも「ポピュラーな拡張ミッドレンジ8ビットPICで周波数カウンタを作成する際の目安」にはなりそうです。これでひとまず「濡れ衣」は晴らしたことにして下さい

補足 2016.02.27
この実験では、PICのカウンタ入力の前に簡易な1石のアンプ(2SC1906使用、固定バイアス)を置きました。また、中華SGの出力は50Ω終端で-8dBm程度ですが、このアンプとの整合は全く取れていません。もう少し大きい信号を入力すれば、さらに高い周波数まで特性が伸びるかも知れませんが、12.8MHzクロックで走るPICにC言語の組み合わせでは別の問題(カウント部のオーバーラン等)が出てくる可能性があります。カリカリのアセンブラ・チューン・・・そこまでの必要がないため、今回の実験結果は「お手軽C言語で作る場合の参考」という形で終えています。
修正 2016.02.27
実験3の24.1MHzという結果は、実は入力ピンの浮遊容量をキャンセルして高周波特性を少しでも伸ばすべくショットキーダイオード(1SS106)を入れたものであったことを思い出しました。実験1,2はこれを施していなかったため、今日改めて単純なショートの形で測定し直したら、測定限界が20.8MHzとなりました。
このダイオードで浮遊容量をキャンセルする方法ですが、高域は伸ばせるものの低域が犠牲になるようで、さらなる追試が必要・・・気が向いたら実験してみようと思います。
- 関連記事
-
- チープなユニバーサル基板でも・・・
- 高速カウンタに翻弄された一日
- PIC16F182xの濡れ衣晴らし・・・
- PIC16F182xは周波数カウンタには不向き!?
- 糠喜びだったかも・・・T1CKI の動作周波数