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

 

それはさておき、

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

PSoC3 DACとゲイン2のオペアンプ

投稿日 2012/05/25

PSoC3のOPAmpコンポーネントに2倍のゲインを設定し、DAコンバータの出力を増幅し、ADコンバータで読んで表示してみました。

 

手順は以下のようになります。

 

8bit DAC 0V - 1.080V -> OPAmp x2 -> 12bit ADC VRef 3.3V -> LCD

 

DACの電圧設定は、ロータリエンコーダで可変できるようにしました。

PSoC_OPAmp_1.jpg

写真1 DACの出力をOPAmpで2倍し、ADCで読み取り表示する

 

OPAmpは非反転増幅で、ゲインは1 + R2/R1 となり、R1,R2に同値の抵抗を使った場合、最低ゲイン2倍となります。抵抗には10KΩ以上のものを使います。今回は精度1%の抵抗を選別しました。

 

R1: 9.9783KΩ
R2: 9.9784KΩ

 

ADコンバータのVRefは、Vdss - Vdddとしました。つまり電源電圧3.3Vです。
12ビットなので、0.0008V精度で読み取ります。

 

DAコンバータの出力とオペアンプの出力はDDM(HP3478A)でも読みとってみました。

 

AD、DAの分解能が低いことと、ADCのVRefが信用できないなどであまり高い精度は望めません。

 

【schematic】

PSoC_OPAmp_2.jpg
PSoC_OPAmp_3.jpg

写真3 DAC出力、OPAmp出力のグラフ

 

【Program】

 

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

 

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

 

CY_ISR_PROTO(Clock_1ms_Interrupt);

 

uint8 int_cnt = 0;
uint8 now = 0;
uint8 prev = 0x03;
int8 change = -1;

 

CY_ISR(Clock_1ms_Interrupt){
 if(int_cnt == 3) { //make 3ms
  int_cnt = 0;
  now = (A_Ch_Read() << 1) + B_Ch_Read();
  if(prev != now) {
   if (((prev << 1) + now) & 0x02) {
    if(now == 0x03){ //right, lock position
     change = 1;
    }
   } else {
    if(now == 0x03){ //left, lock position
     change = -1;
    }
   }
   prev = now;
  }
 } else
  int_cnt++;
}

 

void main(){
 char str[17];
 int16 DAC_SetVal = 126;
 uint16 ADC_GetVal = 0;

 

 CyGlobalIntEnable;

 

 isr_Ticker_1ms_StartEx(Clock_1ms_Interrupt);

 

 I2C_Start();
 I2C_LCD_Init();
 I2C_LCD_WriteString(0, 0, "OPAmp Test" );
 I2C_LCD_WriteString(0, 1, "xxx x.xxx x.xxx" );

 

 Opamp_Start();
 Opamp_SetPower(Opamp_HIGHPOWER);

 

 VDAC8_Start();

 

 ADC12_DelSig_Start();
 ADC12_DelSig_StartConvert();

 

 change = 1;
 for( ;; ){
  if(change != 0) {
   DAC_SetVal = DAC_SetVal + change;
   if(DAC_SetVal < 0) DAC_SetVal = 255;
   if(DAC_SetVal > 255) DAC_SetVal= 0;
   VDAC8_SetValue((uint8)DAC_SetVal);
   CyDelay(10);
   ADC12_DelSig_IsEndConversion(ADC12_DelSig_WAIT_FOR_RESULT);
   ADC_GetVal = ADC12_DelSig_GetResult16();
   sprintf(str, "%3d %5.3f %5.3f", DAC_SetVal, DAC_SetVal * 0.004, ADC_GetVal * 0.0008);
   I2C_LCD_WriteString(0, 1, str);
   change = 0;
  }
 }
}


 

(JF1VRR)