Advertisement
learnelectronics

Arduino 9833 Test Code

Oct 23rd, 2020
3,547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <SPI.h>
  2. #include <MD_AD9833.h>
  3.  
  4. // Pins for SPI comm with the AD9833 IC
  5. #define DATA  11    ///< SPI Data pin number
  6. #define CLK   13    ///< SPI Clock pin number
  7. #define FSYNC 10    ///< SPI Load pin number (FSYNC in AD9833 usage)
  8.  
  9. MD_AD9833   AD(FSYNC); // Hardware SPI
  10. //MD_AD9833 AD(DATA, CLK, FSYNC); // Arbitrary SPI pins
  11.  
  12. // Character constants for commands
  13. const char CMD_HELP = '?';
  14. const char BLANK = ' ';
  15. const char PACKET_START = ':';
  16. const char PACKET_END = ';';
  17. const char CMD_FREQ = 'F';
  18. const char CMD_PHASE = 'P';
  19. const char CMD_OUTPUT = 'O';
  20. const char OPT_FREQ = 'F';
  21. const char OPT_PHASE = 'P';
  22. const char OPT_SIGNAL = 'S';
  23. const char OPT_1 = '1';
  24. const char OPT_2 = '2';
  25. const char OPT_MODULATE = 'M';
  26. const uint8_t PACKET_SIZE = 20;
  27.  
  28. void setup()
  29. {
  30.   Serial.begin(57600);
  31.   AD.begin();
  32.   usage();
  33. }
  34.  
  35. void usage(void)
  36. {
  37.   Serial.print(F("\n\n[MD_AD9833_Tester]"));
  38.   Serial.print(F("\n?\thelp - this message"));
  39.   Serial.print(F("\n\n:<cmd><opt> <param>;"));
  40.   Serial.print(F("\n:f1n;\tset frequency 1 to n Hz"));
  41.   Serial.print(F("\n:f2n;\tset frequency 2 to n Hz"));
  42.   Serial.print(F("\n:fmn;\tset frequency modulation to n Hz"));
  43.   Serial.print(F("\n:p1n;\tset phase 1 to n in tenths of a degree (1201 is 120.1 deg)"));
  44.   Serial.print(F("\n:p2n;\tset phase 2 to n in tenths of a degree (1201 is 120.1 deg)"));
  45.   Serial.print(F("\n:ofn;\toutput frequency n or modulation [n=1/2/m]"));
  46.   Serial.print(F("\n:opn;\toutput phase n or modulation [n=1/2/m]"));
  47.   Serial.print(F("\n:osn;\toutput signal type n [n=(o)ff/(s)ine/(t)riangle/s(q)uare]"));
  48. }
  49.  
  50. uint8_t htoi(char c)
  51. {
  52.   c = toupper(c);
  53.  
  54.   if (c >= '0' && c <= '9')
  55.       return(c - '0');
  56.   else if (c >= 'A' && c <= 'F')
  57.       return(c - 'A' + 10);
  58.   else
  59.       return(0);
  60. }
  61.  
  62. char nextChar(void)
  63. // Read the next character from the serial input stream
  64. // Blocking wait
  65. {
  66.   while (!Serial.available())
  67.     ; /* do nothing */
  68.   return(toupper(Serial.read()));
  69. }
  70.  
  71. char *readPacket(void)
  72. // read a packet and return the
  73. {
  74.   static enum { S_IDLE, S_READ_CMD, S_READ_MOD, S_READ_PKT } state = S_IDLE;
  75.   static char cBuf[PACKET_SIZE + 1];
  76.   static char *cp;
  77.   char c;
  78.  
  79.   switch (state)
  80.   {
  81.   case S_IDLE:   // waiting for packet start
  82.     c = nextChar();
  83.     if (c == CMD_HELP)
  84.     {
  85.       usage();
  86.       break;
  87.     }
  88.     if (c == PACKET_START)
  89.     {
  90.       cp = cBuf;
  91.       state = S_READ_CMD;
  92.     }
  93.     break;
  94.  
  95.   case S_READ_CMD:   // waiting for command char
  96.     c = nextChar();
  97.     if (c == CMD_FREQ || c == CMD_PHASE || c == CMD_OUTPUT)
  98.     {
  99.       *cp++ = c;
  100.       state = S_READ_MOD;
  101.     }
  102.     else
  103.       state = S_IDLE;
  104.     break;
  105.  
  106.   case S_READ_MOD: // Waiting for command modifier
  107.     c = nextChar();
  108.     if (c == OPT_FREQ || c == OPT_PHASE || c == OPT_SIGNAL ||
  109.       c == OPT_1 || c == OPT_2 || c == OPT_MODULATE)
  110.     {
  111.       *cp++ = c;
  112.       state = S_READ_PKT;
  113.     }
  114.     else
  115.       state = S_IDLE;
  116.     break;
  117.  
  118.   case S_READ_PKT: // Reading parameter until packet end
  119.     c = nextChar();
  120.     if (c == PACKET_END)
  121.     {
  122.       *cp = '\0';
  123.       state = S_IDLE;
  124.       return(cBuf);
  125.     }
  126.     *cp++ = c;
  127.     break;
  128.  
  129.   default:
  130.     state = S_IDLE;
  131.     break;
  132.   }
  133.  
  134.   return(NULL);
  135. }
  136.  
  137. void processPacket(char *cp)
  138. // Assume we have a correctly formed packet from the pasing in readPacket()
  139. {
  140.   uint32_t  ul;
  141.   MD_AD9833::channel_t chan;
  142.   MD_AD9833::mode_t mode;
  143.  
  144.   switch (*cp++)
  145.   {
  146.   case CMD_FREQ:
  147.     switch (*cp++)
  148.     {
  149.     case OPT_1: chan = MD_AD9833::CHAN_0; break;
  150.     case OPT_2: chan = MD_AD9833::CHAN_1; break;
  151.     case OPT_MODULATE: /* do something in future */ break;
  152.     }
  153.  
  154.     ul = strtoul(cp, NULL, 10);
  155.     AD.setFrequency(chan, ul);
  156.     break;
  157.  
  158.   case CMD_PHASE:
  159.     switch (*cp++)
  160.     {
  161.     case OPT_1: chan = MD_AD9833::CHAN_0; break;
  162.     case OPT_2: chan = MD_AD9833::CHAN_1; break;
  163.     }
  164.  
  165.     ul = strtoul(cp, NULL, 10);
  166.     AD.setPhase(chan, (uint16_t)ul);
  167.     break;
  168.  
  169.   case CMD_OUTPUT:
  170.     switch (*cp++)
  171.     {
  172.     case OPT_FREQ:
  173.       switch (*cp)
  174.       {
  175.       case OPT_1: chan = MD_AD9833::CHAN_0; break;
  176.       case OPT_2: chan = MD_AD9833::CHAN_1; break;
  177.       case OPT_MODULATE: /* do something in future */ break;
  178.       }
  179.       AD.setActiveFrequency(chan);
  180.       break;
  181.  
  182.     case OPT_PHASE:
  183.       switch (*cp)
  184.       {
  185.       case OPT_1: chan = MD_AD9833::CHAN_0; break;
  186.       case OPT_2: chan = MD_AD9833::CHAN_1; break;
  187.       case OPT_MODULATE: /* do something in future */ break;
  188.       }
  189.       AD.setActivePhase(chan);
  190.       break;
  191.  
  192.     case OPT_SIGNAL:
  193.       switch (*cp)
  194.       {
  195.       case 'O': mode = MD_AD9833::MODE_OFF;    break;
  196.       case 'S': mode = MD_AD9833::MODE_SINE;   break;
  197.       case 'T': mode = MD_AD9833::MODE_TRIANGLE;  break;
  198.       case 'Q': mode = MD_AD9833::MODE_SQUARE1;  break;
  199.       }
  200.       AD.setMode(mode);
  201.       break;
  202.     }
  203.     break;
  204.   }
  205.  
  206.   return;
  207. }
  208.  
  209.  
  210. void loop()
  211. {
  212.   char  *cp;
  213.  
  214.   if ((cp = readPacket()) != NULL)
  215.     processPacket(cp);
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement