· 

AD9833を使ってみる

回路中でアナログな波形が欲しいことがあります、とくに正弦波。オペアンプでウイーンブリッジやクワドラチャを組む、、、とか、マイコンやFPGAでR-2R DACを構成する、、、とか、マイコンやFPGAでPWM的DACで出す、、、とか、ありますが、どれも長所短所があって、なかなかに難しい問題です。で、それを一気に解決してくれる夢のICがAD9833です。専用ICなので、柔軟性と安定性が両立しているのが魅力です。で、親切にもすぐ使えるようにしてあるモジュールが手に入るので、まずはこれで試してみようと思います。

RSでAD9833を買うと1106円、上記モジュールは998円、、、なんだかなぁ、、、

で、結線します。

SPIモードについて、データシートによると

となっていて、

アナログデバイセズのAD9833のページの下のほうにあるドキュメントのうちAN-1248を見てみると、

ということですので、AD9833の場合、FSYNC立下りでSCLKはHなので、Modeは2または3ということがわかり、SCLKの立下りで取り込んでいるよう(日本語版データシートの9ページ目に記述あり)なので、Mode2だということがわかります。

アナログデバイセズのAD9833のページの下のほうにあるドキュメントのうちAN-1070を参考に(ていうかそのまんま)書くとうまく動かない。他の人のをみると31行目が0x2000となっているので、そうすると、動きました、、、ていうかそれすらなくしても動くのはなぜか、、、
  1. #include "SPI.h"
  2.   
  3. #define AD9833_FSYNC     (7)
  4. #define AD9833_SDATA    (10)
  5. #define AD9833_SCLK      (8)
  6. #define SPI_MISO         (9)
  7. #define MCLK (25000000)
  8.   
  9. SPIClass mySPI(&sercom0,SPI_MISO,AD9833_SCLK,AD9833_SDATA,SPI_PAD_2_SCK_3,SERCOM_RX_PAD_0);
  10.   
  11. void WriteRegAD9833(uint16_t wd){
  12.   digitalWrite(AD9833_FSYNC,LOW);
  13.   mySPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE2));
  14.   mySPI.transfer16(wd);
  15.   mySPI.endTransaction();
  16.   digitalWrite(AD9833_FSYNC,HIGH);
  17. }
  18.   
  19. void SetAD9833(uint32_t frequency){
  20.   uint64_t temp;
  21.   uint32_t FREQREG;
  22.   uint16_t FREQ01,FREQ00;
  23.   temp=((uint64_t)frequency)<<28;
  24.   temp=temp/((uint64_t)MCLK);
  25.   FREQREG=(uint32_t)(temp&0x00000000FFFFFFFF);
  26.   FREQ01=(uint16_t)((FREQREG>>14)&0x3FFF);
  27.   FREQ00=(uint16_t)((FREQREG>>0)&0x03FFF);
  28.   SerialUSB.println(FREQREG,HEX);
  29.   SerialUSB.println(FREQ01,HEX);
  30.   SerialUSB.println(FREQ00,HEX);
  31. //  WriteRegAD9833(0x2000);
  32.   WriteRegAD9833(0x4000|FREQ00);
  33.   WriteRegAD9833(0x4000|FREQ01);
  34.   WriteRegAD9833(0xC000);
  35.   WriteRegAD9833(0x2000);
  36. }
  37.   
  38. void setup() {
  39.   SerialUSB.begin(115200);
  40.   while(!SerialUSB){
  41.     //wait for SerialUSB stabled
  42.   }
  43.   pinMode(AD9833_FSYNC,OUTPUT);
  44.   digitalWrite(AD9833_FSYNC,HIGH);
  45.   mySPI.begin();
  46.   delay(100);
  47.   SetAD9833(2500000);
  48. }
  49.   
  50. void loop() {
  51.   
  52. }

できた!けど、MCLK=25MHzでFout=2.5MHzだと結構カクカク、、、

MCLK=10MHzで1.5MHzを出したいんだけど、、、だめかな、、、