2015年2月7日土曜日

PSoC 4 Pionner Kit 外付けDACでサイン波生成

DDSを使ってサイン波を生成してMCP4922で出力してみた

PSoC Creator TopDesign


使うのはSPIコンポーネントとTimer(TCPWM)コンポーネントだ

48kHzのサンプリングレートなのでSPIのクロックはできるだけ上げたかったが
1,500KHzまでしか設定できなかった

<追記>今気づいたが、Oversamplingの値を下げればData rateを1,500Hz以上にあげられるようです。

→Acutual data rageのところ

1,500kHz / 48kHz = 31.25なので

1サンプル送るのに16bit(最低16クロック)必要なので割とぎりぎりだ(^q^;

<main.c>
 #include <project.h>  
 #include <math.h>  
 #include "wavetable.h"  
 #define SAMPLE_CLOCK (48000.0f)  
 volatile uint32 phaseRegister;  
 volatile uint32 tuningWord;  
 void DACSetVoltage(uint16 value)  
 {  
   LDAC_PIN_Write(1u);  
   SPIM_SpiUartWriteTxData((value >> 8) | 0x30);  
   SPIM_SpiUartWriteTxData(value & 0xff);  
   LDAC_PIN_Write(0u);  
   while(0u == (SPIM_GetMasterInterruptSource() & SPIM_INTR_MASTER_SPI_DONE))  
   {  
     /* Wait while Master completes transfer */  
   }  
   /* Clear interrupt source after transfer completion */  
   SPIM_ClearMasterInterruptSource(SPIM_INTR_MASTER_SPI_DONE);  
 }  
 CY_ISR(InterruptHandler)  
 {  
   // Caluclate Wave Value  
   phaseRegister += tuningWord;  
   // 32bitのphaseRegisterをテーブルの10bit(1024個)に丸める  
   uint32 index = phaseRegister >> 22;  
   uint16 waveValue = waveTableSine[index];  
   DACSetVoltage(waveValue);  
   Sampling_Timer_ClearInterrupt(Sampling_Timer_INTR_MASK_TC);  
 }  
 int main()  
 {  
   /* Place your initialization/startup code here (e.g. MyInst_Start()) */  
   // 変数の初期化  
   double waveFrequency = 1000.0f;  
   tuningWord = waveFrequency * pow(2.0, 32) / SAMPLE_CLOCK;  
   phaseRegister = 0;  
   // コンポーネントの初期化  
   Sampling_Timer_Start();   
   Timer_ISR_StartEx(InterruptHandler);  
   SPIM_Start();  
   CyGlobalIntEnable;  
   for(;;)  
   {  
     /* Place your application code here. */  
   }  
 }  

まずは1kHzの正弦波を出力してみた

wavetable.hにDDS用のWaveTableを記述しているが、普通に
uint16 waveTableSine[] = {
...
};
とするとメモリが足りないみたいなエラーメッセージが出る
const uint16 waveTableSine[] = {
...
};
とconst指定してやればflashメモリーに格納されるようです。

flashメモリにプログラムで書き込むにはどうすればいいんだろう?
書き込めないのかな?

ブレッドボードの配線図

<追記: 2015.11.22>

ピン接続表



</追記>

オシロで出力とSPIのクロックの波形を見てみた


上が出力波形、下がSPIのクロック

出力波形は左下の表示値の(1)F:994.0Hzでほぼ1kHz

波形を拡大するとかなり汚い(@@


クロックの波形がそのまま乗っている感じだ

クロックの波形を拡大すると


左下の表示値の(2)F:1.497MHzなのでSPIのクロックは設定通りだいたい1,500kHzだ

オーディオ・インターフェイス経由で取り込んでWaveSpectraでFFTしてみると
やはりかなり歪んでいる(^q^;


使うかどうかわからないがLPFを入れてどれぐらい改善されるかやってみるつもりです。

PSoC 5LPにはデジタル・フィルタのコンポーネントがあるが、PSoC 4にはない(^q^;
これは結構痛いなぁ

とりあえず外付でCRかオペアンプを使ってやってみようと思います

今回のプロジェクトはGithubで公開しています
https://github.com/ryood/PSoC-DDS-MCP4922

0 件のコメント:

コメントを投稿