2009年2月21日土曜日

マイコンで復調

FSKの場合、周波数が高いか低いかが分かれば良いので、FFTを使うのも方法の1つだが、演算量が多い。受信は送信と異なり、常に動作していなくてはならないため、あまり複雑だと消費電力が多くなってしまう。そこで、外部に簡単な回路を設け、そこで電気的に相関の演算を行ってもらうことにする。

PSoCのアプリケーションノートAN2336「Simplified FSK Detector」では、FSK変調のかけられた信号をデジタル信号にした後、基準となるクロックとのXORをとり、これをLPFで平滑化することで相関を得る「correlator」の回路について書かれている。

マイコン外部にXORを用意し、マイコンからはクロックを、音声入力からは変調波を入力することで同じことが行える。あとはcorrelatorの出力を定期的にA/D変換し、その値を閾値と比較して'0'と'1'を判断する。

LPFはビットレートで定数が決まるはずなので、correlatorはキャリア検出のみに使用し、実際の処理は全てデジタルで行うべきかもしれない。

2009年2月19日木曜日

OlimexとP板での基板外形の取り扱い

OlimexとP板では基板外形の取り扱いについて異なることが分かった。基板発注で面付け(panelize)を頼む際に問題となりそうなので気をつける。

Olimexの場合

OlimexのFAQでは、Panelizationに関して「Please panelize your boards with 0.254 mm (10 mils) gap between outer outside of their borders (NOT between the centers of your board borders i.e. take into account the border line width too!) 」と書いてある。基板の境界線間に10milの余白をあけて並べることが必要で、境界とは外形線の中心ではなく太さを加えた外側とのこと。確か基板外形もシルク印刷されるため、必然的に外形線も10milにしなくてはならない。切り取り方は裁断とカッターによるものがあり、必要な余白も異なる。

P板の場合

P板の規格の中の基板製造用データ説明書によれば、外形線は線幅0.2mmと指定されている(10milではダメ?)。外形線の中心を基板外形とする。基板間の余白は3mmとなる(ルータ切り出し)。3mm以上ではない。

OlimexとP板で使えるようにするには

基板外形レイヤを2通り用意しておき、出力時に切り替えることにする。CAD上でのサイズは共に外形と一致させるが、Olimex用はは外形に接する外形線を、P板用は外形と一致する外形線を描くことにする。

2009年2月18日水曜日

Alternate Functionとピンの重複

複数の周辺回路が同一のI/Oに割り当てられている場合の問題と対策について調べた。STM32シリーズエラッタシート内の「STM32F10xx Silicon Limitations」において、 Alternate Function で生じる問題について書かれていた。

CAN と USART1 間の問題

リマップをしない状態では、CANで使われるRX/TXはそれぞれ、USART1のCTS/RTSとPA11/12ピンを共有する。RXとCTS、TXとRTSはそれぞれ入力と出力なので、PA11/12ピンはそれぞれAlternate In と Alternate Out と設定して使用する。

このとき、CANが割り当てられてはいるが使わない(not clocked)場合においても、PA12ピンでは'1'が出力されてしまうという不具合があるらしい(エラッタシートP.7)。そのため、CTS/RTSを使ったハードウェアフロー制御が行えなくなる。フロー制御を行いたい場合、CANの使用にかかわらず、CANをPA11/12以外にリマップしなくてはならない。(CAN_REMAPを"00"以外にすればよい)

SPI1とUSART2間の問題(エラッタ2.4.2 - 2.4.3)

USART2はPA0からPA4をCTS, RTS, TX, RX, CKとして使い、同期通信が可能となっている。一方SPI1は、PA4からPA7を nSS, SCK, MISO, MOSIとして使っている。 (どちらもリマップを行わない状態において)

USART2のCKは、同期通信モードを有効にすると出力になり、それ以外は使用されない。 SPIはマスター/スレーブを切り替えることができ、スレーブセレクト(nSS)はマスターで出力、スレーブで入力となる。

エラッタシートの2.4.2によればSPIスレーブ時はUSART2は同期通信モードを使用できない(対策はない)という。これは、USARTの出力するクロックがスレーブセレクトへ入力されてしまうためと考えられる。また2.4.3によれば、SPIマスター時にSPIのスレーブセレクトを出力しないよう設定すれば、USART同期通信モードを使用することは可能という。このためにはSPI_CR2のSSOE(Slave Select Output Enable)ビットをクリアすればよい。

これらの記述から分かったこと

周辺回路のピンが重複している場合においても、どちらかが重複箇所を使用しないよう設定することができれば、機能は限定されるものの共存は可能であることが伺える。(ピンが重複していて、どちらもそのピンを使用しないように設定できないなら共存はできない)。 大抵は何らかのイネーブルレジスタが用意されているようだ。 リマップ後に重複するような場合についても、同様だと思われる。

ピンが重複している場合でも、CANとUSART1のような例外を除き、基本的には片方が停止していれば問題ないと思われる。

マイコンの中は設定可能だが、基板の配線は決まっている。リセット直後は基板にあわせたコンフィギュレーションを行う必要があるため、コンフィギュレーションとその後のGPIOロック(リファレンスマニュアル参照)を行うルーチンを用意しておく必要がありそうだ。 設定を正しく行えないと、最悪の場合は外部のICとI/Oを破壊する可能性もあるため、コンフィギュレーションについては慎重に行う必要がありそうだ。

重複ピンの内部で出力同士が衝突するかについては記述されていないが、破壊されるようなことはないと信じたい(ORバスのような何かで直接は衝突しないはず...)。

STM32のAlternate Functionが分からない

STM32ファミリのマイコンは周辺回路を多く持っている。一般的なマイコン同様、1つのI/OピンにGPIOと複数の周辺回路が割り当てられている。I/Oピンの入出力設定を行うレジスタでは、I/Oピンを入力・出力・Alternate Functionという3つのモードに切り替えられるらしい。更にプルアップやプルダウンの設定、動作速度の設定もできるらしい。(RM0008 Alternate Functionについての解説より)

GPIOの出力レジスタODR(Output Data Register)は出力バッファに接続されており、出力モードが設定されたビットにはODRの値に対応する電圧が出力される。Alternate Functionモード(これにも入出力はある)にすると、ODRのは出力バッファから切り離され、代わりに周辺回路が接続される。

この考え方は他のマイコンと同じだが、STM32では複数の周辺回路で一部のピンが重複して割り当てられていることがある。この場合周辺回路を同時に使えないはずだが、どちらの機能がピンを使えるの設定を行う方法が不明。重複した周辺回路の片方が、そのピンを使わないよう設定できたりしたら、同時に使うことができるのだろうか?

また、周辺回路は接続先のI/Oピンを切り替えられることがあるのだが(これをリマップと言い、ソフトウェアからリマップレジスタの値を書き換えることで2~4通りの接続が選択できる)、リマップ先が重複していることがある。リマップしても重複していれば当然使えないはずだが...どちらを使うかの設定はどこでするのだろう?

同じピンに複数の周辺回路が割り当てられた場合、やはり2つの回路を同時に有効にしてはいけないのだろうか(出力バッファへの入力が2つの回路から駆動されるため)。明示的に周辺回路を切り替えられる仕組みがあったりするのだろうか。何らかの注意が書かれていて欲しいが、マニュアルから見つけられずにいる。

2009年2月16日月曜日

STM32シリーズ

STMicroElectronicsのCortex-M3コアマイコンSTM32ファミリは、RenesasでいうところのSH Tinyに相当するものらしく、外部バスはついていない。ちょうど秋月で販売されているSH7125Tinyに相当するが、周辺回路の多く(UART、SPI、I2C、CAN、USB等)、乗算回路が高速で、消費電力も少なめであった。 中でもパフォーマンスライン(STM32F103xx)はCANを内蔵していることから、CanSATで使えそうなデバイスである。Strawberry LinuxやSoliton WaveでOlimexの低価格なJTAGデバッガが購入できるようになり、高価なJTAGデバッガしかないH8系に比べて使いやすくなりつつある気がする。 チップを買うとなると、ホビーでも入手できると思われるのは、今のところRSコンポーネンツに限られている(それでも結構安い)。後は日本語資料が揃えば...

  • ツール概要
  • Documents and Files for family STM32
  • 追記(2/18):STM32ファミリにはLow/Medium/High Densityという分け方がされており、搭載される周辺回路の規模に違いがある。High Densityには外部バスがついているものもある。Medium以下にはDACがついていない。モデムを作るためにはSPIが必要となってしまった。

    2009年2月15日日曜日

    マイコンでPAD兼モデム

    PSoCでモデムを作ろうとしたが、むしろマイコンでやった方が部品点数を減らせることに気づく。消費電力はそれなりになるが、モデムを使ったとしてもマイコンを使うことになるのだから、マイコンのみでできた方が楽だと考えられる。 そこでマイコンでモデムをどう実現するかについて考えた。

    送信

    変調方式によらず、モデムの出力波形(サブキャリア変調)は無線に乗せられるので、高調波を含まない滑らかなものが出力できることが求められる。そのためには、DACを充分なサンプリングレートで周期的に動作させることが必要となる。 出力波形はテーブルとして用意することができる。FSKは正弦波のテーブルを1つ、GMSKはビットパターンに応じた波形をいくつか用意する。シンボル切替のタイミングにおいて、FSKは移送が揃うことはないが、GMSK(MSK)は位相が揃うよう工夫されている。そのため、FSKは波形テーブルの位相を進める間隔を操作することで周波数偏移を与えることができる。一方GMSKは位相が揃っていることから、前後のビットから考えられる波形は数パターンしか存在しない。そのため、パターン分のテーブルさえ用意すれば、それを等間隔に出力するだけで変調波が生成できる。 変調波を正しく出力するためには、帯域の2倍以上でDACのサンプリングを行う必要がある。これには数kHzから数十kHz程度のサンプリングレートが必要となる。これはCPUでポーリングするには遅く、割り込みするには速いため、CPUをほとんど介さずに波形出力を行う方法が必要となる。そこで、波形の出力にはタイマー、DAC、DMAを連動させる方法をとることにした。この方法では、タイマーの作る割り込み信号に合わせて、DMAとDACがそれぞれ動作を行うことが必要となる。

    モデムの役割とPAD

    GMSKモデム作りを考えていた際、モデムは8bitデータを出力するものだと思い込んでいた。しかしモデムの段階でプリアンブルやデータ開始を判定するのは、プロトコルの仕様をモデムが決めてしまうことになるため、おかしいと思っていた。実際のモデムの受信動作は、クロック同期とデータ取得を行い、クロックとデータ信号をセットで出力するというものであった。 モデムから/へのパルスを入力/出力し、パケットを取り出す/出力するコンポーネントを、PAD(Packet Assembler Disassembler)と呼ぶらしい。パケットは第三層のPDU(Protocol Data Unit)で、フレームは第二層のPDUということらしい(日経BP)。 SRLLの解説ページを見た感じでは、確かに第三層のデータを入力し、二層でデータを付け加えてから送り出している。

    PSoCとGMSK/FSK

    PSoCでCanSAT用のモデムを作ろうと考えていたが、GMSKはさすがに難しそうだ。ガウシアンフィルタを3次Salen-Keyを2つつなげて作るにしても、外付け部品が多くなりすぎる。もしGMSK9600bpsを求められたら、CMX589(RSで3000円)を使用した方がはるかに合理的と分かった。 一方FSK1200bpsで良い場合、FX614と水晶発振子の入手製の悪さ、PSoCでのFSKモデムの実現性を比べると、PSoCも充分競合できそうである。(PSoCはレジスタで回路構成を変えるため、ビット反転を検出、復旧する仕組みがないと、CanSATの審査で困るかもしれない)

    2009年2月14日土曜日

    GMSKのガウシアンフィルタ

    GMSKで使われるガウシアンフィルタについて調べた。 ガウシアンフィルタとは、インパルス応答がガウシアンであるIIRフィルタである。インパルス入力発生した時刻でガウシアンの中心が出力されるため、入力がないのに出力が生じる非因果的なフィルタである。このようなフィルタは実現できないため、実際には近似が使われている。本来のインパルス応答の時間を遅らせれば、LPFで実現可能な形になる。 The art of analog circuitガウシアンフィルタの解説ページでは、ChebychefやButterworthはガウシアンに分類され、Besselは除外されることがあると書いてあるが、GMSK用のICであるCMX589では、6次のBesselと思われる周波数応答がデータシートに載っていたことから、実際のところはBesselが使われていると考えて良いのかもしれない。 (GMSKで使われるガウシアンフィルタは、VCOの制御電圧を与えるためにあるため、オーバーシュートが小さい方が好ましいため、過渡応答でオーバーシュート・アンダーシュートのないBesselが好ましいのかもしれない) フィルタの実現にはOPアンプとRCを使ったアクティブフィルタが使われる。フィルタの設計には、いくつかの決まった形のフィルタをつなげて設計するツールが存在する。Texas Instruments社のFilterPro、Linear Technology社のFilterCAD、National Semiconductor社のWebBenchの他にも、フリーでいろいろなツールが存在する。ただ、大抵は1つのOPアンプで1~2次のフィルタを作り、それをつなげるという方法がとられているため、OPアンプ数を減らしたい場合は独自に計算するしかなさそうである。 GMSKではガウシアンフィルタの形を決めるパラメータにBTがある。CMX589ではBT=0.3または0.5が選択できるようになっている。BTの定義はフィルタのカットオフ周波数(fc や f-3dBと書かれる)のビットレートに対する比で与えられる。従って、9600bpsでBT=0.5としたら、ガウシアンフィルタのカットオフ周波数は4800Hzとなる。 今後は、GMSKに使える6次のBesselフィルタを少ないOPアンプで作れるか検討してみる。

    2009年2月12日木曜日

    MSKについて

    最小の周波数偏移のFSK

    2値FSKでは、1シンボルに対して2つの周波数を割り当てる。この周波数の差は大きいほど弁別しやすいが、占有帯域は広がる。最小の周波数偏移は、ビット時間において2つの周波数が直交するという条件から求める。 (1)を零にする必要があるので、信号の積を取ったらLPFで遮断することが必要となる(実は積分回路自体がLPF)。このときの偏移から変調指数を求めると、以下のようになる。 よく「変調指数(modulation index)が0.5であること」がMSKの定義のように書かれている気がするが、これは結果であって、偏移が最小になる理由ではない。

    サブキャリアの最小の周波数

    モデムのようにサブキャリアを使う場合は、サブキャリアの周波数も最小化できる。GMSK 9600bpsの場合はサブキャリアも最小化されているようで、周波数は9600~14400Hzの間で変化する。 パルスが正しく変調できる最小の周波数は、幅T[s]のパルスの帯域を求めることで計算できる。 帯域は無限になるが、一番大きなローブだけを送るとすると帯域は1/T [Hz]となる。これを正しく変調するには、最低でも1/T [Hz]が必要となる。これが最小の周波数である。GMSKではこの最小の周波数9600Hzを下限とし、最小の偏移4800Hzを加えた14400Hzを上限としている。

    2009年2月10日火曜日

    PSoC開発の下調べ(1)

    PSoCの仕組みと制約

    PSoCはマイコンの一種であるが、周辺回路が独特である。 通常のマイコンでは、UARTやタイマといった周辺回路がいくつか入っており、レジスタインターフェースからこれらを操作できるようになっている。 一方PSoCでは、固定機能を持つモジュールは(システムリソースを除き)存在しない。 代わりに、デジタル/アナログ回路の元となるブロックが用意されており、これらの配線や動作はレジスタインターフェースから操作できるようになっている。 このため、配線をソフトウェアからいつでも変更することが可能となっている。これを動的再構成という。(FPGAはあまりに粒度が細かすぎる上、再構成を行う機構を内包していないため、動的再構成は話題にはなっても敷居は高い) アナログブロックの中身は、OPアンプとアナログマルチプレクサの塊のようなものとなっており、マルチプレクサのセレクタ信号をレジスタインターフェースから操作することで、配線を変更することができるようになっている。このような構造であるため、完全に自由なアナログ回路作りができるわけではない。
    FPGAはプログラム可能な論理+配線なのに対し、PSoCは選択可能なパラメータと配線という印象を受けた。

    自分でユーザーモジュールを作るには

    PSoCの開発においてGUI上でハードウェアを構成するには、PSoC Designer上でユーザーモジュールを配置し、それらを配線すればよいらしい。(PSoC Expressも似たようなもの)しかし、ユーザーモジュールの開発を補助するGUIは用意されていない(ように見受けられる)。
    ユーザモジュールに使われるブロックは再配置可能であるべきなので、ビルド前のインスタンス化されていない段階では、ブロックはシンボルのような状態で配線できるようになっていないと困るはず。だからGUIで書いたものから、具体的なレジスタやビット番号が書かれたコードを生成するものと思っていたが...本当に無い?
    そこで付属のユーザーモジュールがどのように定義されているか調べた。 ユーザモジュールは、[インストール先\Common\CypressSemiDeviceEditor\Data\Stdum]以下にまとめられているらしい。このディレクトリ以下には、[モジュール名]のディレクトリが並んでいる。その中身は以下のようなものであった。
  • マクロで置換されるらしい文字列を含むアセンブリコード
  • リソースと信号を定義していると思われるXMLファイル
  • Designer上で動くと思われるスクリプト(JavaScript?)
  • ドキュメント(HTMLや画像)
  • これらに関する情報は存在するかどうか確認中。