迷走の果て・Tiny Objects

迷走する日々の覚え書きです。自分で分かってることは省略してますので、念のため。

AD9833 DDSモジュールを試す(2)クロックノイズ

25MHzのクロックノイズですが出力にフィルタをつける前にするべきことがありました。
クロックの出ているREF端子のヘッダピンを外しました。
REFはVCCの隣にあって、ブレッドボードに挿すと容量結合してVCCにクロックが乗ってしまうようです。
REFpin外す
ブレッドボード裏

さらにVCCにLCによるデカップリングフィルタを入れました。手持ちを使ったのでインダクタ値は不明です、大きさからいって10μH程度かとは思いますが・・・。
AD9833DDS_ schematic2

対策後の1MHz波形です。
AD9833DDS1MHz_2.jpg

これが対策前の波形。
AD9833DDS1MHz.jpg




スポンサーサイト

AD9833 DDSモジュールを試す(1)

アマゾンでAD9833DDSモジュールを買ってしまいました。
10月14日に発送通知があり、26日に到着しました。

商品の説明には
「オンボードの高速は300Mアンプと、低域通過フィルタリングされています。 」
とありますが、そんな部品は見当たりません。
ちゃんとしたした説明をつけてほしいものですが、これがチャイナクオリティでしょうか。
AD9833module表

先のAD9850DDSモジュールを使った記事で参考にしたサイトを書いた人が、AD9833 Waveform Generatorという記事を書かれていたので、これまた参考にしました。

回路図です、先のAD9850 Sinewave Generatorと同じく、表示にはI2C接続LCDを使いました。
AD9833DDS_ schematic

1MHz正弦波出力です。DDSモジュールのクロックである25MHzがのっかってます。LPFをつけるつもりです。
AD9833DDS1MHz.jpg

続きを読む »

AD9850 DDSモジュールを試す(5)AD9850 Sinewave Generator(3)

表示をI2C接続LCDに変更。
手持ちのLCDにアマゾンで入手したI2Cモジュールをつなぎました。このモジュールについては過去記事があります。

I2CエキスパンダPCF8574を使ったキャラクタLCD表示のテスト(1)

LCD_I2Cmodule.jpg

Arduino用ライブラリはGitHubにあります。実は他にもあるのですが、うまく動作しませんでした。
実験の様子、再びArduino nanoを使ってます。写りがよくない^^;;
AD9850Signal_Generator4.jpg

回路図。シリアル接続からI2C接続にしてポートが余ったので周波数プリセットスイッチをいくつかつける予定。
AD9850Signal_Generator4_schematic.jpg

スケッチ。Arduino IDEでスケッチを”フォーラム投稿形式でコピーする”を選んでから貼り付けたらきれいに表示できました。知らなんだ。
今まではgist使ってました。


//AD9850 sinewave generator
// edy
//
//2016/10/06 First version(ver 0.1)
//
//2016/10/08 ver 0.2
// 周波数下限を 10Hz から 1Hz へ変更。
// 変数 freq,freqOld,incr を負号なしから負号ありへ。引き算によるエラー回避のため。
// 周波数ステップ 2.5KHz を 2KHz へ変更。
// 周波数表示を3桁区切りにする。
//
//2016/10/10 ver 0.3
//stepText[] 変更
//
//2016/10/15 ver 0.4
// LCDをI2C接続に変更
// PCF8574を使ったi2C接続モジュールを使う
// https://www.amazon.co.jp/dp/B010Q000V2/
//
// arduino用ライブラリ
// https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
//
//参考にしたweb page
// http://www.vwlowen.co.uk/arduino/AD9850-waveform-generator/AD9850-waveform-generator.htm
/* Based on AD9851 code from Andrew Smallbone - modified for AD9850
  http://www.rocketnumbernine.com/2011/10/25/programming-the-ad9851-dds-synthesizer
*/

#include <Rotary.h>            //  Rotary encoder: https://github.com/brianlow/Rotary

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

#include <EF_AD9850.h>
// EF_AD9850(CLK,FQ_UP,RESET,DATA)
EF_AD9850 AD9850(7, 6, 4, 5);

#define stepPin1 A0                    // Set 'Step' rotary encoder pins
#define stepPin2 A1
int forceHzStep = A2;                  // 'Step' rotary encoder's push button - Set 1 Hz steps.
int forcekHz = A3;                     // Interrupt-driven encoder's push button - force 1kHz freq.

Rotary i = Rotary(stepPin1, stepPin2); // Rotart encoder for setting increment.
Rotary r = Rotary(2, 3);              // Rotary encoder for frequency connects to interrupt pins

//long unsigned int freq = 1000;         // Set initial frequency.
long freq = 1000;
//long unsigned int freqOld = freq;
long freqOld = freq;

char disp_buf[16];

char* stepText[11] = {
 "       1Hz",
 "      10Hz",
 "      50Hz",
 "     100Hz",
 "     500Hz",
 "   1,000Hz",
 "   2,000Hz",
 "   5,000Hz",
 "  10,000Hz",
 " 100,000Hz",
 " 500,000Hz"
};

int stepPointer = 0;
long  incr = 0;
String units = stepText[stepPointer];

void setup() {

 pinMode(2, INPUT_PULLUP);            // Pins for interrupt-driven rotary encoder and push buttons
 pinMode(3, INPUT_PULLUP);
 pinMode(forceHzStep, INPUT_PULLUP);
 pinMode(forcekHz, INPUT_PULLUP);

 // Configure interrupt and enable for rotary encoder.
 PCICR |= (1 << PCIE2);
 PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
 sei();

 lcd.begin();
 lcd.clear();  // LCD画面消去
 lcd.setCursor( 0, 0 );
 lcd.print( "AD9850" );
 lcd.setCursor( 0, 1 );
 lcd.print( "sinewave generator" );
 delay(1000);
 lcd.clear();

 // Initialise the AD9850 module.
 AD9850.init();
 AD9850.reset();
 AD9850.wr_serial(0x00, freq);
 updateDisplay();
}

void getStep() {
 switch (stepPointer) {
   case 0:  incr = 1; break;
   case 1:  incr = 10; break;
   case 2:  incr = 50; break;
   case 3:  incr = 100; break;
   case 4:  incr = 500; break;
   case 5:  incr = 1000; break;
   case 6:  incr = 2000; break;
   case 7:  incr = 5000; break;
   case 8:  incr = 10000; break;
   case 9:  incr = 100000; break;
   case 10: incr = 500000; break;
 }
}

void updateDisplay() {
 getStep();
 units = stepText[stepPointer];
 //lcd.clear();
 lcd.setCursor( 0, 0 );
 lcd.print( "STEP: " );
 lcd.print(units );

 lcd.setCursor( 0, 1 );
 lcd.print("FRQ:");
 if (freq < 1000) {
   sprintf(disp_buf, "%10ld", freq);
 }
 else if (freq < 1000000) {
   int freqL = freq % 1000;
   int freqM = freq / 1000;
   sprintf(disp_buf, "%6d,%03d", freqM, freqL);
 }
 else {
   int freqL = freq  % 1000;
   int freqM = (freq / 1000) % 1000;
   int freqH = freq / 1000000;
   sprintf(disp_buf, "%2d,%03d,%03d", freqH, freqM, freqL);
 }
 lcd.print(disp_buf);
 lcd.print("Hz");
}

void loop() {
 // Check 'Step' rotary encoder.
 unsigned char result = i.process();
 if (result) {
   if (result == DIR_CW)  {
     if (stepPointer < 10) stepPointer++;
   }
   if (result == DIR_CCW) {
     if (stepPointer > 0) stepPointer--;
   }
   updateDisplay();
 }

 if (digitalRead(forceHzStep) == LOW) {
   stepPointer = 0;
   updateDisplay();
   delay(50);
 }

 if (digitalRead(forcekHz) == LOW) {
   freq = 1000;
   AD9850.wr_serial(0x00, freq);
   updateDisplay();
   delay(350);
 }
 if (freqOld != freq) {
   AD9850.wr_serial(0x00, freq);
   updateDisplay();
   freqOld = freq;
 }
}

ISR(PCINT2_vect) {
 unsigned char result = r.process();
 if (result) {
   if (result == DIR_CW) {
     if ((freq + incr) <= 10000000) freq += incr;
   } else {
     if ((freq - incr) >= 1) freq -= incr;
   }
   if (freq <= 1)  freq = 1;
   if (freq >= 10000000) freq = 10000000;
 }
}

AD9850 DDSモジュールを試す(4)AD9850 Sinewave Generator(2)

周波数表示を見やすくするためにスケッチ変更。
苦し紛れですが単位をHzのみとして3桁区切りとしました。
他にもいくつか変更。
ステップ周波数は値によって表示位置を変えて出力周波数との関係がわかるようにしたつもりです。
これも単位はHzだけにしたほうが良かったかもしれません、まだまだいじってみます。
AD9850Signal_Generator3_1.jpg

AD9850Signal_Generator3_2.jpg



【2016/10/10追記】
ステップ周波数の単位をHzだけにしました。
stepText[]を書き換えました。

AD9850 DDSモジュールを試す(3)AD9850 Sinewave Generator


私が買ったのと同じAD9850モジュールを使ったSinewave generatorの製作記事を見つけました。
AD9850 Waveform Generator
10Hzから10MHzまで可変できます。
記事ではディスプレイにTFTを使ってますが、手持ちの16桁2行のLCDが使えないかと思い、実験を始め、どうにか動くようになりました。まだ周波数表示に難がありますが。



回路図です。push for 1Hzのスイッチとpush for 1KHzのスイッチは実験ではつけてません。
AD9850Signal_Generator回路

スケッチです。とりあえず動作させることを最優先にしたため、先にも書きましたが周波数表示が見にくいです。
不要なコードも残ってます。



AD9850 DDSモジュールを試す(2)スペクトル

AD9850モジュールの出力は直流が乗ってるのでCRでカットしてから、WaveSpectraでスペクトルを観測しました。
100Hz、2次から5次までの高調波は約-80dB程度。
AD9850_100Hz.jpg

1KHz、高調波の出かたは100Hzと変わらないです。
AD9850_1KHz.jpg

1KHz付近を拡大して300回のアベレージング、1KHz±40Hzぐらいにピークがありますが、私には理由がわかりません。
AD9850_1KHz2.jpg

AD9850 DDSモジュールを試す(1)

アマゾンからAD9850 DDSモジュールを買ったので早速実験してみました。
JH7UBC氏のArduinoのページを参考にさせていただきました。

実験の様子、Arduino Nano互換機を使いました。
AD9850_Arduino_nano.jpg

回路図です。参考にしたウェブページと同じ結線です。
AD9850.gif

とりあえずのスケッチ、100Hzから10KHzまで10Hzステップでスイープします。

テストスケッチ


波形を見ました。こんなことが簡単にできちゃうんですねぇ。

 | HOME | 

文字サイズの変更

プロフィール

edy

最新記事一覧(サムネイル画像付き)

脈拍センサーMAX30100を試す(5) May 20, 2017
MT3608モジュールを使ったDSO Shell用電源 May 16, 2017
脈拍センサー MAX30100を試す(4)MAX30100_Registers.h を調べる。 May 13, 2017
脈拍センサー MAX30100を試す(3)正常動作?? May 12, 2017
脈拍センサー MAX30100を試す(2)スケッチとライブラリー May 10, 2017
脈拍センサー MAX30100を試す(1) May 08, 2017
Studuino用電池ボックスを作る(2) May 06, 2017
Studuino用電池ボックスを作る May 05, 2017
MT3608モジュールのテスト Apr 30, 2017
BME280モジュールを使った温度・湿度・気圧計(2)DSO Shellを使って動作電流を測る Apr 23, 2017

全記事表示リンク

全ての記事を表示する

ブログリンク

リンク

このブログをリンクに追加する

月別アーカイブ

05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  12  11  10  09  07  05  04  03  04  03  01  12  11  10  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  02  01  12  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  10  09  08  07  06  05  04  03  02  01 

カテゴリ

プログラミング (0)
freescale (1)
AVR (3)
テルミン (16)
緊急警報放送 (3)
78K (1)
PSoC (295)
地上デジタル放送 (2)
電子工作 (399)
HX711 (2)
ACS712 (6)
数学 (6)
パソコン (12)
PLC (14)
未分類 (39)
ブログ関係 (20)
スカイプ (37)
ロボット (1)
LTSpice (8)
OCXO (0)
arduino (28)
maxima (1)
フランクリン発振回路 (3)
GPS (3)
DTMF (1)
Linux (1)
KOMAINO (7)

タグリスト

最近のコメント

最近のトラックバック

メールフォーム

名前:
メール:
件名:
本文:

検索フォーム

アクセス

RSSリンクの表示

フリーエリア

FC2Ad

まとめ

Template by たけやん