PSoCで行きたい
by K.I
2004/08/01? 〜
Index
- CypressのPSoCを使い始めた。PSoCに関してはWebでの情報も少なく、結構戸惑ったが PastelMagicのBBSでのアドバイスもあって、ワンチップマイコンとしての機能は、いろいろ 試してみることが出来た。慣れてくると、なかなか使い易そうなマイコンだと感じている。
- でもPSoCは、アナログ機能をプログラム出来るのが特徴なんだから、何とか少しでも使ってみたい。
- 自分は、デジタル回路は何とか使っているものの、アナログは分からない事が多くて自分で考えて作ったものは殆んど無い。
- 何故、自分はアナログ回路が分かんないんだろう。
- まずデジタルに比べて数式を使うことが多くて面倒だ →これは覚えれば良いだけの話なんだけど
- アナログ用のパーツは、手に入り難いものが多い →似たような部品でも、微妙に動作が違ったりする
- 本とか見て同じように作っても、再現出来ないことが多い →部品の配置や基板の配線で、全然違った動作をすることがある
- 回路の動作を確認する場合、測定が難しい →そもそも分からなくてやってるから、測定の回路が本来の動作を邪魔したりする
- デジタルにしたって、デジタルの難しさはある(はずだよね)。手を動かしてやって見ないと分からないのは同じなんだけど、アナログは作るのが何故か難しく感じる。
- 結局、本とか見て同じようにやろうとしても再現出来ないっていうのが一番の問題なんじゃないかと思う。
- PSoCだったら、高性能の回路を作るのは無理としても、この問題は殆んどクリア出来るんじゃないかなぁ。
- もしかするとPSoCは、アナログの勉強をするのには最適なんじゃないだろうか。
- ということで、PSoCを使ってアナログ回路の勉強をし直そうと思う。(できるといいなぁ)
[top]
- 自分の場合は、Op-Ampも良く分からないので、基本からやり直すことにする。
- Op-Ampは基本的には、V+とV-入力の差分を増幅する差動増幅器で、入力電圧と出力電圧は以下の式で表される。
- Op-Ampは、さらに以下のような性質を持っている
- 利得が非常に大きい。(無限大とみなせる)
- 入力抵抗が大きく、出力抵抗が小さい。
- 使用する周波数範囲で、上記の性質が保たれる。
- ちなみにPSoCの場合はというと、、、カタログの最後の方のそれらしい数字を引っ張り出してみよう。
パラメータ | 規格値 |
利得 | 60dB(1000倍) |
入力抵抗 | 入力リーク最大200nA |
出力抵抗 | 1Ω |
入力(VDD5V) | 0.5〜4.5V |
入力(VDD3V) | 0.2〜2.8V |
出力(VDD5V) | VDD/2±1.6V |
出力(VDD3V) | VDD/2+0.5-0.8V |
- まぁ十分なんだろう。でも入出力の範囲は気を付けよう。VDD/2を基準に考えた方が良さそうだなぁ。
- 周波数範囲は自分には良く分からないけど、今はまだ良しとする。
- 今度は、基本的なところで反転増幅器の動作を考える。
- Op-Ampの入力抵抗は十分大きいので、RA,RBに流れる電流iは同じになる。
ここで利得を無限大と考えると、Vdが0に近付くように働くので、こうなる
ここらへんまでは、以前、何度か勉強やりかけたんだけど。。。挫折しました。
- Vdが0に近付く性質をイマジナリ・ショートって言って、Op-Ampを簡略化して動作を理解するのに便利な考え方だったような気がする。
- PSoCは、抵抗の代わりにスイッチト・キャパシタで回路を構成している。
- ここらへんはトラ技の'04年8月号の桑野さんの解説を、そのまんま、なぞって見よう。
- PSoCで反転増幅器を作ると、以下のようになっているらしい
- Vdは0になるんだから、Ca,Cbは両端がGNDに接続され放電状態になるのか。。。
- φ2の時だけ、動作している感じなのか。実際は、こっちだけ考えれば良さそうだなぁ。
- うーん、なるほど。分子と分母は逆になるけど、抵抗の場合と同じような式になるんだね。面白いなぁ。
[top]
- PSoCで実際に反転増幅器を動かしてみよう。
- でも、どのモジュールを使ったら良いんだろう?さっぱり分からん。
- AMPINVってやつが、それらしいんだけど。。。inputに、隣のモジュールの出力やGNDしか繋げられないのかなぁ。I/Oポートに直結したいんだけどなぁ。。。
- PGAは、単純な反転増幅器じゃないみたいだ。データシートみるとV+側が入力になってるし。(実際はどうなってるか分かり難いしね)
- 結局、汎用のスイッチト・キャパシタ・モジュールを使うしか無いか。
- でも、いざ置いてみようとすると、置き場所によるけど、ポート2-1か2-2を入力にするしかないみたいだなぁ。
- あれ、ブロックダイアグラムを良く見ると、B入力を使わないと説明図と同じにならないや。でもB入力は他のブロックに接続するしか出来ないみたいだ。。。
- ここで途方にくれてしまった。それで桑野さんの記事を見直していると、極性切替え回路の説明がある。
- あぁ、これはA入力の部分もB入力と同じようにすることが出来るんだと気が付いた。
- というより、Aの方が汎用性を持たせてあるんだ。これで、A入力を安心して使える!
- これに気が付くのに随分かかっちゃったけど、これで最初は全く意味不明だったスイッチト・キャパシタの回路も少しだけ分かった気がする。
- スイッチト・キャパシタのブロックダイアグラムをみながら適当に設定してみる。
User Module Parameters |
FCap | 16 | FCap=ACapで、倍率1 |
ClockPhase | Norm | 良く分からないが多分Normalだろう |
ASign | Neg | 反転増幅器だからNeg |
ACap | 16 | FCap=ACapで、倍率1 |
ACMux | Port_2_1 | A入力をポート2-1に接続する |
BCap | 0 | B入力を切り離すため、0にする |
AnalogBus | AnalogOutBus_0 | 出力をAnalogOutBus_0に接続する |
CompBus | Disable | CompBusには接続しない |
AutoZero | On | よく分からないが、回路図からみて1だ |
CCap | 0 | C入力を切り離すため、0にする |
ARefMux | AGND | 反転増幅器として使うためGNDに落す |
FSW1 | On | FCapを有効にするSWかな?とりあえず1 |
FSW0 | On | 同じく1に設定しておこう |
BMux | ACB00 | BCap=0なので関係ないはず適当に繋ぐ |
Power | Low | これは何だろう?とりあえずlowにする |
- PSoCのコンデンサの基本単位は、約50fF(0.05pF)1ということだが、倍率は比率で決まるはずなので、今は気にしない。
- 周波数は最大2MHzか。。。どれぐらいが良いんだろう?
- とりあえず、VC1をシステムクロック3MHzを1/10にして300kHzにして使おう。
- でも、1μは手持ちにないので、0.1μを使う。
- これでも時定数は約0.1秒だから、きっと大丈夫だ。(ほんとかなぁ)
- 直接繋いだ方が良いのかなぁ。でも、直結すると壊しそうだし。。。
- 本当は何かセンサを繋ぎたいところだけど、、、
- ヘタレなので2秋月のDDSキットで正弦波を入れることにした。
- 約800mVp-pのキレイな波形だ。
- とりあえずプログラムなしでやってみたけど、当然出力が出ない。
SCBLOCK_1_SetPower(1);
- これでどうだ。あれ。。。暫く考える。。。SLEEPにしてるじゃん。
- やったー。波形が出た。。。でも、ちょっと変かなぁ。。。
- 秘密兵器のオシロ。出来れば使いたくないんだけど。。。
- うーん、やっぱり波形が変だ。最初20kHzでやってダメだったので、1kHzでもやったけどほとんど変わり無し。なんだろう。入力インターフェース部分の問題なのかなぁ。
- 良く見直してみると、クロックは24MHzで、1/10だと2.4MHzだった。
- SCブロックのクロックは最大2MHzなんだから、そりゃダメだよね。
- 24MHzの1/16で、1.5MHzで再挑戦した。
- 今度こそ、動いた!!結構悩んだんだけどなぁ。まったく何やってんだか。。。
- 40kHzを入力すると、出力に段差があることがはっきり分かる。→実際は同期とれないので波形が幅をもってボケてみえる。
- ACapを倍にすると、出力が飽和するのが分かる。ここらへんを使いこなすのが大変なんだろうなー。
- うまくいったと思ったんだけど、これって反転増幅器なんだけどなぁ。
- もしかしたら半波長分遅れてる? いや、周波数が違っても同じだし。
- 一応、ショットキーダイオードをかまして、見てみるけどやっぱり反転じゃないなぁ。
- Asignをポジにすると、反転するんだけど。。。データシートによれば、Negの時、φ1でRef入力、φ2でAinputに繋がるんだよなぁ。これが反転増幅器のはずなんだけど。。。
いろいろやってもダメか
- JunkBoxさんにSetPowerで3を指定した方が良いと言われた。すると波形はしっかり出るようになった。飽和とかもしなくなるみたい。
- これだけキレイに波形が出れば、いろいろ使えそうな感じがする。
- 関係ありそうな、AGNDbypassをenableにしてみたり、ClockPhaseをswapしてみたりする。
- 自分の理解では、Posiの時反転するのは納得出来ない。やっぱりまだ理解出来てないんだろうか?何か根本的に間違ってるのかなぁ。
ASDモジュールに変えてみる
- doggieさんから、ASCモジュールの方はASignにEx-ORが付いてるけどという指摘あり。
- これは全然気が付なかった。こういう指摘は有難い。もしかしたらそうかも。
- モジュレーションレジスタでダイナミックに変更出来るみたいだけど、良くわかんないんでASDモジュールに変えてみました。
- 結果は、、、全く同じでした。。。
- これは、当たりだと思ったんだけど、デフォルトでは反転しない状態みたいだなぁ。。。
- 回路と設定値を何度見直しても合ってるような気がする。
- もしかしたら、本当はうまく動いてるんじゃないかなぁ→じゃあ、何が違ってるんだ?そんなこと有り得る?
- まさか、測定が間違ってるってことはないよなぁ→オシロを良く見る。CH2にINVのボタンがある。
- でも反転にした覚えは無いし、、でも一応押してみる→押すと当然反転する。そりゃそうだ。
- ん、押したら、何か↓の表示が消えたような。。。あ"
- えーっと、上の波形が正しい反転増幅器の出力波形です。(1kH,40kHz)
- 結局、オシロで反転して観測3してました。そりゃ、反転にならないよな。。。
1データシートには80fFと書いてあったりするけど、どれが正しいのかな。
2じゃなくて、オシレータを持ってないからだけど、周波数を簡単に変えられるから便利なんだよね。
3リードアウトのやつって、切替が分かり難くってダメなんだよなぁ。。。言い訳。
[top]
- φ1でCaが充電され、φ2で放電された分がCbに流れる。
- Cbの電流の向きは逆だから、電荷とコンデンサの電圧の関係式 Q=CV、さらにVd=0だから、
- 反転増幅器の入力のスイッチを逆転させただけで、非反転増幅器として働いていることが分かる。
- PSoCのスイッチトキャパシタの場合は、ASignをPosi,Negにするだけで、これが簡単に切替えられる。
- SCモジュールでは、さらにモジュレーション入力に信号を繋げば、動的にコントロール出来る。
- 今度は、非反転増幅器のRef側を、GNDに落さずに別の入力にした回路を考える。
- φ1でCaが充電されるのは非反転増幅器と同じ。φ2ではCaに充電されると同時に、放電されると考えれば、Cbにはq2-q1が流れる。
- 電荷とコンデンサの電圧の関係式 Q=CV、さらにVd=0から、
- これだけで、減算になっていることが分かる。でも、減算回路って何に使うんだろう?
- スイッチト・キャパシタの出力をモジュレーションのコントロールに繋いじゃえばどうかなぁ。
- 反転増幅器のCBUS出力をコンパレータバス0に繋いで、
- さらにコンパレータバスをモジュレーションに接続(AMD_CR0=0x04)
- ダメでした。良い考えだと思ったんだけど。。。
- スイッチト・キャパシタのCBUS出力は、何故かφ2でdisableになってる→通常のABUS出力と逆だよね。まぁ、この所為だろう。
- それじゃ、CBUS出力はどんな信号なんだってことでコンパレータバスを直接見てみようと思ったんだけど、、、
- コンパレータバスって、他のモジュールに繋ぐのが難しいなぁ。→単に外に出したいだけなのに。。
- やはり、トラ技で紹介されてるようにやらないと出来ないのかなー。
- 出力端子から、インバータを通してモジュレーションに繋ぐのは、ダメだった。これは、アナログ端子はデジタル入力には出来ないロジックになってる所為のようだ。
- じゃあ、スイッチト・キャパシタの出力をコンパレータで受けて、モジュレーションに繋いだらどうだ?
- スイッチト・キャパシタASC10の出力をコンパレータACB00の入力とする。
- LowLimitをVSSに、RefValueを0.5にして、判定基準を丁度VDD/2に設定
- コンパレータ出力をコンパレータバス0に接続
- さらにコンパレータバス0をモジュレーションに(AMD_CR0=0x04)
- これもダメか。φ1φ2関係ない出力を使ってるからかなぁ。。。あれ、そういえばモジュレーションはASignをひっくり返してるだけなんだから、どんな信号にしても反転するはずだよなぁ、中点に落ちるだけっていうのは変だなぁ。
- PWMので作った信号をモジュレーションに入れるとちゃんと反転する。
- これは、どういうことなんだろう?スイッチト・キャパシタの出力に問題がある?
- ASC、ASDモジュール出力はスイッチト・キャバシタだから断続的な信号になっていて、デジタル回路に接続するのには向いていないのかもしれない。
- それに対して、ACBモジュールでのアンプは抵抗マトリクス持ってるんだから、断続的じゃないのかも。
PGAでバッファする
- 全波整流するためには、やっぱりPGAでバッファしてキレイな波形を作ってからコンパレータを通して、モジュレーションの信号を作らなきダメってことか。
- PGAに接続するためには、、ポート0じゃないと繋がらないなぁ。バイアスの配線面倒だ。まぁ無しで良いか。。
- パラメータとか変えても全然ダメ。丸一日以上これで悩みました。バイアスの配線をケチった所為でした。。。
- 入力信号自体のレベルがズレて波形が欠けてただけだったのに、随分ムダな時間を喰われてしまった。大事なところをハショッちゃダメだよなぁ。反省。
- アナログブロックの3種類の回路の使い分けが、ここまで来てやっと分かってきた気がする。
- トラ技で紹介されていた全波整流回路は、PSoCでは必然的な回路だったんだなぁ。
- 減算回路を試しに使ってみようと思ったんだけど、Ref側ってGNDとかコンパレータバスにしか繋げないんだなぁ。じゃ加算回路に行こう。
- 反転増幅器の入力を2組作ってみる。反転増幅器の式と同じようにQ=CV、さらにV_d=0から、
- これだけで加算器になるのかぁ。非反転増幅器だと符号が反転しないだけか。。。
- スイッチト・キャパシタだと簡単に正反が出来るのが面白いなぁ。
[top]
[電子工作関連に戻る]