PSoCで電波時計を作ろう
by K.I
2005/03/01〜07/31
Index
- PSoCデザインコンテストの、 Wim_Hendrikseさんの電波時計はちょっとびっくりした。
- ラジオはかなりゲインがなきゃダメなはずだし、普通に考えるとSCFではノイズが大きくてとても使えないと思うよね。
- でも実際に作ったんだから凄い。PSoCを弄り始めた大きな理由の1つになった。
- 最初はデジタル部分の理解するのにも時間が掛かったし、アナログは全く苦手だし。
- でも、いろいろ弄っていて、ようやく基本的なところが分かって来たかも。
- まだまだ分からないことが多いけど、そろそろ挑戦して見よう。
[top]
PSoCのPGAを使えば、最大×48(33dB)の増幅が出来る。
単純に×48のPGAを2段でやってみたら、どうなるんだろ?
いわゆるストレートラジオだよね。
- ほぼ5Vフルスイングで、四十数kHzの波形が出力された。
- 結構、振幅の変動がある。これが、電波時計の信号なのか?
- いろい弄っていると、、あれ、配線変えてないのに信号がはっきりした。変動も無くなった。
→なんか変だな〜
- でも、信号がはっきりし過ぎてる感じ。うーん、これは発振してるのかも。。考えてみると増幅率ありすぎだもんね。
→増幅率を下げると振幅が0.4Vp-pぐらいと急に小さくなったけど、波形が見えてきた
- 2段目の増幅率を×24にしてみると、1/2にしただけなのに出力が極端に小さくなる。
- このまま、単純に増幅率をあげることは難しそうだ。
それに、こんなに目茶苦茶に信号が混ざった状態では電波時計の信号を取り出すなんて無理だ。
- とりあえず、40kHzのBPFを掛けてみることにしよう。
- BPF1段では、変わらないというより却って見た目は悪くなっている様にもみえるが、周波数が40kHz程度に収束しているのが分かる。
- BPF2段になると、はっきり波形が見えてくる。この状態だと秒間隔で波形が変動しているようにみえる1。
但しPSoCでは、2段のBPFの後にPGAを接続出来ないみたいなので、出力電圧は小さくなっている。
- と思ったが、PSoCの仕様書の アーキテクチャの図を見ていて気が付いた。
- 一度I/O出力して、改めて入力すればPGAに接続出来るんだ。
- 接続の仕方は分かったので、結構自由に増幅出来るようになったけど、、
- いろいろやってみたが、このまま増幅すると結局は発振してしまうみたい2。。。
1本当に秒単位かどうかは、はっきりしないけど。
2頑張って調整すれば何とかなるかもしれないけど。
[top]
うーん、難しいなぁ。良く分からない。。
- でもSCFのモジュレーションの機能で入力を切替えるというのは、原理的にはDBMと同じように見える。
- foをf1で切替え(反転)させると、結局入力の和と差が出てくることになる。(はずだ)
- f0+f1と f0-f1、但し、f1>f0の時は f1-f0
Wimさんの電波時計の資料を参考に構成を考える
- PSoCのSCFを使って2回ヘテロダインを掛ける。
- ECOで32.768kHzの水晶発振、内蔵PLLで24MHzのシステムクロックを生成。
この際、構成をちょっと変えようと思ったんだけど、意外と配置に制限があって難しい。
- 2つのBPFには、違うクロックを設定する必要がある。
- BPFとBPFの間にPGA等を挟むのは難しい。
中間周波数って、どれぐらいが適当なんだろう。
- でも1段目のBPFの周波数は、サンプリング周波数で決まるので、そんなに細かく選べない。
- 単純に作れる1/16分周から7,558Hzとした。
- 40,000Hz-32,414Hz(740分周)=7,586Hzで良いかな。
- 2段目はよくわかんないので、てきとーに130Hzにすることにした。
- 7,558Hz-7,688Hz(3120分周)=130Hzだ。
- PGAで48倍に増幅(+33.6dB)
- 周波数変換(32,414Hz)、BPFを通してイメージを除去(+6dB)
- 再度周波数変換(130Hz)、BPFでイメージ除去(+4dB)
- コンパレータで、レベル検出
全体で、43.6dB(約150倍)程度だが、ちょっとゲインが足りないか?
- 1段目は、それなりに周波数変換されているようだが、
- 2段目は、全く出力なし。なんで?
→出力がゼロなので、2段目は写真撮らなかったけど
- ゲインが足りないのかなぁ。それとも、何処かの周波数がずれてる?
もっと、BPFのゲインが取れるようにしたい。
- しかしBPFの特性の調整が面倒だ。というか、なかなか思ったような特性にならない。。。
- PSoCの BPF2計算シートで、GainとBandWidthを調整して、、
- Gainを思ったように上げられない。。
- SCFの定数の決め方の理屈がいまいち分からないなぁ。。。
C1 | C2 | C3 | C4 | CA | CB | Q | gain | dB | OSR |
31 | 4 | 4 | 1 | 32 | 32 | 30 | 248 | 48 | 50 |
28 | 4 | 4 | 1 | 32 | 32 | 30 | 224 | 47 | 50 |
25 | 4 | 4 | 1 | 32 | 32 | 30 | 200 | 46 | 50 |
13 | 4 | 4 | 1 | 32 | 32 | 30 | 100 | 40 | 50 |
6 | 4 | 4 | 1 | 32 | 32 | 30 | 50 | 34 | 50 |
3 | 4 | 4 | 1 | 32 | 32 | 30 | 20 | 26 | 50 |
1 | 4 | 4 | 1 | 32 | 32 | 30 | 10 | 20 | 50 |
| | | | | | | | | |
31 | 4 | 4 | 8 | 32 | 32 | 4 | 31 | 30 | 50 |
28 | 4 | 4 | 8 | 32 | 32 | 4 | 28 | 29 | 50 |
10 | 4 | 4 | 8 | 32 | 32 | 4 | 10 | 20 | 50 |
3 | 4 | 4 | 8 | 32 | 32 | 4 | 3 | 10 | 50 |
2 | 4 | 4 | 8 | 32 | 32 | 4 | 2 | 6 | 50 |
1 | 4 | 4 | 8 | 32 | 32 | 4 | 1 | 1 | 50 |
- うーん、良く分からないけど、簡単に考えれば、
- C1が大きい程、ゲインが大きくなる。
- C4が小さい程、Qが高くなるってことかな。。
- C2,C3をいじると、サンプリング周波数が変わってしまうようだ。
- 面倒だから乱暴だが他は固定で、C1をで調整しよう。
- こんな決め方だと、なんかの特性が犠牲になるかもしれないけど。。。
この考え方で、無理矢理ゲインを上げてみた。
→2重に見えるけど、これはひとつの波形です
- うーん、なんとか出力されるようになったけど、この波形は観測しずらい。
- 周波数が低い上に、振幅の変動が激し過ぎて同期がとれない。。。
- でも、それらしい波形は出てきた。
増幅出来たところで、今度は肝心の信号検出を行わなければならない。
- しかし、コンパレータバス出力を直接見ることが出来ない。実際に信号を見てみないとプログラムを組むのは難しい。
- 困ってしまったが、桑野さんの「はじめてのPSoC」を眺めていると、SPISをゲートの代わりに使うという方法3がコラムに載っていた。
- SPISモジュールを配置して、SlaveSelectInputをLに、MOSIにコンパレータ出力を入れると、MISOから直接出力出来る。
- まぁ、DFFのデータに入れてクロック同期でデータ入力するのと同じような感じかな。
- ちょっと面倒な方法だけど、やっとコンパレータバスを直接見ることが出来た。
→拡大するとコンパレータ出力が分かりにくいので、広い時間範囲で見ている。
- 波形と重なってるし、シャッター時間が長いので見づらいけれど、、
- 一応、波形の振幅が大きい時に波形の上の方にコンパレータ出力が分かる。
- でもこれは、ちゃんと電波時計の信号が出力されてるんだろうか???
- コンパレータ出力を見たら見たで困ったなぁ。こりゃとてもプログラムでデータを検出することは出来そうもない。
3これは普通思い付かない方法だ。よく考え付いたと思う。
[top]
単純にコンパレータ出力を処理しようと思ったんだけど、信号が本当に正しいかどうかは置いといても、かなり難しそうだ。
ここでWimさんのやり方を見てみると、結構難解で複雑な方法を取っている。
- Timer8モジュールによる、1/128秒間隔のタイマ割込み。
- さらにCMPPRGモジュール出力のコンパレータバスにより割込みを掛ける。
- ALT_CRxビットにより正弦波が上昇時と下降時の割込みを切替えて発生させる。
- 正弦波の上昇から下降までの時間を測定することで、間接的に信号強度を求める。
- 信号の下降時の基準値を減少させることにより、ヒステリシスを持つようにする。
- 求めた時間にデータ処理でフィルタを掛ける。いわゆるデジタルフィルタってやつだろう。
- 上記の時間つまり信号強度を、PGAのゲインとSCFのC1の値でフィードバックして調整
- CMPPRGによる割込みで、1/128秒毎にUpされるタイマをクリアする。
- つまりタイマ割込み時に正弦波信号が上昇してからの時間を知ることが出来るので、これをヒストリバッファ(おそらくはシフトレジスタ)に記録する。
- ヒストリバッファの最後の3ビットで、データ状態の判断を行う。
簡単に、訳すとこんな感じかな。分かったような、分かんないような。。。
何で、こんなに面倒なやり方4をしているんだろう。
- ヘテロダインの出力はアナログ信号というだけでなく正弦波出力なので、単純にコンパレータで処理しただけでは、信号強度を求めることが出来ないということか。。。
- ゲインのコントロールはやっぱり必要ってことなんだろうか。
- でも、C1の値でゲインをコントロールするというのは、自分の考えた方法と同じなのでちょっと嬉しい。
でも、この手順の実現方法が良くわからない。特にコンパレータによる割込み
- 立上りから立ち下がりまでの時間の算出方法は?
- ALT_CRxビットで、コンパレータバスの出力を何とか出来るの?これってデジタルのバスのコントロール用じゃないのかな。
- コンパレータってヒステリシスの設定出来るのかな。。
- あれ、考えてみると、そもそもコンパレータバスでの割込みはどうやってやるんだろう。。。
- それに、最後のデータ判断のやり方がいまいち分からないなぁ。
PSoCの割込みって
- Reset
- Supply voltage monitor
- Analog column 0〜3
- VC3
- GPIO
- デジタルブロック00〜13
- I2C
- Sleep timer
これだけ?
そういえば、タイマ割込みってデジタルブロックの割込みなんだよね。GPIOはI/Oポートだし、、
- じゃ残ってる中で、Analog columnの割込みって、何処で掛かるの?
- また結構悩んだんだけど、 このブロックダイアグラムを見れば良いのか。。
- Analog columnでコンパレータバスの割込みを受けるんだ。。
- ALT_CRxはコンパレータ用のLUTで、RDIxLTxがデジタルブロックの出力のLUTか。→これは単純にちょっとゴッチャにしてた。
コンパレータの割込み設定を、動的に変化させればヒステリシスを持たせることが出来るかもしれない。
- つまりコンパレータを設定して立上りの割込みを受けたら、ALT_CRxで割込みを立ち下がりで受け付けるようにして、コンパレータの値を少し下げる
- 立ち下がりの割込みを受けたら、ALT_CRxとコンパレータの値を元に戻す。
多分、こんな風にやってるんじゃないかな。
コンパレータ出力は不連続なので、このままではデータを取り出すことが出来ない。
最後のデータ判断の方法が、なかなか理解出来なかった。
- 良く考えると、元々の回路では最終的な出力周波数は、180Hzとか166Hzだからタイマ間隔の1/128秒とほぼ同じ。タイマ間隔の方がちょっと速いぐらいだ。
これを基に考えてみた。
- CMPPRGによる割込みで、1/128秒毎のタイマでUpされるカウンタをクリアするのだから、
- 出力がある閾値以上であればカウンタは、1にカウントUp後すぐ0にクリアされる。
- 出力が閾値以下であれば、カウンタは1以上になるはずだ。
このカウンタ値を直接見るだけでは、閾値以上でも1になることはある。
で判断出来るはずだ。
立上りから下がりまでの時間を、振幅の見做してPGAやBPFのゲインをコントロールしている。
- しかし、立上りから下がりまでの時間はどうやって求めるんだろう?
- タイマのカウンタ値をチェックするしかないか。。。
- タイマとコンパレータ割込みは無関係だから、前回の値と比較しないとダメかな?
- 立上り時にタイマのカウンタをクリアしたら? →結局は同じことか。。
うーん、多分タイマカウンタをチェックすれば良さそうだ。
- resolutionが 1/32768秒ということなので、タイマのクロックが32.768kHzで、Periodが128ってことかなぁ。
- ここで、Wimさんは平均を求めるのに以下の式を使ってる。
- あれ、どこかで見たことがあるような。。差分方程式で書いてみると、
- あぁ、これはαを1-αに置き換えれば、 RCのローバスフィルタと同じ式だ5。
- つまり簡単なローパスフィルタを通して、平均を取ってるわけか。。。
でも受信した信号は雑音だらけなので、このままでは使い物にならない。
- ヒストリバッファに入れて3ビットで判断するというのは、おそらく以下のような回路6になるんじゃないかなと思う。
- このシフトレジスタを1/128秒間隔のタイマでシフトさせれば、3ビット以上、0或は1が連続しない場合は雑音として除去される。
- ここまで来て、やっと最終周波数の決め方が分かった。
- つまりヘテロダインの最終周波数は、タイマの128Hzより大きくする必要がある。
- でも出力は少なくとも最終周波数付近の雑音は含むので、必要以上に大きくしない方が良さそう→タイマ周波数の倍の256Hzよりは小さくする。
分からなかったので適当に130Hzにしたけど、ちょっと小さかったかな?
- 128Hzのタイマと、変に同期すると雑音除去しても3ビット以上の不定部分を拾ってしまうかも。。
- 元々の、166Hzとか180Hz程度にしておくべきだったなぁ。。。
- でも随分悩んだけど、やっと全貌が分かって来た気がする。
4この解釈が正しいかどうかは保証出来ないけれども。。
5全然関連なく勉強したことが役に立ったりするんだなぁ。
6実際はソフトでやるんだけど。
[top]
まず、以下のようなレジスタを用意する。これはソフトウェア上の変数になる。
- 閾値判断用の 閾値カウンタ
- 雑音除去用の ヒストリレジスタ
- 信号立上り、下がり割込み判断用の 立上りフラグ
- 立上り時のタイマ値を記録する 立上り値レジスタ
ここまでは、PSoC Designerによるモジュールの配線と設定、プログラムはスタート処理ぐらいだったが、割込み処理部分は、さすがにプログラムで記述しなければならない。
- CMPPRGモジュールを、信号の立上り、下がりでヒステリシスを持って割込みさせる。
- 立上りではVDDとAGNDのちょうど中間で割込み、
- 下がりではAGND付近で割込みさせる。
コンパレータ割込みの動作は、
- 立上りフラグがTrueなら
- 閾値カウンタをクリアし、AnalogLUTを反転、RevValueを低め(0.021)にセット。
- さらにタイマ値を立上り値レジスタに記録
- 立上りフラグがFalseならば
- AnalogLUTを正転として、RefValueを高め(0.5)にセット。
- 立上り値と現在のタイマ値から、立上りから下がりまでの時間を求める。
- これで平均を求めて、ゲインをコントロールすれば良い
- 結果的に、ヒステリシス・コンパレータのように動作する。
→ヒステリシス・コンパレータは意外と簡単に実現出来た
でも、ゲインコントロールは後回しだな。
- Timer8モジュールを、TerminalCountOutで割込みさせる
- 最終の出力周波数130Hzに設定したので、タイマ割込みは100Hzぐらいにする。
- UART用クロック 24M/2/8/78=19231 をそのままタイマのクロックとして流用
- Periodを192に設定して、約100Hzで割込みが掛かるようにする。
- タイマ割込みは、簡単に言うと
- 閾値カウンタが0ならば、ヒストリレジスタをセット
- 閾値カウンタ>0ならば、ヒストリレジスタをクリア
- 閾値カウンタを+1して、ヒストリレジスタをシフト
- 3回以上0或は1が続いた時に0或は1と判断する。それ以外は前の状態を保つ。→雑音処理
→撮ったは良いが我ながら分かり難い写真だなぁ
- ヒストリレジスタはシフトレジスタなので、8クロック分遅延している。
- まだうまく復号出来そうもない。移動平均にしてみるか。
- しかし改めて見てみると、入力信号が汚過ぎる。雑音処理にも限界があるよね。
- このままやりたかったが、これは入力信号の見直しが必要みたいだ。入力信号をもう少しなんとか出来ないのか。。
そういえば、WimさんはBPFの定数をどうしてるんだ?
- C1=2,C2=1,C3=1,C4=2って書いてあるけど、、
計算テーブルで、またちょっと計算してみよう。
C1 | C2 | C3 | C4 | CA | CB | Q | gain | dB | OSR |
31 | 1 | 1 | 2 | 32 | 32 | 15 | 500 | 54 | 200 |
20 | 1 | 1 | 2 | 32 | 32 | 15 | 320 | 50 | 200 |
6 | 1 | 1 | 2 | 32 | 32 | 15 | 100 | 40 | 200 |
2 | 1 | 1 | 2 | 32 | 32 | 15 | 31 | 30 | 200 |
1 | 1 | 1 | 2 | 32 | 32 | 15 | 16 | 24 | 200 |
| | | | | | | | | |
31 | 1 | 1 | 1 | 32 | 32 | 30 | 1000 | 60 | 200 |
18 | 1 | 1 | 1 | 32 | 32 | 30 | 576 | 55 | 200 |
10 | 1 | 1 | 1 | 32 | 32 | 30 | 320 | 50 | 200 |
4 | 1 | 1 | 1 | 32 | 32 | 30 | 125 | 42 | 200 |
3 | 1 | 1 | 1 | 32 | 32 | 30 | 100 | 40 | 200 |
1 | 1 | 1 | 1 | 32 | 32 | 30 | 31 | 30 | 200 |
- サンプリング周波数が変わっちゃう(さらに4倍か)けど、これでも行けそうだなぁ。
→クロック系を作りなおし
- これで良いはずだけど、出力が全然出なくなってしまった。。何故?
- そういえば、最初も全然出なかったんだよなぁ。結局、ゲイン調整してるうちに見えるようになったと思うんだけど、違ったっけ?
- 結局、VC1をSysClk/2にして、計算しなおしたら出力が出るようになった??
- うーん、VC1を分周無しにすると、何か問題あるのかしらん?
- でもこの係数だと、かなりゲインが取れるみたいだなー。信号がきれいになるという訳ではないんだけど。。
- しかし、もっとはっきりとした秒信号を取り出したいなぁ。。。同調回路が悪いのかなぁ。
- やっぱり、デバッグのために平均値を確認しておきたい。
- UARTモジュールを付けておこうか。→でも、もう一個しか入らないので、TX8モジュール(出力だけ)にする。
- クロックはどうしようか。→bitクロックの×8のクロックが必要だけど、もうデジタルモジュールが余ってない。。。
- VC1ディバイダが1/2、VC2が1/8 だったので、VC3を1/78に設定して、24M/2/8/78/8=2403で、2400bpsのクロックになる。
これで、シリアルポートでデバッグ出来るようになった。(はずだ)
- でも、以前作ったRS232C用のアダプタが見つからない。。困ったなぁ。
アダプタが見つからないので、暫くやる気を無くす。。。
- 気を取り直して、LCDモジュールを付けることにする。
- LCDはソフトモジュールだから、デジタルブロックが一杯でも追加可能だ。
- ポート2に接続することにして、データシートの通りに設定。
でも、今度は出力が出なくなってしまった。
- BPFのアナログ出力も、タイマ割込みでのコンパレータ出力も両方ダメだ。→何故?
- おまけにPSoCのチップがかなり熱くなってる。長く触ってると火傷しそう。うーん、壊れたのかなぁ。。。
また、暫くやる気を無くす。
- 気を取り直して、Designerの配線を眺めてたらアナログ出力の配線が消えてる。どうして?
- LCDの接続ポートを、いじった時に切れたのかな? それとも、DynamicRe-configurationの設定を試してた時か?
- 本当にそれで消えるかやってみたけど、再現しない。。もう熱くなくなったし、まぁいいや。
- BPFの出力が、またちゃんと出るようになった。
- でもタイマ割込みで出るはずのコンパレータ出力が出てない。
- 出力ポートの設定が消えてる→Strongに設定する→出ない→暫くやる気を無くす。。。
- 結局、boot.asmが書き換わって割込みベクタが消えてました。
- おかしいなぁ。ちゃんとboot.tplを書換えてあったんだけどなぁ。
- タイマのブロックじゃなくて、間違えて違うブロックにベクタを書いてた。。。
- コンパレータ出力が出るようになったので、LEDが接続されてるポートにも並列に出力を出してみることにした。
- またBPFの出力とコンパレータ出力が変になったよ。。何故だ?→暫くやる気を。。あ"〜もぉ〜なんだよこれ。
- ポートの設定がいつのまにかStrongになってる。変更するような操作を全然していないのになぁ。うーん、不思議だ7。。。
疲れた。。。。。
- LCDが使えるようになったので、早速タイマのカウント値を確認してみよう。
- DBB01DR0が、タイマのカウンタのはずなので、コンパレータの立上り検出時にその値を記録し、表示してみた。ところが常に0になってる。何故だ?
For the Timer, Counter, Dead Band, and CRCPRS functions, a read of the DxBxxDR0 register returns 00h and transfers DxBxxDR0 to DxBxxDR2.
- DR0の説明を読むと、0を返してDR2に移動する?ってことで、DR0を読んですぐDR2を読んでみる。確かにそれらしい値が入ってるけど。。これで良いのか? 変なの。
- 数値だと分かり難いので、バーグラフにしてみる。まぁ、それらしいねぇ。
LCD_1_InitBG(LCD_1_SOLID_BG);
LCD_1_DrawBG(1,0,16,rising_time/4);
タイマモジュールはCaptureがHになると、その時のカウンタ値がCompareValueにコピーされるという仕様だったと思うけど、その所為かなぁ。
カウント値は直接読めないのか?ちょっと変だけど、それらしいから良いか。。PSoCは、いろいろ変だからね。
タイマのカウント値を目安にPGAとBPFのゲインをコントロールしてみる。
×48 → 0Ch
×24 → 1Ch
×16 → 08h
×8 → 18h
×5.33→ 28h
No | PGA gain | BPF C1 |
0 | ×1.14 | 1 |
1 | ×1.23 | 3 |
2 | ×1.33 | 5 |
3 | ×1.46 | 7 |
4 | ×1.60 | 9 |
5 | ×1.78 | 11 |
6 | ×2.00 | 13 |
7 | ×2.27 | 15 |
8 | ×2.67 | 17 |
9 | ×3.20 | 19 |
10 | ×4.00 | 21 |
11 | ×5.33 | 23 |
12 | ×8.00 | 25 |
13 | ×16.0 | 27 |
14 | ×24.0 | 29 |
15 | ×48.0 | 31 |
- 適当なテーブルだが、まぁこの組合せを適当に調整すれば何とかなるだろう。
- タイマのカウント値は変動が大きいので、そのままじゃ使えない。
- 普通は移動平均を掛けたくなるが、ここはWimさんの方法でやってみる。
- この式、つまり以下のようにすれば良い。
average = average - (average>>5) + (timer_count>>5);
おぉ、バーグラフの変化がおとなしくなった。ちゃんとローパスフィルタになってるね。
- 数値的には185〜220ぐらいか。。計算上は幾つぐらいになるんだろ?
出力周波数が180Hzでタイマのクロックが32,502Hzだから、180Hzの半周期分/32,502Hzの1周期ということで最大でも90ぐらいのはず。あれ?変だなー。がっくりして寝る。
次の日、改めて見直してみる。あっ、タイマってダウンカウントじゃん。
- 計算式を逆に直してみる→数値で40〜66ぐらいになった→まぁ、こんなもんか。
- 現状は、ちょっと飽和してる感じなので、抑え気味にした方が良さそうだ。
- 20以下ならゲインを上げ、40以上ならゲインを下げるってことで良いかなって簡単に考えたけど。。。
- すぐゲインが最低になって、コンパレータの割込みが掛からなくなってしまう。
- 前述のテーブルは変化が大き過ぎる。PGAを固定、さらに1つめのBPFのゲインも固定、さらにテーブルを書換えて、ゲインが必要以上に落ちないようにしても、ゲインが最低で張りつく。
- 判定値を50〜60程度にすると、ゲインが最大、或は最低に張りつくのを繰り返す。
- C1じゃなくて、PGAのゲインのコントロールにしてみた。すこし変化が緩やかなので、ちょっとマシになったが、たいして変わらない。
- うーん難しい。すんなりフィードバック出来ない。→変動が大き過ぎるからかな。
- ゲインコントロールによって、さらに信号が取り難くなっている気がする。。
- うまく行かないのは、タイマカウント値がデータのピーク値と比例している訳じゃないってことがあるかも。
- AGCは簡単だと思っていたけど、いろいろノウハウがありそうだ。
- まぁ、これだと信号が飽和しないようにコントロールするぐらいにした方が良さそうだ。
- どうも復号出来そうもないので、波形整形で何とかならないか試してみたが、それらしい波形にならない。
- ゲインコントロールすれば、というのが最後の望みだったが、良くならないなー。
最初から雑音を増幅してるんじゃないかという不安はあったけど、欲目で少しは信号が混じっているかもっていう期待は結構ある。
- 最後の手段8で、実際の電波時計の波形と出力波形を比べてみた。
- ゲインは適当に調整して固定。下が電波時計の波形ね。
- うーん、変動の雰囲気はそれらしいけど、どうみても電波時計の信号が含まれてるとは思えないなぁ。
- 未練があったんだけど、比べてみると誤魔化しようもなくダメだ。これで諦めがついた。
- ところが、この波形はロジックアナライザ(カメレオンUSB)なんだけど、これを接続すると明らかに波形に変化が出る。
- 本当の波形じゃないかもしれない。。。うーん、何が正しいんだろ。でも繋がない状態で、目で見比べてもやっぱり秒信号とは言えない感じだな。。。
7考えてみると、PSoCデザイナを弄ってるとこういう訳の分からない不思議なことが良く起こる。気のせいかと思ってたんだけど。。
8面倒だったってこともあるけど、もう少しキレイに整形してからっていうことで、なかなか出来なかったんだよね。
[top]
このままでは埓があかないので、構成を変えることを考えよう。
いままでのプログラムは残しておいて、構成を変えたものを作ってみるか。
- CloneProjectで、プロジェクトをコピーして、コンパイルするとエラーになってしまう。
- 何度もやりなおしたが、全然ダメだ。
- Windowsのファイル名が8文字以上でおかしくなっているようで、エラーメッセージ中のファイル名が良くわからない。
- プロジェクト名を8文字以内にすれば、エラーメッセージ中のファイル名が見れるようになるだろう。→radioclock3をrclock3と短くしてみた
- あれれ、今度はちゃんとコンパイル出来た。。。
- あぁ、そうか。Cloneの時は8文字より長いファイルで不具合があったのか。。
- うーん、こんなことでまた数日は無駄にしたよ。。。
最初に40kHzのフィルタを通したらどうだろう。
- 40kHzのフィルタって、前やった時のパラメータどうしたんだっけ?
C1 | C2 | C3 | C4 | CA | CB | Q | gain | dB | OSR |
1 | 4 | 4 | 1 | 32 | 32 | 30 | 8 | 20 | 50 |
4 | 4 | 4 | 1 | 32 | 32 | 30 | 32 | 30 | 50 |
13 | 4 | 4 | 1 | 32 | 32 | 30 | 104 | 40 | 50 |
31 | 4 | 4 | 1 | 32 | 32 | 30 | 250 | 48 | 50 |
1 | 1 | 1 | 1 | 32 | 32 | 30 | 32 | 30 | 150 |
3 | 1 | 1 | 1 | 32 | 32 | 30 | 96 | 40 | 150 |
- 40kHzはx50の方が良いようだ→x150はいまいちグラフが一致しない。。
→こんな構成はどうかな?
ここで、またちょっと嵌まってしまった。
- この構成だと、1/3と1/4のクロックを作ることになる。
- VC1で1/3を作ると、VC2では1/4は作れない。
- VC3では1/4を作れるけど、VC3はアナログクロックに繋ぐことが出来ない。
- 仕方がないので、VC3ソースをSysClk/1として分周無しで、PWMで1/4にしてBPFのクロックとした。
ところが、BPFの出力が出ない。。クロックが供給されていない感じ。
- それじゃということで、VC3をSysClk/4にして、DigInvやDigBufの入力に接続。そのデジタルブロックをBPFのクロックに接続してみた。
- これもやっぱり、同じ結果だ。。。DigInvとかDigBufの出力はデジタルブロック全体の出力にはなってないのか?
- 改めてPWMの仕様を見直してみる。ClockSyncの説明を見ると、どうも入力クロックによって、ClockSyncの指定を変える必要があるように見える。
- SysClk/1ならば、ClockSyncはUseSysClkDirectにする必要がありそうだ。
変更してみると、ようやくBPFが動作するようになった。ふぅ。。。
もう一つ、つまらない事で嵌まったので、ちょっと書いておく。
- モジュレーションしてから、BPFを通す回路をいろいろ試していたが、1つだけ出力が全く出ないものがあった。
- 回路は、PGA→32.5kHzMod→7.5kHzBPF→7.68kHzMod→180HzBPF
- PGA→32.5kHzMod→7.5kHzBPF→7.5kHzBPFの回路では、ちゃんと出力されていた。
- それなら7.68kHzのモジュレーションを止めて、BPFのサンプリングクロックを同じにすれば、同じになるはずだ。
- 半波整流っぽい出力が出てきた。
- 2つめのBPFの入力をInverting→NonInvertingに変更。完全に飽和したような波形になる。
あれ、SCFを直列に繋ぐのはInvertingで良いと思うんだけど。。。
- 良く見ると飽和した時とレベルは大差無い。半波整流っていうよりパルスが鈍ってるのか?
元に戻して考え直す。
- 180HzBPFのQを1に近づけてみる。これだと7kHz付近でも0dBだからモジュレーションの波形が見えるはず。
- 波形見えず。モジュレーションの波形がおかしい?
- でもレンジを下げてみると、へんなパルス状の雑音が見える。
- モジュレーションはGOE1なので、簡単に出力出来るので見てみると、パルス状になってる→初めから此処を見るべきだった。
- 結局、PWMでTerminalCountOutを出力していた。。。
これで気が付くのに時間が掛かったのは、
- 32.5kHzのモジュレーションはTerminalCountOutでも動いていた。
- これは周波数が高かったので、とりあえず動いていただけだと思われる。
- モジュレーションはXORみたいな回路だから、これが変でも出力は出そうな気がしていた。
- 実際の信号は小さいので、モジュレーションが無いとBPFの周波数にならないので、増幅されず、結局出力されることはない。
- パルスがBPFを通ると、別のものに見えてしまったりする。
- 以前やったものを見直してみると、ちゃんとConpareOutを使っている。
- そういえば、最初に同じような間違いをして、直した覚えがあるなぁ。。。
つまらない間違えだけど、2回やったので記録として残しておこう。
いろんな構成で、最初からやり直してみた。
- PGAx8→PGAx8
- PGAx4→40kHzBPFx100→PGAx4
- PGAx8→40kHzBPFx30→40kHzBPFx100
- PGAx8→40kHzBPFx250→32.5kHzMod→7.5kHzBPFx300
- PGAx16→32.5kHzMod→7.5kHzBPFx1000→PGAx8
- PGAx16→32.5kHzMod→7.5kHzBPFx300→7.5kHzBPFx300
- PGAx16→32.5kHzMod→7.5kHzBPFx1000→7.68kHzMod→180HzBPFx1000
増幅率は最大にすると簡単に発振、少なくとも飽和するので、そうならないように適当に調整している。
- やはり、ヘテロダインにすると増幅率を上げても発振し難いことが良く分かる。
このいずれの構成でも、秒毎の変動は殆ど感じることが出来ない。うーん何故だ?
- 最初にやった時は、確かに秒間隔(感覚?)の変動があったよなぁ。(多分。。)
同調回路を調整しなおしてみるか。。
CQ出版の HAMjournal No.104、 40kHz発信器を利用した同調容量の確認という記事を参考にしてやってみた。
同調回路の調整用に40kHzの矩形波発振器を作る。
- 発振器出力を、10kΩの抵抗を通して同調回路に接続し、オシロで波形を観察する。
- 容量をトリマで調整してやると、共振点できれいな正弦波になるという仕掛けだ。
- トリマが無いから調整出来ないよなぁ。まぁ、とにかくやってみよう。
- 最初、本のように10MHzのオシレータを分周して作ろうかと思ったけど。。
抵抗ドライブで出来ないかなぁ
そういえば、同調回路はPSoCに接続されている。
- 抵抗ドライブ(5.6kΩ)でH,Lに交互に引っ張ってやれば、配線はそのままで調整出来るんじゃないか?
- 但し、残念なことに抵抗ドライブは片側だけなので、割込みとか使わないと無理そうだ。
- 設定は、DM2,DM1,DM0にそれぞれ、000でLは抵抗ドライブ、011でHは抵抗ドライブになる。
- でも仕様上、それぞれ逆方向に直接ドライブされてしまう。。。
- ダメかなと思ったけど、010がハイインピーダンスなので、それを経由すれば可能かもしれない。
・Port0_6を抵抗ドライブで反転させる試作プログラム(失敗)
PRT0DM1 |= 0x40;
PRT0DM0 &= 0x40; →出力をハイインピーダンスに
PRT0DR ^= 0x40; →データ反転
→データに合わせて抵抗ドライブを再設定
PRT0DM0 = (PRT0DM0 & ~0x40) | (PRT0DR & 0x40);
PRT0DM1 = (PRT0DM1 & ~0x40) | (PRT0DR & 0x40);
- 良い考えと思ったんだけど、実際にやってみると、ポート設定には時間が掛かるようで、40kHzでは駆動出来ない。
- アナログ入力と共用ではダメかもと思って他のポートでやってみたが、やはりダメ。
- せいぜい数kHzぐらいまでしか駆動出来そうもない。
- ハイインピーダンスにしてから改めて設定してるし、条件分けしてないので冗長になってるから、もう少しは速くなると思うけど。。。
素直にPWMで作ろう
まぁ、素直に他のポートから40kHzを出して、抵抗で繋ぐしか無いか。。。
- PSoCなら、PWMでシステムクロックの1/600を出力するだけだ。プログラム不要、超簡単!
- と思ったんだけど、全然波形が出ず。。そのうちにInventionBoardがConnectしなくなる。
- うーん。しょうがない。MiniProgを使ってみる。
- MiniProgで書いたら、あっさり波形が出るようになった。何だったんだろ?
- ということで、40kHzの矩形波を10kΩの抵抗を通してLC共振回路に入れて、PGAを通して出力してみることにした。
???、えーっと。これはいったい何なんでしょう?
- PSoCの端子同士で繋いだから、何か問題があるのかなぁ?
- 60kHzに切替えてみる。→変わらず。。。。。。。まさか!
- 40kHz/60kHzの切替えをTrでやっていたのを、ジャンパピンで切替えるように配線し直し。
→きれいな正弦波になった。振幅も5倍ぐらいに。。
- 。。。そうか。今まで60kHzの同調回路から40kHzの信号取り出そうとしていたってことか。。出来るわけないよなぁ。
- この同調回路は安い電波時計を壊して取ったんだけど、元々、Trで切替える回路になってたから、そのまま使っていた。
- Lを通してAGNDからバイアスが掛かるから、動くと思ったんだけど。確認しなかったなぁ。。
最初から、やり直しかぁ。。。
[top]
- PGA→32.5kHzMod→7.5kHzBPF→7.68kHzMod→180HzBPF構成からやってみるか。
- コンパレータの割込みを追加する。
うーん、期待してたけどあまり良く分からないなぁ。。。
- じゃ、PGAx1→32.5kHzMod→7.5kHzBPFx125→7.5kHzBPFx125だ。
全く変動が見えない。がっかりだな。。
- とりあえず、アンテナを付けてみようか。同調回路にICクリップを繋ぎ、手で持ってみる。
- おぉ、変動が見えた。これは明らかに電波時計の信号だ。
→そのままだと変動無しだが、アンテナを付けると変動がみえる9
- ICクリップをいろんなものに繋いでみたが、手で持ったのが一番良い。。。
うーん、これは困った。結局アースに繋ぐのが良いって事だよなぁ。
- どうやってアースとろうか?アース棒でも埋めるかなぁ。。
- 考えてみると、冷蔵庫の裏のコンセントにアース端子がある。→これって本当にアースとってるのかな?
- あまり期待しないで、繋いでみる。
- あぁ、これは強過ぎる。
- 結局ICクリップをアルミ板に付けてアース線の上に載せるぐらいが丁度良かった。
- PGAの増幅率を上げても、下げても何故か大差ない。
- じゃ、BPFの増幅率を上げてみるか。
- 増幅すると、ICクリップを10x30cmぐらいのアルミ板に繋いで床に置いた程度でアースを取らなくても、信号が見えるようになった。
- 増幅率を上げて行くと、単純に大きくなるんじゃなくて、低い時のレベルも下がってみえる。
- アナログ回路って不思議だなぁ。
→アニメGIFなので表示に時間が掛かります。。
- アンテナを付けるのは、ちょっと反則だが、これなら何とかなりそうだ。
- 最終的な構成で、もう一回やってみよう。
- PGA→32.5kHzMod→7.5kHzBPF→7.68kHzMod→180HzBPF
→信号が入ると波形が変わってる!
- C1=20でやってみる。アンテナを付けるとちゃんと信号が見える。
- 振幅が変わるんじゃなくて、波形が変わる。→周波数が倍ぐらいになってる様に見える。
- アンテナを外すと、周波数が低いままで変わらず。
- 今まで、この状態で変動を取ろうとしてたけど、これは意味が無かったんだなぁ。
なるほどね。やっとどうなるのかが解かったよ。。
- しかし、情けない間違いで遠回りしたなぁ。
- とりあえず長くなり過ぎちゃったので、ここまでで一旦、締めることにしよう。
- これだけやって電波時計を作るどころか、信号を見れるようになっただけか。。
9これはアニメーションGIFなので動く速さは実際と違ってます。
[top]
[電子工作関連に戻る]