{"id":9524,"date":"2020-09-01T21:05:02","date_gmt":"2020-09-01T20:05:02","guid":{"rendered":"https:\/\/stevepedwards.today\/ElectronicsStuff\/?p=9524"},"modified":"2020-09-01T21:08:37","modified_gmt":"2020-09-01T20:08:37","slug":"sweep-signal-generator-ad9833-on-uno","status":"publish","type":"post","link":"https:\/\/stevepedwards.today\/ElectronicsStuff\/sweep-signal-generator-ad9833-on-uno\/","title":{"rendered":"Sweep Signal Generator AD9833 on Uno"},"content":{"rendered":"<p><a href=\"https:\/\/www.instructables.com\/id\/Signal-Generator-AD9833\/\">https:\/\/www.instructables.com\/id\/Signal-Generator-AD9833\/<\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/stevepedwards.today\/cdn.instructables.com\/ORIG\/FWD\/10VI\/JNAL4J8A\/FWD10VIJNAL4J8A.png?auto=webp&amp;frame=1&amp;crop=3:2&amp;fit=bounds&amp;md=3f5680bd34a045d47b3f9dab39798b35\" alt=\"Add an OLED\" \/><\/p>\n<pre class=\"lang:default decode:true \">\/\/-----------------------------------------------------------------------------\r\n\/\/ Copyright 2018 Peter Balch\r\n\/\/ subject to the GNU General Public License\r\n\/\/-----------------------------------------------------------------------------\r\n\r\n#include &lt;math.h&gt;\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ Global Constants\r\n\/\/-----------------------------------------------------------------------------\r\n\r\nconst long BAUDRATE  = 115200;  \/\/ Baud rate of UART in bps\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ Global Variables\r\n\/\/-----------------------------------------------------------------------------\r\n\r\nconst byte numberOfDigits = 6; \/\/ number of digits in the frequense\r\nbyte freqSGLo[numberOfDigits] = {0, 0, 0, 1, 0, 0}; \/\/ 1000Hz \r\nbyte freqSGHi[numberOfDigits] = {0, 0, 0, 0, 2, 0}; \/\/ 20kHz  \r\n\r\nconst int wSine     = 0b0000000000000000;\r\nconst int wTriangle = 0b0000000000000010;\r\nconst int wSquare   = 0b0000000000101000;\r\n\r\nint waveType = wSine;\r\n\r\nconst int SG_fsyncPin = 2;\r\nconst int SG_CLK = 3;\r\nconst int SG_DATA = 4;\r\nconst int SG_POWER = 6;\r\nint SG_iSweep,SG_nSweep;\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/returns 10^y\r\n\/\/-----------------------------------------------------------------------------\r\nunsigned long Power(int y) {\r\n  unsigned long t = 1;\r\n  for (byte i = 0; i &lt; y; i++)\r\n    t = t * 10;\r\n  return t;\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/calculate the frequency from the array.\r\n\/\/-----------------------------------------------------------------------------\r\nunsigned long calcFreq(byte* freqSG) {\r\n  unsigned long i = 0;\r\n  for (byte x = 0; x &lt; numberOfDigits; x++)\r\n    i = i + freqSG[x] * Power(x);\r\n  return i;\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SG_WriteRegister\r\n\/\/-----------------------------------------------------------------------------\r\nvoid SG_WriteRegister(word dat) {\r\n  digitalWrite(SG_CLK, LOW);\r\n  digitalWrite(SG_CLK, HIGH);\r\n\r\n  digitalWrite(SG_fsyncPin, LOW);\r\n  for (byte i = 0; i &lt; 16; i++) {\r\n    if (dat &amp; 0x8000)\r\n      digitalWrite(SG_DATA, HIGH);\r\n    else\r\n      digitalWrite(SG_DATA, LOW);\r\n    dat = dat &lt;&lt; 1;\r\n    digitalWrite(SG_CLK, HIGH);\r\n    digitalWrite(SG_CLK, LOW);\r\n  }\r\n  digitalWrite(SG_CLK, HIGH);\r\n  digitalWrite(SG_fsyncPin, HIGH);\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SG_Reset\r\n\/\/-----------------------------------------------------------------------------\r\nvoid SG_Reset() {\r\n  delay(100);\r\n  SG_WriteRegister(0x100);\r\n  delay(100);\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SG_freqReset\r\n\/\/    reset the SG regs then set the frequency and wave type\r\n\/\/-----------------------------------------------------------------------------\r\nvoid SG_freqReset(long frequency, int wave) {\r\n  long fl = frequency * (0x10000000 \/ 25000000.0);\r\n  SG_WriteRegister(0x2100);\r\n  SG_WriteRegister((int)(fl &amp; 0x3FFF) | 0x4000);\r\n  SG_WriteRegister((int)((fl &amp; 0xFFFC000) &gt;&gt; 14) | 0x4000);\r\n  SG_WriteRegister(0xC000);\r\n  SG_WriteRegister(wave);\r\n  waveType = wave;\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SG_freqSet\r\n\/\/    set the SG frequency regs \r\n\/\/-----------------------------------------------------------------------------\r\nvoid SG_freqSet(long frequency, int wave) {\r\n  long fl = frequency * (0x10000000 \/ 25000000.0);\r\n  SG_WriteRegister(0x2000 | wave);\r\n  SG_WriteRegister((int)(fl &amp; 0x3FFF) | 0x4000);\r\n  SG_WriteRegister((int)((fl &amp; 0xFFFC000) &gt;&gt; 14) | 0x4000);\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SG_StepSweep\r\n\/\/    increment the FG frequency \r\n\/\/-----------------------------------------------------------------------------\r\nvoid SG_StepSweep(void) {\r\n  if (SG_iSweep &gt; SG_nSweep) SG_iSweep = 0;\r\n  long f = exp((log(calcFreq(freqSGHi)) - log(calcFreq(freqSGLo)))*SG_iSweep\/SG_nSweep + log(calcFreq(freqSGLo))) +0.5;\r\n  SG_freqSet(f, waveType);\r\n  SG_iSweep++;\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ Sweep\r\n\/\/   sweeps siggen freq continuously\r\n\/\/   takes n mS for whole sweep\r\n\/\/   SDC regs are saved and restored\r\n\/\/   stops when receives a serial char\r\n\/\/-----------------------------------------------------------------------------\r\nvoid Sweep(int n) {\r\n  int fmin,fmax;\r\n  fmin = calcFreq(freqSGLo);\r\n  fmax = calcFreq(freqSGHi);\r\n  int i=0; \r\n  do {\r\n    long f = exp((log(fmax) - log(fmin))*i\/(n-1) + log(fmin)) +0.5;\r\n    SG_freqSet(f, waveType);\r\n    delay(1);\r\n    i++;\r\n    if (i &gt;= n) i = 0;\r\n  } while (!Serial.available());\r\n  \r\n  SG_freqSet(calcFreq(freqSGLo), waveType);\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ SerialCommand\r\n\/\/   if a byte is available in teh seril input buffer\r\n\/\/   execute it as a command\r\n\/\/-----------------------------------------------------------------------------\r\nvoid SerialCommand(void) {\r\n  if ( Serial.available() &gt; 0 ) {\r\n    char c = Serial.read();\r\n\r\n    if ((c &gt;= '0') &amp;&amp; (c &lt;= '9')) {\r\n      for (int i=5; i&gt;0; i--) freqSGLo[i] = freqSGLo[i-1];\r\n      freqSGLo[0] = c - '0';\r\n    } else {\r\n      switch (c) {\r\n        case 'S': waveType = wSine; SG_freqReset(calcFreq(freqSGLo), waveType); break;   \/\/ SigGen wave is sine\r\n        case 'T': waveType = wTriangle; SG_freqReset(calcFreq(freqSGLo), waveType); break;   \/\/ SigGen wave is triangle\r\n        case 'Q': waveType = wSquare; SG_freqReset(calcFreq(freqSGLo), waveType); break;   \/\/ SigGen wave is square\r\n        case 'R': SG_Reset();  break;   \/\/ SigGen reset\r\n        case 'M': for (int i=0; i&lt;=5; i++) freqSGHi[i] = freqSGLo[i]; break;   \/\/ move freq to high array\r\n        case 'G': Sweep(1000);  break; \/\/ sweep SigGen\r\n        case 'H': Sweep(5000);  break; \/\/ sweep SigGen\r\n        case 'I': Sweep(20000);  break; \/\/ sweep SigGen\r\n\r\n        default: return;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ InitSigGen\r\n\/\/-----------------------------------------------------------------------------\r\nvoid InitSigGen(void) {\r\n  pinMode(SG_POWER, OUTPUT);\r\n  digitalWrite(SG_POWER, HIGH);\r\n\r\n  pinMode(SG_DATA, OUTPUT);\r\n  pinMode(SG_CLK, OUTPUT);\r\n  pinMode(SG_fsyncPin, OUTPUT);\r\n  digitalWrite(SG_fsyncPin, HIGH);\r\n  digitalWrite(SG_CLK, HIGH);\r\n  SG_Reset();\r\n  SG_freqReset(calcFreq(freqSGLo), waveType);\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ Main routines\r\n\/\/ The setup function\r\n\/\/-----------------------------------------------------------------------------\r\nvoid setup (void) {\r\n  \/\/ Open serial port with a baud rate of BAUDRATE b\/s\r\n  Serial.begin(BAUDRATE);\r\n\r\n  Serial.println(\"SigGen \" __DATE__); \/\/ compilation date\r\n  Serial.println(\"OK\");\r\n\r\n  pinMode(LED_BUILTIN, OUTPUT);\r\n\r\n  InitSigGen();\r\n}\r\n\r\n\/\/-----------------------------------------------------------------------------\r\n\/\/ Main routines\r\n\/\/ loop\r\n\/\/-----------------------------------------------------------------------------\r\nvoid loop (void) {\r\n  SerialCommand();\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/www.instructables.com\/id\/Signal-Generator-AD9833\/ \/\/----------------------------------------------------------------------------- \/\/ Copyright 2018 Peter Balch \/\/ subject to the GNU General Public License \/\/----------------------------------------------------------------------------- #include &lt;math.h&gt; \/\/----------------------------------------------------------------------------- \/\/ Global Constants \/\/----------------------------------------------------------------------------- const long BAUDRATE = 115200; \/\/ Baud rate of UART in bps \/\/----------------------------------------------------------------------------- \/\/ Global Variables \/\/----------------------------------------------------------------------------- const byte numberOfDigits = 6; \/\/ number of digits in the frequense byte freqSGLo[numberOfDigits] = <a href=\"https:\/\/stevepedwards.today\/ElectronicsStuff\/sweep-signal-generator-ad9833-on-uno\/\" class=\"more-link\">...<span class=\"screen-reader-text\">  Sweep Signal Generator AD9833 on Uno<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9524","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts\/9524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/comments?post=9524"}],"version-history":[{"count":2,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts\/9524\/revisions"}],"predecessor-version":[{"id":9526,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts\/9524\/revisions\/9526"}],"wp:attachment":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/media?parent=9524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/categories?post=9524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/tags?post=9524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}