写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる

 

それはさておき、

 

このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。

 

変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。

 

まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。

 

フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。

 

半田吸い取り線で、余分な半田を吸い取って、出来上がり。

 

慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。

 

このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。

 

今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。

PSoC3 AD5290 デジタルポテンショメータ

投稿日 2012/05/19

PSoC3のSPIコンポーネントを使用してAD5290 デジタルポテンショメータをコントロールしてみました。

 

SPIシリアルインターフェースは、/CS(チップセレクト)をLowにして、後はI2Cのようにクロックに同期してデータを出力するだけです。I2Cのようにデバイスアドレスを指定しなくてよい分単純なので、SPIコンポーネントを使うまでもなく、GPIOピンのON/OFFのみでも、十分コントロールできます。

 

とは言え、今回はSPIコンポーネントを使ってみるのも目的のひとつです。

PSoC_AD5290_1.jpg

デジポテ AD5290 抵抗値を可変できる便利なIC 

 

ところで、デジタルポテンショメータとは、プログラム制御可能な可変抵抗のことです。アナログデバイセズ社は「デジポット」と呼んでますが、私は、「デジポテ」と呼ぶことにしています。^-^;

 

このデジポテAD5290は、SPIインターフェースで制御できるポテンショメータで、今回はAD5290YRMZ100 100KΩのものを使いました。分解能は256ステップですから、100KΩの場合、約391Ωステップのステップ可変抵抗と言えます。

 

オペアンプのゲインを変えたり、オーディオの音量調整、R-Fコンバータ、抵抗値によるリモート制御ができる定電圧電源などの制御が考えられます。

 

意外とプログラム制御可能な可変抵抗がほしいことは多く、こういうデバイスは重宝します。

 

今回はデジポテの両端に電圧をかけ、抵抗値を変化させながらワイパー(中点)の電圧をADコンバータで
読んでみました。

 

【schematic】

PSoC_AD5290_2.jpg

写真2 SPI、ADC_DelSig、I2Cコンポーネントを組み込む

 

使用するコンポーネントはSPIM、I2C、AD_DelSig(10bit)、他Digital Outピン、Analogピンです。

 

SPIは、PSoC3がマスター、AD5290はスレーブです。

 

まず、SPIコンポーネントのマスター(SPIM)を組み込みます。

 

次に、AD_DelSigコンポーネントを10bitで組み込み、入力にアナログピンWをつないでおきます。
VrefはVdddに設定しています。

 

電圧値をI2C LCDに表示するので、I2Cコンポーネントも組み込みます。

 

SPIMのクロックは、インターナルクロックの2MHzとします。(AD5290は4MHzまで対応)

 

出力は、MISOがSDI、SCLKはそのままSCLK、SSは/CSに対応します。それぞれにDigital Outピンを割り当てて、ピン番号を決めます。今回は/CSにP0[0]、SCLKにP0[1]、SDIにP0[2]を割り当てました。/CSは負論理なので初期値はHIGHにします。

PSoC_AD5290_3.jpg

写真3 外部回路(抵抗分圧回路) WをADC_DelSigの入力P0[4]につないで電圧を測定

 

抵抗分圧回路に定電圧電源をつなぎ、A点が、Vdddと同じ電圧(パソコンのUSBにもよるので実測する)になるように調整します。

 

WはADC_DelSigのアナログ入力ピンにつなぎます。

 

プログラムは、ポテンショメータの0から255ステップを1ステップずつ(3秒間隔で)設定して、各ステップの電圧値を読み、LCDに表示しています。

PSoC_AD5290_4.jpg

写真4 計測した電圧値から計算した抵抗値の直線性とステップ毎の抵抗値


 

実測値(AD5290YRMZ100 100KΩ 室温27℃)
ステップ0 1.3KΩ
ステップ127(中点) 52.4KΩ
ステップ255 104KΩ

 

ステップ0でも1.3KΩくらいあります。今回は保護と分圧を兼ねて200KΩを入れましたが、最大許容電流20mAを超えない限り、直接電源につないでも問題なさそうです。

 

各ステップの抵抗値は400Ω前後でけっこうばらつきはありますが、全体的には抵抗変化の直線性はよいようです。

 

今回は分圧回路に流れる電流が微小のため、インピーダンスが高く、あまり精度のよい計測はできていないと思います。(200KΩを除いて計測したほうがよいかもしれない)


 

【[Program】I2C LCDの部分は省略

 

//main.c
#include <device.h>
#include <stdio.h>

 

void I2C_LCD_Init(void);
void I2C_LCD_WriteString(uint8, uint8, uint8*);

 

void set_degipote(uint8 set){

uint16 ADC_Result = 0;
float Volt;
char string[10];

SPIM_WriteTxData(set); //SPIでステップ値0-255を送る
CyDelay(1);
ADC_DelSig_StartConvert(); //AD変換開始
ADC_DelSig_IsEndConversion(ADC_DelSig_WAIT_FOR_RESULT);
ADC_Result = ADC_DelSig_GetResult16(); //AD変換した値を読む
Volt = ADC_Result * 0.00317; //電圧に変換する(10bit)
sprintf(string, "%3d", (uint16)set);
I2C_LCD_WriteString(0, 1, string);
sprintf(string, "%6.3f", Volt);
I2C_LCD_WriteString(4, 1, string); 

}

 

void main(){
uint8 set;

CyGlobalIntEnable;

 

I2C_Start();
I2C_LCD_Init();
I2C_LCD_WriteString(0, 0, "AD5290 DegiPote" );
I2C_LCD_WriteString(11, 1, "V" );

ADC_DelSig_Start(); //ADCをスタートする

SPIM_Start(); //SPIをスタートする

 

for(set = 0; set < 256; set++){ //256ステップを3秒間隔でステップアップ

set_degipote(set);
CyDelay(3000);

}
}



 

(JF1VRR)