2014年5月28日水曜日

アナログとデジタルのグランドって?

CapSenseの事を書こうと思ったのですが、
どうやっても、アナログのグランドについて触れないと
動作が厳しいので、アナログとデジタルのグランドについて
触れたいと思います。


まずは、グランドって何?というと
簡単に言えば、基準となる「ある電位」のことです。


電池で考えると良いでしょう。
と言う感じ。
0Vと考える、ある電圧」とも言えますね。

さて、グランドには2種類あって
アナログ回路用のグランド (表記だとAGNDもしくはVssa
デジタル回路用のグランド (表記だとDGNDもしくはVssd
があります。

なんで2つあるかと言うと
アナログ回路とデジタル回路、そのもの特徴にあります。

アナログ回路の特徴は、元々ノイズが少ないけど、外部からのノイズに弱い事

デジタル回路の特徴は、ノイズに強いけど、ノイズの素になりやすい事

どちらか一方だけの回路であればそこまで気にする事はないのですが
アナログ回路とデジタル回路をミックスで扱う場合には、グランドを通じて
デジタルからアナログへとノイズが乗ってしまいます。
ノイズが乗ってしまうとアナログの信号は誤った信号になって
正しい信号とは言えなくなってしまいます。

これを避けるため、アナログとデジタルのミックスで扱う部品
アナログデジタル変換器(ADC)やデジタルアナログ変換器(DAC)では
デジタル用とアナログ用のグランドが分かれて存在しています。

アナログのグランドもデジタルのグランドも最終的には
1つのグランドになる訳ですが、そのつなぎ方は

「電源の部分で1つにする」と言うのがセオリー

だそうです。と言うのはもはや、職人芸のレベルの難易度
なので、私はここまでしか書けませんし、判らないです。
ごめんなさい。
少なくとも、

アナログの回路とデジタルの回路では、グランドを必要に応じて分けないといけない。

と言うとこまで押さえられていれば良いと思います。


***mbed系やarduino系がマズイ所***
mbedの一部やarduino系ではアナログのグランドや電源系が
省略されている場合が多くある。これは、アナログを扱う場合ではキツイ。
テキトー工作では平気だけど、いざ正しい数値が重要な時ではどうしようもない。

*今回のブログは自信がありません。
「ここがヘン」っと言う所は書き込んでいただけたらと思います。

2014年5月2日金曜日

CDCUSBUARTを使ってみる。~送信するのみ~

マイコンで得られた情報をパソコンに送る手立てとして
手っ取り早いのは、「シリアル通信(UART)」

Arduino系やmbed系ではパソコンとのシリアル通信に
書き込みと同じUSBポートを使ってUSBシリアル通信をするはずです。

PSoCは書き込みとおなじ所からはUSBシリアル通信ができません。

と言うより

PSoC自体にUSBファンクションのUSBポートがあります。

USBファンクションと言うのは
USBのデバイスとしてPSoCを扱うことです。
PSoC5LPで扱えるのは HID Audio MIDI CDC とこんな感じ。

今回はPSoC5LPCDCクラスのUSBUARTコンポーネットを使って

PSoC5LPから文字を送信して、パソコンで受信してみましょう。

*今回はシリアル通信のソフトをTera Termなどを
インストールしておいてください。

では、PSoC5LPのシリアル通信をさせてみましょう。

まずは、空のプロジェクトを用意します。
(忘れた人はLEDチカチカの準備編へ)

コンポーネットの中のCommunicationsのファイルの中から
USBUART(CDC Interface)ドラックアンドドロップして
回路図の中に入れましょう。



通信の確認が出来るように
HW Connection」のチェックを外した
デジタル出力ピンも用意しましょう。
 (忘れた人はLEDチカチカの後編を。)

用意が出来るとこんな感じ。

***.cydwr のファイルを開いたら
デジタル出力のピンの設定をして置きます。
USBのピンは元々固定されているので設定しなくても構いません。


さて、USBUARTを使うためにはPSoC5LPのクロック」の設定する必要があります。
以前にPWMを動かした時とは違い
PWMで作った時のクロックの根幹としているクロックです。
根幹となるクロックを操作することによって
PSoC5LPCPUを低速にも高速にもすることが出来るようになります。

通常、根幹となるクロックの設定はかなりの呪文のような文を
書くのですがPSoC5LPではクリックだけで設定ができます。

ピン設定をしていた画面の下側にあるClocksのタブをクリックしましょう。
そうするとこんな感じ画面が出るはずです。



赤で囲った「Edit Clock」と言うのをクリックしましょう。

クリックするとこんな画面が出てきます。

カラフルな四角形に線と下に向かって矢印がありますね。
これがPSoC5LPのクロックエディタです。
根幹となるクロックを数倍に増幅したり、分割したりすることによって
適切な部分に適切なクロックを供給しています。

IMOが根幹となるクロック 3.0MHzが一番高精度
ILOが低速クロック(ただし、精度が低い) スリープモード等で使う
PLLは根幹となるクロックを数倍に増幅させる部分
Master Clockはデジタル系で使われるクロックを作る部分
Bus ClockCPUに供給する用のクロックを作る部分です。

これを次のように設定します。


クロックの精度が4%で平気か?と思う人もいるかと思いますが

UART系を使う場合にだけ高精度の24MHzにきり替わる事が出来るので、大丈夫です。

設定が出来たら「OK」をクリックして、1度目のコンパイルをしましょう。


さて、ここまで来たらプログラミングですね。
main.c」のファイルを開きましょう。

Int main()の中身は

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
       CyGlobalIntEnable;
       USBUART_1_Start(0, USBUART_1_3V_OPERATION);//3.3Vで動かす
       //USBUART_1_Start(0, USBUART_1_5V_OPERATION);//5.0V
      
       while(!USBUART_1_GetConfiguration());// USBUARTの設定が出来るまで待つ
       USBUART_1_CDC_Init();//CDCUSBUARTをスタートさせる

    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
        while(USBUART_1_CDCIsReady()==0u){};//通信の準備が出来るまで待つ
              USBUART_1_PutString("Hello from PSoC5LP");//文字を送信する。
              Pin_1_Write(1);
              CyDelay(250);
       
              while(USBUART_1_CDCIsReady() == 0u){};//通信の準備が出来るまで待つ
              USBUART_1_PutCRLF();//改行コード+行頭復帰を送信する
              Pin_1_Write(0);
              CyDelay(250);
    }
}

です。長いのでコピーして貼り付けましょう。

プログラムを書いたら、もう一度コンパイル。

プログラムを書き込んだら、USBケーブルをPSoC5LPから外します。

新しいデバイスを使う場合「ドライバファイル」が必要になります。
ドライバーのファイルの場所は
PSoCのファイルを保存しているところ(ドキュメント)⇒
PSoC Creator⇒「今回のファイル名」⇒Generated_SourcePSoC5
の中の

USBUART_1_cdc.inf がドライバーファイルです。

コンポーネットの設定を変えない限りはこのドライバーファイルを使うことができます。
このドライバーファイルを
Cドライブに「PSoC」と言う新しいフォルダを作ってそこに入れておきます。

入れたら、PSoC5LPの書き込み用ではない方のUSBポートにつなぎます。


ドライバーのインストール方法とWin8の署名なしドライバーの許可方法は
スイッチサイエンスのブログを参考にするのが良いでしょう。
デバイスドライバーの場所を指定するときに「C\PSoC」にすればいいです。


さて、Tera Termを起動させると
こんな感じとなります。


OK」をクリックすると

こんな感じとなります。

PSoC5LPでの受信は気が向けば書こうかなと思います。
*ボーレートの設定は自動で調整されます。