
写真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の電圧設定は、ロータリエンコーダで可変できるようにしました。

写真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】


写真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)