ラベル PSoC3 の投稿を表示しています。 すべての投稿を表示
ラベル PSoC3 の投稿を表示しています。 すべての投稿を表示

2016年12月11日日曜日

コンパレータ―をつかってみる。(前回の続き)

前回の記事のつづき。

前回の記事で触れた通りで
コンパレータ―は電圧を比べる機能を持っている。
カンが良い人もいるかも知れないけど、
比べて上回れば出力されるという事は出力が0or1、つまりはONとOFFという事になる。
そう、じつはコンパレータの入力部はアナログだけど、出力されるのはデジタルなんだ。
つまり、コンパレータはアナログとデジタルの境界にある物なんだね。アナログフロントエンドの最後に使われるADCにも、コンパレータが入っている。ただ、コンパレータを沢山つかうと言うケースは中々ないのであまり登場しない。もちろん設計の仕方やリソースが減ってくると使う事もあるので知っていて損はないだろう。

さて、今回はADCを使ってみたときに使った温度センサー(LM61BIZ)と
コンパレータ―で温度の検出をしてみる。このセンサーは0℃の時に600mVを出力して
1℃あたり10mV増減する。
よってこのセンサーは600mA+XmAの電圧値が出力されるという事になる。
目標とする温度の電圧が用意出来れば、センサーの電圧を比較して
センサーの電圧値が上回ればその温度以上ある事が分かる。
つまり、目標の電圧とセンサーの電圧をコンパレータで比較してHIGH(ON)になれば
その温度以上ある事がわかる。

それではやってみよう。
今回は前回と比べてかなり単純。
温度センサーとコンパレータをつなげて、ある温度以上になったら
LEDが光ると言うのをやってみる。

アナログのコンポーネントの中から、コンパレータと
VDACをドラッグアンドドロップしてトップデザインへ入れる。



トップデザインに入れるとこんな感じ。

コンパレータ―のコンポーネントを開いたら、



Speedの項目のラジオボタンをFastに設定をして、Syncの項目のBypassを設定する。


出来たら、OKをクリックして閉じます。
今回はVDACの電圧設定がキーになる。
温度センサーに触れてしばらくしたら、LEDが光るようにしたいので
あまり高い電圧設定ではLEDが光ってくれない。かといって電圧が低くて光りっぱなしでは
テストにならない。と言うことで私の本業の知識から引っ張り出すと、
指の温度は個人差が多少なりともあるが28℃位を超えるかあれば
コンパレータのテストになるだろう。
なので、今回は600+28*10=880mAに設定をすれば良さそうだ。

設定が出来たらOKをクリックして設定を閉じよう。
ここまで出来たらコンポーネント同士を接続しよう。
記事の冒頭で書いた通り、コンパレータ―はアナログとデジタルの堺になる。
つまり、コンパレータは入力側のピンの種類がAnalogPin、
出力側のピンがDigitalPinを接続する事になる。
なので、今回はこのようにつなぐことになる。


これが出来たら使うピンの設定をしよう。
オペアンプの時と比べ、コンパレータ―は内部のリソースに余裕があるので
どのピンでも問題は特にない。しかし、デジタル専用のPort12は使えないので注意が要る。
光らせるLEDのピンは基板についているLEDを使いたいのでP2[1]にしておくと良いだろう。
わたしはこんな感じ。

ここまで出来たら、コンパイルをしよう。
コンパイルをしている間に、センサーとPSoCをつなげよう。

つなげられたらプログラミングをしよう。今回も単純。
コンパレータ―と比較対象のVDACのスタートを書いておしまい。
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    WaveDAC8_1_Start();
    Opamp_1_Start();
    VDAC8_1_Start();

    Comp_1_Start();
    VDAC8_2_Start();

前回のプロジェクトを引き継いでいるのでWaveDAC云々があるが必要なのは2行だけ。
Comp_1_Start();
    VDAC8_2_Start();

ここが書けたら、もう一度コンパイルをしてPSoCへ書き込んでみよう。
書けたら、温度センサーに触れてみよう。
しばらくしたらLEDが光れば成功だ!!
(/・ω・)/

全2回をつかってアナログ回路の始めの方をしてみた。
実際のアナログフロントエンドでもアナログ回路の基本的な使い方を組わせてほしい機能を実現している。
PSoC3,PSoC5LPにはプログラム側から倍率の変更が出来るオペアンプや
電流値として出力されるセンサー等に対してADCが使えるように電流電圧変換アンプもある。
上手に使えば、ワンチップでアナログフロントエンドが出来てしまうでしょう。
また、オペアンプやコンパレーターを工夫して取り入れることで今回のように
CPUを使わないことで並列処理の様なシステムも組める。
なのでプログラミングに自信が無い人もアプローチを変える事も考えてみると良いでしょう。

2016年12月7日水曜日

PSoCでオペアンプとコンパレータを試す(コンパレータ―は別の記事で書くよ)

I2CやキャラクターLCDを含め、割とCPUのパワーを使う事が多かったので
今回は真反対のアナログ系について触れてみようと思う。

さて、以前の記事ではアナログをデジタルに変換をするADCのコンポーネントをつかって温度センサーの値を変換した。しかし、ADC以外にもPSoCには、アナログ回路を直接的に構成する事ができるコンポーネントがある。「高速、高分解能のADCがあればいいのでは?」っと思うかもしれない。けど、ADCへ接続する前に必要な電圧を取り出したり増幅する事が出来れば、ADCをより効果的に使う事ができる。これにはオペアンプを使ったり、コンパレータ―を使う事で取り出したり増幅することが出来る。ADCへつなぐ前の信号に、増幅や加工をすることをアナログフロントエンドとかシグナルコンディショニングと呼ぶ。
PSoC3,PSoC5LP,PSoC4に差はあるもの、オペアンプとコンパレータを内蔵している。
どのファミリーでも最大でオペアンプが4個、コンパレータ―が4個を内蔵している。
特にPSoC3とPSoC5LPにはスイッチキャパシタとオペアンプを合成したSC/CTブロックが4個ある。
これにより外部から抵抗を足すことなく特定のアナログ回路も構成することが出来る。
そのためPSoC3,PSoC5LPはPSoC4よりもアナログ系が得意と言って問題は無いだろう。
 通常のMCUばかりでオペアンプやコンパレータ―になじみが薄い人も多いので
少しオペアンプとコンパレータについて触れよう。
オペアンプとコンパレータは2つとも電圧の状態によって動いている部品になっている。
MCUではCPUがメモリー内にある数値を読みだす事で計算を出力する。
しかしオペアンプやコンパレータ―はメモリーではなく、
電圧同士の計算を行った結果を出力すると考えてもらえばいいだろう。

オペアンプは簡単に2つの機能がある。
 ①電圧を増幅する機能
 ②電圧同士を演算する機能(微積分もできたりする)

コンパレータの機能は1つで
 ①電圧同士を比較する機能

っと簡単にこんな機能がある。
オペアンプやコンパレータ―は単体ではほしい機能を得ることは中々少ない。それは入力部側(+と-の線)の関係性が出力側の結果へ反映される。そのため、抵抗やコンデンサを外付けする必要がある。オペアンプやコンパレータ―の全てを解説するのはなかなか難しいので、電子回路の本等でどういう使い方をするのかを調べて欲しい。
今回はPSoCをつかって簡単にオペアンプとコンパレータ―を使ってみようと思う。
今回はオペアンプを使って、増幅率2倍の反転増幅回路をしてみる。
反転増幅なので、オペアンプに入力した信号がプラスの電圧なら、出力は入力と比べて
マイナスの電圧が出力される。教科書でも出てくる標準的な使い方だ。
けど、PSoCが持っているオペアンプは方電源(+だけ)のため、教科書に出てくるような正負電源(プラスマイナス両方)をつかったオペアンプとは少し違う。
簡単に言うと増幅した信号が0Vより下回ると出力されない。
そのため出力電圧が0Vよりも下回る場合にはちょっとした工夫が要る。

それではやってみよう。
必要なものはPSoC5LP、もしくはPSoC3。100KΩ1個と200KΩ1個。
オシロスコープ(キットのオシロスコープでもかまわない)
今回は電源電圧を5Vで行う方が良い。

空のプロジェクトを用意したら。

アナログコンポーネントから

OpAmpとWaveDACとVDACをトップデザインへドラックアンドドロップする。



WaveDACは周波数発生器の代わりとして使って、
VDACは0Vより下に出力されてしまうのを解決させるのに使う。
トップデザインに並べるとこんな感じ。


先ずは、OpAmpのコンポーネントをダブルクリックして設定をしよう。

今回は実験なのでPowerのプルダウンメニューからHigh Powerを選択して


設定が出来たら、OKボタンをクリックして閉じよう。
その次はVDACをダブルクリックして設定をしよう。

Speedの項目にあるラジオボタンのHigh Speedに設定をして、
Valueの項目のmVの項目を668に設定をする。

出来たら、OKボタンをクリックして閉じよう。
その次はWaveDACをダブルクリックして設定する。

設定はほとんど触らないのですが
Range selectionのプルダウンメニューから
VDAC0 – 1.020V(Buffered)を選ぶ。


それが出来たらOKボタンをクリックして閉じる。
このままだと回路が動かないので、必要な所に結線とAnalog Pinを足して
抵抗をつなげるようにしていく。
WaveDACにはWSのピンにDigtal → LogicのLogic Lowのコンポーネントをつなげてあげて

WaveDACの先にはPort and Pins → Analog Pinのコンポーネントを追加する。

ピンやコンポーネントを反転させたいときはコンポーネントを選択した状態で、
メニューバー近くの反転ボタン(青い囲いの中)をクリックすると反転する。

繋ぎ終わるとWaveDACはこんな感じになる。

VDACはOpAmpの入力側のプラス側につなげる。

OpAmpは入力側のマイナス側にAnalog Pinをつなげる。

使うAnalog Pinは名前を変更しておいた方があとあと楽なので変えておく方が良いでしょう。
ここまで出来たら左側のツリーチェーンからPinをダブルクリックして
使うピンを設定しよう。
どこでもいいと言えばいいけれど、今回はOpAmpを使うのでプルダウンメニューから
OpAmp[*],***と表記されている物の方が内部リソースを無駄に消費しなくて済む。

例えば、オペアンプのマイナスに繋ぐピンにはOpAmp[*],vminusに設定をするような感じで設定してほしい。WaveDACの出力ピンはOpAmp[*],Voutに設定してほしい。
私はあまりギチギチにしなかったので、こんな感じにしました。

ここまで出来たら一度コンパイルしよう。
コンパイルをしている間にPSoCに抵抗を追加して反転増幅回路を構成しよう。
WaveDACとOpAmpのマイナスの間に100KΩをつないで、
OpAmpのマイナスと出力側の間に200KΩをつなぐ。
繋ぐとこんな感じ。

コンパイルが終わったら、プログラムを書いてOpAmpやDACが使えるようにしよう。
プログラムは単純。
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    WaveDAC8_1_Start();
    Opamp_1_Start();
    VDAC8_1_Start();

  
だけ。For文の中身は空っぽでOK
それが終わったら、もう一度コンパイルをしてPSoCに書き込もう。
書き終わったら、WaveDACの出力ピンとオペアンプの出力ピンに
オシロスコープのプローブをつなげてみよう。
(1CHがWaveDAC,2CHがオペアンプの出力)

WaveDACからは0~1Vの電圧で1Khzの正弦波(sin波)が出ていて
OpAmpの出力側からは0~2Vの間でWaveDACとは電圧が反転した波形が2倍で出力されていれば成功!
(/・ω・)/

反転増幅回路は「マイナス」X倍で出力される。そのためどうしても0Vより下の電圧値が出てしまう。
オペアンプのバーチャルショートを利用して0Vより下回っている部分を0Vより上にする事が出来る。

記事が長くなり過ぎたので、ここで中断するよ。
別の記事にコンパレータ―の実験を試してみるよ~。

2015年10月17日土曜日

キャラクターLCDの文字コードを使ってみる。

今回はキャラクターLCDの「文字コード」を使って
半角英数だけでは無い表示をさせてみようと思います。

さて、キャラクターLCDの文字コードとはなに?
っと言う話を少ししておこうと思います。

パソコンはもちろんなのですが
コンピューターは人間の文字が分かりません。
なので、数値の組み合わせに人間の文字を対応させる事によって
コンピューターが人間へ文字を見せられる様になります。
数値の組み合わせと文字の対応の事を「文字コード」と言います。
この文字コードで有名なのは恐らくASCIIコードでしょう。

では、なんで文字コードとキャラクターLCDに関係があるかと言うと
キャラクターLCDとPSoCは文字コードを使ってLCDに表示させているのです。
つまりは、キャラクターLCDに文字コードが内蔵されているいてそれを使っているのです。

え、「プログラムで文字コードなんて意識していないって?」

それはPSoC Creatorのライブラリーが見えない様にしていたからです。
普段は文字コードを意識せずに表示させていました。
ですが今回は文字コードを使って表示させようと思います。

キャラクターLCDモジュールはHD44780(コンパチブル)っと言う
コントロールICを返してLCDに表示させています。
先ずはHD44780が使う文字コードを調べましょう。

これはSparkFanにあったHD44780データシートの抜粋



これが内蔵されている文字コード
アルファベットとカタカナと特殊な文字が使える様になっています。
HD44780互換であればこの文字コードが使えます。
また、任意の文字や絵を8個まで表示させる事が出来ます。

表の上の番号がありますね、それはHD44780が使う文字コードの上位ビットです。
表の左側にも番号がありますね、文字コードの下位ビットを表しています。
この表を使うには8bit分の上位4bitと下位4bit分を合わせないと
使えないと言う訳なのですね。

例えばカタカナの「ア」であれば上位ビットの「1011」と
下位ビットの「0001」を合わせた「10110001」となる訳です。
16進数表記であれば「0xB1」と言う事になります。
では実際にやってみましょう。

まずはいつも通りに空のプロジェクトを作って、
キャラクターLCDのコンポーネントを入れます。



しかし今回は任意で作った絵や文字を入れたいので設定を変えちゃいます。


設定画面を開いたら、ラジオボタンの「None」を「User Defined」に切り替えます。
これで任意の表示が出来るようになりました。



今の状態は「Custom 0」が選択されている状態です。
このマトリックス状に表させているのが1文字分です。
このマトリックスをマウスでクリックして任意の文字を作って行きます。
白をクリックし見ると黒へと逆に黒をクリックすると白へと変わります。



何でも良いのですが、携帯のアンテナみたいなのを作ってみました。
これで文字のデザインはおしまいです。
デザイン増やしたい場合はとなりのYの字ブロックをクリックしてみると
Custom1へと変わっています。このようにして変えていきます。


では「OK」をクリックして閉じましょう。

配線は以前の書いた記事にあるので省略します。


配線が終わったら、一度コンパイルをしましょう。
コンパイルが終わったら次はプログラミングですね。
今回のプログラムの内容は意外とシンプル
int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    LCD_Char_1_Start();//LCDをスタートさせる
    LCD_Char_1_Position(0,0);//上の段の左端からスタート
    LCD_Char_1_PrintString("Hello PSoC3");///まずは普通のやり方
   
    LCD_Char_1_Position(1,0);//下の段の左端からスタート
    LCD_Char_1_PutChar(0xB1);//文字コードを使うときはPutCharを使う。数字は16進数表記
    LCD_Char_1_PutChar(LCD_Char_1_CUSTOM_0);//作った文字には***_CUSTM_*で使える
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        /* Place your application code here. */
    }
}
打てたら、再度コンパイルをしましょう。
コンパイル出来たら、実際にPSoC5LPへと書き込みましょう。
(今回はPSoC3を使いましたがPSoC5LPでも全く同じです)



こういう風に表記されれば完成(/・ω・)/
どうでしょうか出来ましたか??

M●edやAru●inoで同じことが出来るかは知りませんが、
文字コードを使えば簡単にカタカナが出力出来ましたね。
またコンポーネントのエディターで絵文字も作れました。

いや~PSoC5LPは便利ですね。

PS:
スイッチサイエンスの
16×2 日本語フォント付きLCDモジュール(青地・白文字)
https://www.switch-science.com/catalog/2448/
でも使えるはずだぞ~。