ここでは、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
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が点灯してくれます。