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 件のコメント:
コメントを投稿