© 法政大学 理工学部 創生科学科 小林一行実験室

ここでは、Evalボード(CY3210-MiniEval1)についているボリュームと4つのLEDを使った簡単なサンプルプログラムを示します。
バイナリ表示の例です。

ボリュームを回すとLEDが2進数の表示で点滅します。

PSoC Designerで新規作成を行います。この場合、fourbitlevelmeterとしています。

パーツには、CY8C27443を選択し、C言語を選びます。



adブロックは全部で12種類ありますが、ここでは、ad変換ブロックとして6ビットのad変換ブロックであるsar6を使用しました。また、sar6だけでは、入力データが配線できないためオペアンプであるpgaも選択します。AD変換器は、6ビットのAD変換器であるSAR6を選びます。(このAD変換器は、ハードウェアリソース、ソフトウェアリソースともに消費しません。ただし、6ビット以上は存在しないのとサンプルホールド回路が無いため、ノイズが多いデータに対しては適用できません。)


SARだけでは、つなげないのでPGAをかませます。
ブロックの選択が終わったら[Config]の[Interconnect]を選択します。
選択したら次にブロックのPlaceを行います。Plaseをするには、ブロックを選択し、右クリックをするとPlaseメニューが出てくるのでそれにより確定します。下の画面の場所と異なる場合には、[Config]の[Next Allow Placement]によりブロックを配置する箇所を選択できます。(たぶんこの場合にはデフォルトでかまいません)

グローバルリファレンスの設定を選択します。

Global Resources

Value

CPU_Clock

3_M(SysClk/8)

32K_Select

Internal

PLL_Mode

Disable

Sleep_Timer

512_Hz

VC1=SysClk/N

16

VC2=VC1/N

1

VC3 Source

SysClk/1

VC3 Divider

1

SysClk Source

Internal 24_MHz

SysClk*2 Disable

No

Analog Power

SC On/Ref Low

Ref Mux

(Vdd/2)+/-(Vdd/2)

AGndBypass

Disable

Op-Amp Bias

Low

A_Buff_Power

Low

SwitchModePump

OFF

Trip Voltage[LVD(SMP)]

4.81V(5.00V)

 

LVD ThrottleBack

Disable

Supply Voltage

5.0V

Watchdog Enable

Disable


SAR6は、オンラインマニュアルを見てもらえばわかりますが、サンプルクロックを供給する必要があります。サンプルクロックの範囲は、32kHzから333kHzとなっており、仮にVC1からの信号をクロックとして利用するとすると、

VC1=SysClk/Nには、9~16までの値
の値にする必要があります。理由は、最小値を計算するとVC1=3M/333k=9 となります。逆に最大値は、3M/32k=94ですが、VC1の最大値は、16までしか入力できません。ここでは、VC1を16にした例を示しています。
また、OPアンプPGAを使うためRefMuxの設定はPort_0[1]の入力レンジがVss-Vddなので、(Vdd/2)+/-(Vdd/2)に設定しています。また、AD変換ブロックへの入力は、アンプをかませないと信号を入力できないため、PGAを配置します。
Placeを選択したと配線をGUIにより行います。
Port_0_1を選択します。


AD変換回路へのクロックの入力は、VC1からに設定します。


LEDを光らせるため、P_2_1~P_2_3までDriveをHighZからStrongに変更します。






SAR6_1

User Module Parameters

Value

SignalSource

ACB00
(PGA_1が配置してあるブロックを指定)

PGA_1

User Module Parameters

 

Value

 

Gain

1

Input

AnalogColumn_InputMUX_0

Reference

Vss

AnalogBus

Disable

 

[Config]の[Generate Application]を選択し、次に[Config]の[Application Editor]を選択します。

Source Filesの中のmain.cをダブルクリックします。

ボリュームP0[1]の電圧を取り込むためにPGA_1とSAR_1を配置し、アナログマルチプレクサ0をPort0[1]に設定します。

6ビットのAD変換回路なので出力は、-32~31までの出力となります。この値を元にとりあえずバー表示をさせて見ます。そのために出力を以下の表のように6つの範囲に分けます。

-32

-19

-6

5

18

31

 

この場合のプログラムは、以下のように書くことができます。下記のプログラムでは、まず、cDataにデータが取り込まれ、LEDがcDataの大きさに応じ点灯します。変数PRT2DRは、Port2のビット状態を表現しており、1ビットだけセット、リセットを行うことで、バー表示が可能となります。if文の代わりに条件演算子を使うと、スマートな形で表現することができます。

//----------------------------------------------------------------------------

// C main line

//----------------------------------------------------------------------------

 

 

#include <m8c.h>        // part specific constants and macros

#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void main(){

signed char cData;

PGA_1_Start(PGA_1_HIGHPOWER);

SAR6_1_SetPower(SAR6_1_HIGHPOWER);

while(1) {

cData = SAR6_1_cGetSample();

PRT2DR = (cData > -19)?(PRT2DR|0x01):(PRT2DR&~0x01);

PRT2DR = (cData >  -6)?(PRT2DR|0x02):(PRT2DR&~0x02);

PRT2DR = (cData >   5)?(PRT2DR|0x04):(PRT2DR&~0x04);

PRT2DR = (cData >  18)?(PRT2DR|0x08):(PRT2DR&~0x08);

}

}

 

[Build]の[Rebuild All]を選択し、errorが無ければ、[Program]の[Program Part]を選択します。


Connectをクリックし、プログラムを書き込みます。Power Deviceをチェックし、電源を入れます。

このサンプルプログラムでは、ボリュームを回すとそれに応じてバー表示でLEDが点灯します。ただし、この表示ですと、4パターンしか表示されないため、2進表現の表示をして見ましょう。2進表示にするためには、上記のプログラムを参考に作成すると次のようなります。

#include <m8c.h>        // part specific constants and macros

#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void main(){

signed char cData;

PGA_1_Start(PGA_1_HIGHPOWER);

SAR6_1_SetPower(SAR6_1_HIGHPOWER);

 

 

while(1) {

cData = SAR6_1_cGetSample();

PRT2DR = cData >> 2;

}

}

 

 

とすると、2進数表示になります。(ただしデータが4ビット分しかないため、6ビットAD変換器の2ビット分をシフト演算子により削っている。)マニュアルによると、SAR6_1_cGetSample()の出力は、2の補数表現になっているためこのままでは、中心が0となってしまいます。これを補正するには、

#include <m8c.h>        // part specific constants and macros

#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void main(){

signed char cData;

PGA_1_Start(PGA_1_HIGHPOWER);

SAR6_1_SetPower(SAR6_1_HIGHPOWER);

while(1) {

cData = SAR6_1_cGetSample()+32;

PRT2DR = cData >> 2;

}

}

と、32を足せば、補正することができます。

実際に動かしたときの模様、ボリュームを回すとバイナリ表示形式でLEDが点灯してくれます。