找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12913|回复: 15
收起左侧

Arduino+ad9833制作DDS信号发生器代码和原理图 实测成功

  [复制链接]
ID:519062 发表于 2019-4-24 10:43 | 显示全部楼层 |阅读模式
AD9833一款采用DDS技术、低功耗、可编程波形发生器。可产生正弦波,三角波,方波三种波形,最大可输出12.5MHz频率

Schematics_00.jpg
F55OSA4JLGV11HG.LARGE.jpg

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:519062 发表于 2019-4-24 10:45 | 显示全部楼层
  1. // include the library code:
  2. #include <LiquidCrystal.h>
  3. #include <SPI.h>
  4. #include <MD_AD9833.h>
  5. #include "pins_arduino.h"

  6. /* Digital potentiometer constants */
  7. #define DP_nINC 4 // D4
  8. #define DP_UnD  3 // D3
  9. #define DP_nCS  2 // D2

  10. /* LCD Constants */
  11. #define LCD_D7 14 // A0
  12. #define LCD_D6 15 // A1
  13. #define LCD_D5 16 // A2
  14. #define LCD_D4 17 // A3
  15. #define LCD_E  19 // A5
  16. #define LCD_RS 5 // D5

  17. /* Function generator constants */
  18. #define DATA 11 // D11
  19. #define CLK 13 // D13
  20. #define FSYNC 10 // D10

  21. /* Other pin definition constants */
  22. #define VBAT 21 // A7
  23. #define CAP_ON 18 // A4
  24. #define CATHODE_PWM 9 // D9

  25. /* Boolean Constants */
  26. #define OFF false
  27. #define ON true

  28. /* Encoder constants */
  29. #define ENC_A 8   // D8
  30. #define ENC_B 7   // D7
  31. #define ENC_SW 6  // D6

  32. /* Encoder States */
  33. #define UP 1
  34. #define DOWN -1
  35. #define SAME 0

  36. /* Sequential state machine constants */
  37. enum OutputConstants { NOFF = 1, SINE, TRIG, SQUARE };
  38. enum States { StateOut = 1, StateAmplitude, Coupling, StateFreqHz, StateFreqKhz, StateFreqMhz, Brightness};

  39. /* Custom LCD battery characters */
  40. byte Bat0[8] = {0b01110, 0b11011, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111};
  41. byte Bat1[8] = {0b01110, 0b11011, 0b10001, 0b10001, 0b10001, 0b11111, 0b11111, 0b11111};
  42. byte Bat2[8] = {0b01110, 0b11011, 0b10001, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
  43. byte Bat3[8] = {0b01110, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};

  44. /* AD9833 & LCD Library objects definition */
  45. MD_AD9833  AD(FSYNC);
  46. MD_AD9833::channel_t chan;
  47. MD_AD9833::mode_t mode;  
  48. LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

  49. /* Global state machine in-used variables */
  50. unsigned char MenuState = StateOut;   // Initial state
  51. volatile uint8_t OutType = NOFF;      // Output waveform type
  52. volatile uint8_t DigiPotState = 0;    // Digital potentiometer wiper state
  53. volatile bool CouplingOn = true;      // AC or DC coupling state
  54. volatile uint8_t BrightnessState = 0; // LCD Backlight brightness state

  55. /* Encoder pins state */
  56. volatile bool encoder_A = false;
  57. volatile bool encoder_B = false;
  58. volatile bool encoder_A_prev = false;

  59. /* Frequency states */
  60. volatile uint32_t FreqHz = 0;
  61. volatile uint32_t FreqKhz = 0;
  62. volatile uint32_t FreqMhz = 0;


  63. /* Function prototypes */
  64. volatile uint8_t *port_to_pcmask[] = { &PCMSK0, &PCMSK1,&PCMSK2 };
  65. static int PCintMode[24];
  66. typedef void (*voidFuncPtr)(void);
  67. volatile static voidFuncPtr PCintFunc[24] = { NULL };
  68. volatile static uint8_t PCintLast[3];
  69. void EnableInterrupts();
  70. void DisableInterrupts();
  71. void InitEncoder();
  72. void InitOther();
  73. void InitDigipot();
  74. void CreateLcdChars();
  75. byte ProcessBatteryVoltage();
  76. void SetLcdBrightness(int brightness);
  77. void PotDown();
  78. void PotUp();
  79. void InitPotState();
  80. void InitDevice();
  81. void SetADFrequency();
  82. void SetADOutput();
  83. void SetADOutType();
  84. void BrightnessUp();
  85. void BrightnessDown();
  86. volatile int GetEncoderPos();
  87. void EncoderPositionChanged();
  88. void MainMenu();

  89. /* Pin-change interrupts block */
  90. /* /////////////////////////// */
  91. void PCattachInterrupt(uint8_t pin, void (*userFunc)(void), int mode)
  92. {
  93.   uint8_t bit = digitalPinToBitMask(pin);
  94.   uint8_t port = digitalPinToPort(pin);
  95.   uint8_t slot;
  96.   volatile uint8_t *pcmask;

  97.   // map pin to PCIR register
  98.   if (port == NOT_A_PORT) return;
  99.   else {
  100.     port -= 2;
  101.     pcmask = port_to_pcmask[port];
  102.   }
  103.   if (port == 1) slot = port * 8 + (pin - 14);
  104.   else slot = port * 8 + (pin % 8);
  105.   PCintMode[slot] = mode;
  106.   PCintFunc[slot] = userFunc;
  107.   *pcmask |= bit;
  108.   PCICR |= 0x01 << port;
  109. }

  110. void PCdetachInterrupt(uint8_t pin) {
  111.   uint8_t bit = digitalPinToBitMask(pin);
  112.   uint8_t port = digitalPinToPort(pin);
  113.   volatile uint8_t *pcmask;
  114.   // map pin to PCIR register
  115.   if (port == NOT_A_PORT) return;
  116.   else {
  117.     port -= 2;
  118.     pcmask = port_to_pcmask[port];
  119.   }
  120.   *pcmask &= ~bit;
  121.   if (*pcmask == 0)  PCICR &= ~(0x01 << port);
  122. }

  123. static void PCint(uint8_t port) {
  124.   uint8_t bit;
  125.   uint8_t curr;
  126.   uint8_t mask;
  127.   uint8_t pin;
  128.   curr = *portInputRegister(port+2);
  129.   mask = curr ^ PCintLast[port];
  130.   PCintLast[port] = curr;
  131.   if ((mask &= *port_to_pcmask[port]) == 0) return;
  132.   for (uint8_t i=0; i < 8; i++) {
  133.     bit = 0x01 << i;
  134.     if (bit & mask) {
  135.       pin = port * 8 + i;
  136.       // Trigger interrupt if mode is CHANGE, or if mode is RISING and
  137.       // the bit is currently high, or if mode is FALLING and bit is low.
  138.       if ((PCintMode[pin] == CHANGE
  139.           || ((PCintMode[pin] == RISING) && (curr & bit))
  140.           || ((PCintMode[pin] == FALLING) && !(curr & bit)))
  141.           && (PCintFunc[pin] != NULL)) {
  142.         PCintFunc[pin]();
  143.       }
  144.     }
  145.   }
  146. }

  147. /* Interrupt masking functions */
  148. SIGNAL(PCINT0_vect) { PCint(0); }
  149. SIGNAL(PCINT1_vect) { PCint(1); }
  150. SIGNAL(PCINT2_vect) { PCint(2); }
  151. /* End of pin-change interrupts block */
  152. /* ////////////////////////////////// */

  153. /* Enable/disable encoder pin interrupts */
  154. void EnableInterrupts()
  155. {
  156.   PCattachInterrupt(ENC_A, EncoderPositionChanged, CHANGE);
  157.   PCattachInterrupt(ENC_B, EncoderPositionChanged, CHANGE);
  158. }

  159. void DisableInterrupts()
  160. {
  161.   PCdetachInterrupt(ENC_A);
  162.   PCdetachInterrupt(ENC_B);
  163. }

  164. void InitEncoder()
  165. {
  166.   pinMode(ENC_A, INPUT);
  167.   pinMode(ENC_B, INPUT);
  168.   pinMode(ENC_SW, INPUT);
  169. }

  170. void InitOther()
  171. {
  172.   pinMode(VBAT, INPUT_PULLUP);
  173.   pinMode(CAP_ON, OUTPUT);
  174.   pinMode(CATHODE_PWM, OUTPUT);
  175. }


  176. void InitDigipot()
  177. {
  178.   pinMode(DP_nINC, OUTPUT);
  179.   pinMode(DP_UnD, OUTPUT);
  180.   pinMode(DP_nCS, OUTPUT);
  181. }

  182. void CreateLcdChars()
  183. {
  184.   lcd.createChar(1, Bat0);
  185.   lcd.createChar(2, Bat1);
  186.   lcd.createChar(3, Bat2);
  187.   lcd.createChar(4, Bat3);
  188. }

  189. /* Process Li-ion battery voltage state and return appropriate character */
  190. byte ProcessBatteryVoltage()
  191. {
  192.   int BatVoltage  = analogRead(VBAT);
  193.   //Serial.println(BatVoltage);
  194.   if (BatVoltage >= 950 && BatVoltage <= 1023) return (byte)4;
  195.   else if (BatVoltage >= 900 && BatVoltage < 950) return (byte)3;
  196.   else if (BatVoltage >= 850 && BatVoltage < 900) return (byte)2;
  197.   else {
  198.     //Serial.println("Encoder came here");
  199.     return (byte)1;
  200.   }
  201. }




  202. void SetLcdBrightness(int brightness)
  203. {
  204.   analogWrite(CATHODE_PWM, brightness);
  205. }


  206. void PotDown()
  207. {
  208.   for (uint8_t i = 0; i < 4; i++) {
  209.   digitalWrite(DP_UnD, LOW);
  210.   digitalWrite(DP_nINC, LOW);
  211.   delayMicroseconds(100);
  212.   digitalWrite(DP_nINC, HIGH);
  213.   delayMicroseconds(100);
  214.   if (DigiPotState <= 0) DigiPotState = 0;
  215.   else DigiPotState--;
  216.   }
  217. }



  218. void PotUp()
  219. {
  220.   for (uint8_t i = 0; i < 4; i++) {
  221.   digitalWrite(DP_UnD, HIGH);
  222.   digitalWrite(DP_nINC, LOW);
  223.   delayMicroseconds(100);
  224.   digitalWrite(DP_nINC, HIGH);
  225.   delayMicroseconds(100);
  226.   if (DigiPotState >= 255) DigiPotState = 255;
  227.   else DigiPotState++;
  228.   }
  229. }

  230. void InitPotState()
  231. {
  232.   digitalWrite(DP_nCS, LOW);
  233.   _delay_ms(10);
  234.   for (uint8_t i = 0; i < 255; i++) PotDown();  
  235. }




  236. void InitDevice()
  237. {
  238.   InitEncoder();
  239.   InitDigipot();
  240.   InitPotState();
  241.   InitOther();
  242.   Serial.begin(57600);
  243.   Serial.println("Serial logger is enabled");
  244.   lcd.begin(16, 2);
  245.   AD.begin();
  246. }

  247. void SetADFrequency()
  248. {
  249.   uint32_t u1 = FreqHz + (FreqKhz * 1000) + (FreqMhz * 1000000);
  250.   chan = MD_AD9833::CHAN_0;
  251.   AD.setFrequency(chan, u1);
  252. }

  253. void SetADOutput()
  254. {
  255.   chan = MD_AD9833::CHAN_0;
  256.   AD.setActiveFrequency(chan);
  257. }

  258. void SetADOutType()
  259. {
  260. switch (OutType)
  261.       {
  262.       case NOFF: mode = MD_AD9833::MODE_OFF;    break;
  263.       case SINE: mode = MD_AD9833::MODE_SINE;   break;
  264.       case TRIG: mode = MD_AD9833::MODE_TRIANGLE;  break;
  265.       case SQUARE: mode = MD_AD9833::MODE_SQUARE1;  break;
  266.       default: break;
  267.       }  
  268. AD.setMode(mode);
  269. }

  270. void setup() {
  271.   InitDevice();
  272.   CreateLcdChars();
  273.   SetADOutput();
  274.   pinMode(A4,OUTPUT);
  275.   digitalWrite(A4,HIGH);
  276.   mode = MD_AD9833::MODE_OFF;
  277.   AD.setMode(mode);
  278.   SetADFrequency();
  279.   BrightnessState = 127;
  280.   SetLcdBrightness(BrightnessState);
  281. }

  282. void BrightnessUp() {
  283.   if (BrightnessState >= 250) BrightnessState = 255;
  284.   else BrightnessState += 4;
  285.   SetLcdBrightness(BrightnessState);
  286. }

  287. void BrightnessDown() {
  288.   if (BrightnessState <= 5) BrightnessState = 0;
  289.   else BrightnessState -= 4;
  290.   SetLcdBrightness(BrightnessState);
  291. }

  292. volatile int GetEncoderPos()
  293. {  
  294.     volatile int RetVal = 0;
  295.     encoder_A = digitalRead(ENC_A);
  296.     encoder_B = digitalRead(ENC_B);   
  297.     delay(10);
  298.     if((!encoder_A) && (encoder_A_prev)){
  299.       if(encoder_B) RetVal = 1;            
  300.       else RetVal = -1;
  301.     }   
  302.     else RetVal = 0;
  303.     encoder_A_prev = encoder_A;     // Store value of A for next time
  304.     return RetVal;
  305. }

  306. void EncoderPositionChanged()
  307. {
  308.    switch(MenuState) {
  309.     case StateFreqHz:
  310.       switch(GetEncoderPos()) {  
  311.             case UP:
  312.               if (FreqHz >= 900) FreqHz = 900;
  313.               else FreqHz += 10;
  314.               break;
  315.             case DOWN:
  316.                if (FreqHz < 10) FreqHz = 0;
  317.                else FreqHz-= 10;
  318.                break;
  319.             default: break;
  320.           }
  321.           SetADFrequency();
  322.           break;
  323.   case StateFreqKhz:
  324.     switch(GetEncoderPos()) {  
  325.             case UP:
  326.               if (FreqKhz >= 900) FreqKhz = 900;
  327.               else FreqKhz += 1;
  328.               break;
  329.             case DOWN:
  330.                if (FreqKhz <= 10) FreqKhz = 0;
  331.                else FreqKhz -= 1;
  332.                break;
  333.             default: break;
  334.           }
  335.           SetADFrequency();
  336.           break;
  337.   case StateFreqMhz:
  338.     switch(GetEncoderPos()) {  
  339.             case UP:
  340.               if (FreqMhz >= 10) FreqMhz = 10;
  341.               else FreqMhz++;
  342.               break;
  343.             case DOWN:
  344.                if (FreqMhz <= 0) FreqMhz = 0;
  345.                else FreqMhz--;
  346.                break;
  347.             default: break;
  348.           }
  349.           SetADFrequency();
  350.           break;
  351.   case StateAmplitude:
  352.     switch(GetEncoderPos()) {  
  353.             case UP: PotUp(); break;
  354.             case DOWN: PotDown(); break;
  355.             default: break;
  356.           }
  357.           break;
  358.   case StateOut:
  359.     switch(GetEncoderPos()) {  
  360.             case UP:
  361.               if (OutType >= SQUARE) OutType = SQUARE;
  362.               else OutType++;
  363.               break;
  364.             case DOWN:
  365.               if (OutType <= NOFF) OutType = NOFF;
  366.               else OutType--;
  367.               break;
  368.             default: break;
  369.           }
  370.           SetADOutType();
  371.           break;
  372.    case Coupling:
  373.       switch(GetEncoderPos()) {
  374.         case UP: CouplingOn = true; break;
  375.         case DOWN: CouplingOn = false; break;
  376.         default: break;
  377.       }
  378.       digitalWrite(CAP_ON,CouplingOn);
  379.       break;
  380.     case Brightness:
  381.         switch(GetEncoderPos()) {  
  382.             case UP: BrightnessUp(); break;
  383.             case DOWN: BrightnessDown(); break;
  384.             default: break;
  385.           }
  386.           break;
  387.   default: break;   
  388.    }
  389. }

  390. void MainMenu()
  391. {
  392.   MenuState = StateOut;
  393.   EnableInterrupts();
  394.   bool OutConfirm = false;
  395.   while(!OutConfirm)
  396.   {
  397.     switch(MenuState)
  398.     {
  399.       case StateFreqHz:
  400.         lcd.setCursor(0,0);
  401.         lcd.print("<Frequency: Hz >");
  402.         lcd.setCursor(0,1);
  403.         lcd.print("<Val:");
  404.         lcd.setCursor(5,1);
  405.         lcd.print(FreqHz);
  406.         if (FreqHz <= 9) {
  407.           lcd.setCursor(6,1);
  408.           lcd.print("  ");         
  409.         }
  410.         else if (FreqHz > 9 && FreqHz <= 99) {
  411.           lcd.setCursor(7,1);
  412.           lcd.print(" ");         
  413.         }
  414.         lcd.setCursor(8,1);
  415.         lcd.print("[Hz]   >");
  416.           if (!digitalRead(ENC_SW)) {
  417.             while(!digitalRead(ENC_SW));
  418.             MenuState = StateFreqKhz;
  419.           }
  420.         break;

  421.       case StateFreqKhz:
  422.         lcd.setCursor(0,0);
  423.         lcd.print("<Frequency:KHz >");
  424.         lcd.setCursor(0,1);
  425.         lcd.print("<Val:");
  426.         lcd.setCursor(5,1);
  427.         lcd.print(FreqKhz);
  428.         if (FreqKhz <= 9) {
  429.           lcd.setCursor(6,1);
  430.           lcd.print("  ");         
  431.         }
  432.         else if (FreqKhz > 9 && FreqKhz <= 99) {
  433.           lcd.setCursor(7,1);
  434.           lcd.print(" ");         
  435.         }
  436.         lcd.setCursor(8,1);
  437.         lcd.print("[KHz]  >");
  438.           if (!digitalRead(ENC_SW)) {
  439.             while(!digitalRead(ENC_SW));
  440.             MenuState = StateFreqMhz;
  441.           }
  442.         break;
  443.         
  444.       case StateFreqMhz:
  445.         lcd.setCursor(0,0);
  446.         lcd.print("<Frequency:MHz >");
  447.         lcd.setCursor(0,1);
  448.         lcd.print("<Val:");
  449.         lcd.setCursor(5,1);
  450.         lcd.print(FreqMhz);
  451.         if (FreqMhz <= 9) {
  452.           lcd.setCursor(6,1);
  453.           lcd.print("  ");         
  454.         }
  455.         else if (FreqMhz > 9 && FreqMhz <= 99) {
  456.           lcd.setCursor(7,1);
  457.           lcd.print(" ");         
  458.         }
  459.         lcd.setCursor(8,1);
  460.         lcd.print("[MHz]  >");
  461.           if (!digitalRead(ENC_SW)) {
  462.             while(!digitalRead(ENC_SW));
  463.             MenuState = Brightness;
  464.           }
  465.         break;
  466.    
  467.       case StateAmplitude:
  468.         lcd.setCursor(0,0);
  469.         lcd.print("<Amplitude in %>");
  470.         lcd.setCursor(0,1);
  471.         lcd.print("<Value:");
  472.         lcd.setCursor(7,1);
  473.         lcd.print((DigiPotState*100)/255);
  474.         if ((DigiPotState*100)/255 <= 9) {
  475.           lcd.setCursor(8,1);
  476.           lcd.print("  ");         
  477.         }
  478.         else if ((DigiPotState*100)/255 > 9 && (DigiPotState*100)/255 < 100) {
  479.           lcd.setCursor(9,1);
  480.           lcd.print(" ");         
  481.         }
  482.         lcd.setCursor(10,1);
  483.         lcd.print(" [%] >");
  484.           if (!digitalRead(ENC_SW)) {
  485.             while(!digitalRead(ENC_SW));
  486.             MenuState = Coupling;
  487.           }
  488.         break;
  489.          
  490.       case StateOut:
  491.         lcd.setCursor(0,0);
  492.         lcd.print("<   Out Type   >");
  493.         lcd.setCursor(0,1);
  494.         lcd.print("<Out:");
  495.         lcd.setCursor(5,1);
  496.         switch (OutType)
  497.         {
  498.           case NOFF:   lcd.print("Off       >"); break;
  499.           case SINE:   lcd.print("Sine      >"); break;
  500.           case TRIG:   lcd.print("Triangle  >"); break;
  501.           case SQUARE: lcd.print("Square    >"); break;
  502.           default: break;
  503.         }
  504.           if (!digitalRead(ENC_SW)) {
  505.             while(!digitalRead(ENC_SW));
  506.             MenuState = StateAmplitude;
  507.             }
  508.         break;

  509.      case Coupling:
  510.         lcd.setCursor(0,0);
  511.         lcd.print("< Out Coupling >");
  512.         lcd.setCursor(0,1);
  513.         lcd.print("<Type:");
  514.         lcd.setCursor(6,1);
  515.         switch (CouplingOn)
  516.         {
  517.           case true:   lcd.print(" [DC]    >"); break;
  518.           case false:   lcd.print(" [AC]    >"); break;
  519.           default: break;
  520.         }
  521.           if (!digitalRead(ENC_SW)) {
  522.             while(!digitalRead(ENC_SW));
  523.             MenuState = StateFreqHz;
  524.             }
  525.         break;     

  526. case Brightness:
  527.         lcd.setCursor(0,0);
  528.         lcd.print("<  Brightness  >");
  529.         lcd.setCursor(0,1);
  530.         lcd.print("<Value:");
  531.         lcd.setCursor(7,1);
  532.         lcd.print((BrightnessState*100)/255);
  533.         if ((BrightnessState*100)/255 <= 9) {
  534.           lcd.setCursor(8,1);
  535.           lcd.print("  ");         
  536.         }
  537.         else if ((BrightnessState*100)/255 > 9 && (BrightnessState*100)/255 < 100) {
  538.           lcd.setCursor(9,1);
  539.           lcd.print(" ");         
  540.         }
  541.         lcd.setCursor(10,1);
  542.         lcd.print(" [%] >");
  543.           if (!digitalRead(ENC_SW)) {
  544.             while(!digitalRead(ENC_SW));
  545.             OutConfirm = true;
  546.             }
  547.         break;     
  548.       }
  549.       delay(50);
  550.     }
  551.     DisableInterrupts();
  552. }

  553. void loop() {                  
  554.   /* Battery Character */
  555.   lcd.setCursor(15, 0);
  556.   lcd.write(ProcessBatteryVoltage());
  557.   /* Out State */
  558.   lcd.setCursor(0,0);
  559.   lcd.print("<Output:");
  560.   lcd.setCursor(8,0);
  561.   if (OutType != NOFF) lcd.print("ON ");
  562.   else lcd.print("OFF");
  563.   lcd.setCursor(11,0);
  564.   lcd.print(" > ");
  565.   /* Output Type */
  566.   lcd.setCursor(0,1);
  567.   lcd.print("<Y:");
  568.   lcd.setCursor(3,1);
  569.   switch(OutType) {
  570.     case NOFF:    lcd.print("OFF "); break;
  571.     case SINE:    lcd.print("SIN "); break;
  572.     case TRIG:    lcd.print("TRN "); break;
  573.     case SQUARE:  lcd.print("SQR "); break;
  574.     default: break;
  575.   }
  576.   /* Amplitude */
  577.   lcd.setCursor(7,1);
  578.   lcd.print("[A]:");
  579.   lcd.print((DigiPotState*100)/255);
  580.         if ((DigiPotState*100)/255 <= 9) {
  581.           lcd.setCursor(12,1);
  582.           lcd.print("  ");         
  583.         }
  584.         else if ((DigiPotState*100)/255 > 9 && (DigiPotState*100)/255 < 100) {
  585.           lcd.setCursor(13,1);
  586.           lcd.print(" ");         
  587.         }
  588.         lcd.setCursor(14,1);
  589.         lcd.print("%>");
  590.   if (!digitalRead(ENC_SW)) {
  591.     while(!digitalRead(ENC_SW));
  592.     MainMenu();
  593.   }
  594.   delay(50);
  595. }
复制代码


回复

使用道具 举报

ID:519062 发表于 2019-4-24 10:48 | 显示全部楼层
代码和原理图 9833.zip (252.89 KB, 下载次数: 227)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:595904 发表于 2019-8-9 03:18 | 显示全部楼层
关于您在“Arduino+ad9833制作DDS信号发生器代码和原理图 实测成功”的帖子
拜读了您的Arduino+ad9833大做,收获不小。现有个问题请教。关于频率设置方法好像和常规函数发生器不一样。不知为什么不采用常规的设置方法,盼望回复。
回复

使用道具 举报

ID:595904 发表于 2019-8-9 03:19 | 显示全部楼层

拜读了您的Arduino+ad9833大做,收获不小。现有个问题请教。关于频率设置方法好像和常规函数发生器不一样。不知为什么不采用常规的设置方法,盼望回复。
回复

使用道具 举报

ID:387047 发表于 2019-9-16 16:48 | 显示全部楼层
关于您在“Arduino+ad9833制作DDS信号发生器代码和原理图 实测成功”的帖子
拜读了您的Arduino+ad9833大做,收获不小。现有个问题请教。关于频率设置方法好像和常规函数发生器不一样。不知为什么不采用常规的设置方法,盼望回复。
回复

使用道具 举报

ID:718371 发表于 2020-3-29 20:00 | 显示全部楼层
关于您在“Arduino+ad9833制作DDS信号发生器代码和原理图 实测成功”的帖子
拜读了您的Arduino+ad9833大做,收获不小。
回复

使用道具 举报

ID:416995 发表于 2020-9-4 20:40 | 显示全部楼层
没有注释看得脑壳疼
回复

使用道具 举报

ID:55085 发表于 2021-1-8 12:02 | 显示全部楼层
高度赞扬!真是好实践!!!
回复

使用道具 举报

ID:383130 发表于 2021-1-15 08:38 | 显示全部楼层
真的对自己学习有很大的帮助哦
回复

使用道具 举报

ID:55085 发表于 2021-2-9 15:05 | 显示全部楼层
努力自己也制作一个!!!
回复

使用道具 举报

ID:570093 发表于 2021-5-1 15:06 | 显示全部楼层
我的AD9833没有输出波形,各个引脚电压也正常,晶振输出波形也正常,到底啥原因?
回复

使用道具 举报

ID:696930 发表于 2022-3-29 20:55 | 显示全部楼层
下载了,没有提供有MD_AD9833.h头文件
回复

使用道具 举报

ID:1015427 发表于 2022-4-4 13:33 | 显示全部楼层
对学习有很大的帮助哦,赞一个
回复

使用道具 举报

ID:69600 发表于 2022-4-5 20:35 来自手机 | 显示全部楼层
提供一下MD_AD9833.h下库文件
回复

使用道具 举报

ID:1063130 发表于 2023-2-15 16:13 | 显示全部楼层

提供一下MD_AD9833.h下库文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表