dsPIC AD5340 Sinewave

投稿日 2011/05/02

dspic_ad5340_sinewave1.jpg

AD5340 12Bit D/Aコンバータ ブレッドボードに組んでみた
回路はガイドブックを参考にD/Aコンバータを10から12bitに変更

 

dsPIC活用ガイド(後閑氏著)のサインウエーブ生成を試してみました。

 

プログラムでサイン波の1周期分のデータテーブルを作り、それをTime1の割り込みで連続的に出力するものです。dsPICは30F4011を使用しています。

 

ガイドブックではDAコンバータに10bitのAD5331を使用していますが、手持ちの12bit D/AコンバータAD5340を使用しました。リファレンス電圧はMCP1541による4.096Vです。出力のバッファはOP AMP LMC662です。

dspic_ad5340_sinewave2.jpg

500Hzの波形

dspic_easyPIC4.jpg

マイクロテクニカのdsPIC開発環境 dsPICF-400
今は新しいdsPICF-400C2になっています。

 

細かい解析はしてませんが、とりあえず波形が観測できたので投稿しました。



 

CコンパイラをマイクロチップのCコンパイラからmikroC PRO for dsPICに変更
D/Aコンバータを10bit から12Bit変更
ピンアサインはプログラムを参照ください。
AD5340/PD、/CLRは常時High(Vdd)。GAIN、BUFは常時Low(GND)にしています。
************************************************
* dsPIC D/Aテストプログラム (SineWave1.c)
*  サイン波を出力する
*  初期化でサイン波のテーブルを生成
*  それをタイマ1の周期でD/Aに出力
*  Speed of sample is max 200kHz at 80MHz
*  500Hz以下では800分解能 それ以上では減少する
*************************************************/
/// Define D/A pin
#define DA_CS LATFbits.LATF6 // D/Aコンバータ Select
#define DA_WR LATDbits.LATD0 // D/Aコンバータ Write
#define DA_LDAC LATDbits.LATD2 // D/AコンバータLoad
#define LED1 LATCbits.LATC13 // LED1
#define PI 3.141593 // 円周率
#define MaxRes 800 // 最大分解能

 

/// Global Variables
unsigned int OutData[MaxRes];
unsigned int Maxindex; // テーブルの大きさ
unsigned long Fsample; // サンプリング周波数
unsigned int SetTime; // タイマ1設定値
unsigned long Freq; // 出力周波数
unsigned int index = 0; // テーブルインデックス

 

/// 正弦波テーブル作成関数
/// 周期÷出力周波数がMaxRes分解能以上ならMaxResで制限
void GenWave(void) {
unsigned int i;

Maxindex = (int) (Fsample / Freq);
if(Maxindex > MaxRes) {

Fsample = Freq * MaxRes; // サンプル周期を制限する
Maxindex = MaxRes;

}
/// 正弦波データ生成
for(i=0; i<Maxindex; i++) {

OutData[i] = (int)(0x37F * (1+ sin((2*PI*Freq*i)/Fsample))/2);

}
}
//// タイマ1割り込み処理
void Timer1Int() iv IVT_ADDR_T1INTERRUPT {

IFS0bits.T1IF = 0; // 割り込みフラグクリア
/// Output to D/A Converter
LATE = OutData[index]; // Lower 6 bits
LATF = (OutData[index] >> 6) & 0x3F; // Upper 6 bits/LED1 Off
DA_CS = 0;
DA_WR = 0;
DA_WR = 1;
DA_CS = 1;
DA_LDAC = 0;
DA_LDAC = 1;
/// テーブルインデックス更新
index++;
if(index >= Maxindex) index = 0; // n update

 

}

 

/**** Main Function ***/
int main(void) {

/// Setup Port 
TRISD = 0x0A; // RD1,3 is input
TRISE = 0x100; // RE8 is input
TRISF = 0; // all output

/// D/Aコンバータ用制御信号初期化
DA_CS = 1; // CS
DA_WR = 1; // WR
DA_LDAC = 1; // LDAC
/// 正弦波テーブル生成
Fsample = 200000; // Max 200KHz sampling
Freq = 500; // 1 to 20kHz sine wave
GenWave();
//タイマ1設定 サンプリング周期
PR1 = (int)(20000000 / Fsample - 1);
T1CONbits.TON = 1;
INTCON2bits.INT1EP = 1;
IPC0bits.T1IP = 5;
IEC0bits.T1IE = 1;
while(1){}

}

 

(JF1VRR)