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

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より上にする事が出来る。

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

2014年12月7日日曜日

7セグメントLEDを使ってみよう!

ADCの記事が先なのは、十分わかっているのですが。
PSoCまつりで7セグメントLEDを使ったデモを持ってきたので
それの説明、と言うわけ。

さて、7セグメントLEDを通常のマイコンで使う場合
ダイナミック点灯と言う方法を使います。
ダイナミック点灯の簡単な説明をすると
マイコンの入出力ポートにLEDのカソードとアノードの両方を接続して
数字、もしくは文字のように表示させる方法。
ただし、制御がそれなりに面倒な部類で、
プログラムでは配列をつかって
セグメントのON,OFFを繰り返す形で表示させます。

PSoC5LPではどうなのかと言うと

配列云々を使ったりはしません!

では、どうするのかと言うと
LEDドライバーコンポーネットを使います。
「Display」のファイルの中のから「4 Digit 7-segment LED Driver」を選びます。
(これと近いコンポーネットがあると思うが、このタイプを使ってほしい。)



画面にドラックアンドドロップするとこんな形となります。



それでは、LEDドライバーの設定を開けてみましょう。


中の設定は、左側に「ナンバーオブセグメント」と
「ナンバーオブコモン」と言う表示があって
右側に「タイミング」「ブライトネスコントロール」と言うのがあります。

「ナンバーオブ***」はセグメントの数と桁の数の設定で
アクティブLowとhigtは7セグメントがアノードコモンか、
カソードコモンなのかによって違います。

アノードコモンである場合はこのままで良いですが
カソードコモンである場合は2つとも逆にします。
また、トランジスタ等でドライブ回路を組む場合にも調整が要ります。

ブライトネスコントロールを使う場合では
タイミングの数値を下げる必要性がありますが
今回はカソードコモンの7セグを使って、
ブライトネスコントロールを使わないので、このまま。
「OK」をクリックして閉じましょう。

閉じたら、今度は配線をしましょう。
配線は少しヤヤコシイですが、カソードコモン4桁の場合を例にやってみます。
アノード側のピンをA~DPまでを抵抗をはさんで適当なピンにつなぎます。
抵抗はLEDに対して1mAになるように選びます。
(電源電圧-下がった電圧/0.001=抵抗値)
コモン側も同じように適当なピンにつなぎます。
この時に必ずつないだポート番号(ピン番号)と7セグの何番ピンを使ったか
のメモしてください。

繋げたらピンアサインの画面を開いて設定をします。
今回は「Name」の行を見ながら作業をしていきます。

NameにはそれぞれCom[0]やSeg[0]と言うような事が書いてあります。
コレが重要な目印になってくれています。
図を見ていただきたいのですが、



7segのAの所(11番め)につないだPSoC5LPのポート番号を
Nameの行がSeg[0]の所に設定をしてあげます。
7SegのBの所(7番目)につないだPSoC5LPのポート番号を
Nameの行がSeg[1]の所に設定をしてあげます。
という形で7segのA~Gがseg[0]~seg[7]に一致するように設定します。

コモン側の設定は4桁の左側が基準になるように設定をしていきます。
たとえば4桁の左側、一桁目のコモンの12番目につないだPSoC5LPのポート番号には
Nameの行がCom[0]の所に設定をしてあげます。

こう言う形だとちょっと面倒かもしれませんが
ポートごとでの設定と言うことも出来ます。今回は省略させていただきます。

設定が出来るとこんな感じ。



ここで一度、コンパイルをしましょう。
コンパイルが出来たら「main.c」を開いて

3行書きます。




LED_Driver_1_WriteStering7Seg()では「C」の文字がどうしても小文字で表記されるので
LED_Dreiver_1_Write7SegDigitHex()を使って16進数表記で「C」を表記しています。

もう一度コンパイルして書き込みましょう。
そうしたら7セグLEDに「PSoC」と表示されますね。
そうしたら成功(/・ω・)/

PSoC5LPではトランジスタ等が必要にはなりますが、16セグまで同じやり方で動きます。
16セグのLEDが手に入れば、表記の幅も広がって表現が豊かになりますね。

どうでしょう?arduinoやmbedでは出来ない芸当です。
またカメラを通して見てみるとダイナミック点灯で起きるチラつきがありません。
CPUが最低限の事をしていませんから当然ですね。

~~~~ソース電流とシンク電流について~~~

今回、LEDをつなぐ際に
「1mAになるように抵抗を選んでください」と書きました。
これはPSoC5LPに吸い込める電流値が「8mA」と決まっているためです。
吸い込める電流をシンク電流
出せる電流をソース電流
と言ってどのON,OFFするような回路にも出てきます。




PSoC5LPではシンク電流が8mA、ソース電流が4mAと
決まっています。
SIOと言うデジタル専門のピンを使えばシンク電流を25mAまで拡張出来ます。