{"id":8324,"date":"2024-04-13T20:32:40","date_gmt":"2024-04-13T15:02:40","guid":{"rendered":"https:\/\/nuclearrambo.com\/wordpress\/?p=8324"},"modified":"2024-10-03T14:56:45","modified_gmt":"2024-10-03T09:26:45","slug":"diy-stm32-and-ad9913-signal-generator-board","status":"publish","type":"post","link":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/","title":{"rendered":"DIY STM32 and AD9913 signal generator board"},"content":{"rendered":"\n<p class=\"has-drop-cap\">The AD9913 direct digital synthesizer works as a digital waveform synthesizer that can generate signals with very precise resolution. When it comes to radio receivers, the AD9913 with &lt;0.05Hz resolution can be used as a beat frequency oscillator for SSB demodulation. As compared to the <a href=\"https:\/\/nuclearrambo.com\/wordpress\/easy-to-use-ad9833-c-library\/\">AD9833<\/a> DDS, the AD9913 has an internal PLL that can internally generate higher sampling rates. This allows us to use a lower-frequency external oscillator. Additionally, the AD9913 is a very low power chip, and it takes very little power. Therefore, this chip generates very little heat.<\/p>\n\n\n\n<p>This circuit generates clean sine wave signals or it may also generate signals based on a frequency ramp profile. &#8216;Frequency profile&#8217; is a very good feature when it comes to generating any frequency varying waveforms. Additionally, frequency profiles can also allow frequency hopping often used in wireless communication systems. The DDS finds itself in many applications but we won&#8217;t dive into those in this article. The main purpose of this article is to show the board design and a basic firmware that is able to generate any frequency in the given limits. The article does not go too deep into the theory. I have simply attempted to demonstrate the &#8220;top level&#8221; working of this board with a few tips here and there to get your design working.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The schematic<\/h2>\n\n\n\n<p>The hardware is designed with help of the reference design provided by Analog devices. It uses three linear voltage regulators: one for powering the microcontroller, one for analog signal conditioning and one for the digital signals controlling the DDS. I could have used a signal regulator for the DDS but I went for three for keeping the output signal generation noise free. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master.drawio.png\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"358\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master.drawio.png\" alt=\"\" class=\"wp-image-8325\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master.drawio.png 981w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master.drawio-300x109.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master.drawio-768x280.png 768w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/a><figcaption class=\"wp-element-caption\">AD9913 and STM32F103 board block diagram<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">The power section<\/h3>\n\n\n\n<p>As described above, I used 3 voltage regulators with 2.6V to 11V input range with part number <a href=\"https:\/\/www.analog.com\/en\/products\/adp3334.html\">ADP3334<\/a>. Although quite expensive, I wanted to consume the stock of these regulators that I already own. Feedback resistors at the output set the output voltage of the regulator. <\/p>\n\n\n\n<p>You can either calculate the feedback resistor network on your own or refer the datasheet and use the suggested values. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/voltage_setting_table.png\"><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"252\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/voltage_setting_table.png\" alt=\"\" class=\"wp-image-8326\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/voltage_setting_table.png 553w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/voltage_setting_table-300x137.png 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/a><\/figure>\n\n\n\n<p>I went the easy route and used the suggested resistor values and design my schematic as shown below.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"1024\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1-868x1024.png\" alt=\"\" class=\"wp-image-8328\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1-868x1024.png 868w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1-254x300.png 254w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1-768x906.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_schematic-1.png 951w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/><\/a><figcaption class=\"wp-element-caption\">ADP3334 schematic in Altium Designer<\/figcaption><\/figure>\n\n\n\n<p>The simplest schematic suggested by Analog devices allows you to skip the input capacitors and only have a single 1uF capacitor at the output. For better noise rejection and stability, I chose to add the input and output capacitors. Additionally, I also added a LC filter at the output for further noise filtering. Based on your choice, you can decide to bypass it with a 0 Ohm resistor.<\/p>\n\n\n\n<p>There is another regulator that generates analog 1V8 supply for the DDS core and that&#8217;s not shown here.<\/p>\n\n\n\n<center><p><script type=\"text\/javascript\">\n\tatOptions = {\n\t\t'key' : 'a488f095e80c8a74746e5fdca977eaea',\n\t\t'format' : 'iframe',\n\t\t'height' : 90,\n\t\t'width' : 728,\n\t\t'params' : {}\n\t};\n\tdocument.write('<scr' + 'ipt type=\"text\/javascript\" src=\"http' + (location.protocol === 'https:' ? 's' : '') + ':\/\/www.profitabledisplaynetwork.com\/a488f095e80c8a74746e5fdca977eaea\/invoke.js\"><\/scr' + 'ipt>');\n<\/script><\/p><\/center>\n\n\n\n<h3 class=\"wp-block-heading\">Microcontroller<\/h3>\n\n\n\n<p>The <a href=\"https:\/\/www.mouser.in\/ProductDetail\/STMicroelectronics\/STM32F103C8T6?qs=bhCVus9SdFtq6kqxsU5%2FDA%3D%3D\">STM32F103C8T6<\/a> might be one of the most used microcontrollers in my projects. As a result, it became the controller of my choice for this project. It&#8217;s definitely an overkill of a microcontroller for this project but its already quite inexpensive, so who cares?<\/p>\n\n\n\n<p>The STM32F103C8T6 is powered by a 3V3 supply generated by the ADP3334 regulator we discussed above. I brought out the SPI port and a few GPIO pins that control the AD9913 DDS. Additionally, I also brought out spare GPIO pins on an SMD header which may come handy when I am using this board for a more complex project. I also brought out the SWD port on a 4 pin header useful for programming the controller. Apart from the interfaces, each power pin has a couple of decoupling capacitors for noise filtering.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"699\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic-1024x699.png\" alt=\"\" class=\"wp-image-8329\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic-1024x699.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic-300x205.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic-768x524.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/controller_schematic.png 1500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">STM32F103 controller interfaces with AD9913<\/figcaption><\/figure>\n\n\n\n<p>An additional level translator is needed for connecting the controller with the AD9913. The level translator converts 3V3 signals from the microcontroller to 1V8 level required by the DDS. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/level_translator.png\"><img loading=\"lazy\" decoding=\"async\" width=\"835\" height=\"402\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/level_translator.png\" alt=\"\" class=\"wp-image-8330\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/level_translator.png 835w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/level_translator-300x144.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/level_translator-768x370.png 768w\" sizes=\"auto, (max-width: 835px) 100vw, 835px\" \/><\/a><\/figure>\n\n\n\n<p>Before we look at the AD9913 schematic, lets have a quick look at the clocking section.<\/p>\n\n\n\n<p>For best frequency stability, <a href=\"https:\/\/abracon.com\/Oscillators\/AST3TQ-28.pdf\">AST3TQ-T-25.000MHz-28<\/a> works out to be the best. It has an initial frequency tolerance of 0.3ppm and a <span style=\"text-decoration: underline;\">+<\/span>280ppb stability across the industrial temperature range. Now, to have such nice stability also requires a lot of money. For general use, you could go with something like <a href=\"https:\/\/www.digikey.in\/en\/products\/detail\/connor-winfield\/CWX823-025-0M\/695444\">CWX823-25.00 TCXO<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Clocking<\/h3>\n\n\n\n<p>The AD9913 DDS can be clocked both ways, single ended or differential. Apparently, there appears to be no problem with either approach. Nevertheless, I included a transformer for single ended to differential conversion whose footprint went wrong in the first version, and I had to flip the part 90 degrees while soldering it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential-1024x601.png\" alt=\"\" class=\"wp-image-8331\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential-1024x601.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential-300x176.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential-768x451.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/single-ended-to-differential.png 1063w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Single ended to differential conversion of clock <\/figcaption><\/figure>\n\n\n\n<p>Prior to this conversion, I have an additional clock buffer CDCLVC1104PWR that takes TCXO signal and splits out into 4 buffered clock outputs. In case you wish to use the same TCXO and synchronize other modules, you can pull out the buffered output and connect that to other modules. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"207\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer-1024x207.png\" alt=\"\" class=\"wp-image-8332\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer-1024x207.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer-300x61.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer-768x155.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer-1536x311.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/clock_buffer.png 1606w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Clock buffer<\/figcaption><\/figure>\n\n\n\n<center><p><script type=\"text\/javascript\">\n\tatOptions = {\n\t\t'key' : 'a488f095e80c8a74746e5fdca977eaea',\n\t\t'format' : 'iframe',\n\t\t'height' : 90,\n\t\t'width' : 728,\n\t\t'params' : {}\n\t};\n\tdocument.write('<scr' + 'ipt type=\"text\/javascript\" src=\"http' + (location.protocol === 'https:' ? 's' : '') + ':\/\/www.profitabledisplaynetwork.com\/a488f095e80c8a74746e5fdca977eaea\/invoke.js\"><\/scr' + 'ipt>');\n<\/script><\/p><\/center>\n\n\n\n<h3 class=\"wp-block-heading\">Output conditioning<\/h3>\n\n\n\n<p>The AD9913 DDS produces differential output. I used OPA683 operational amplifier to convert this differential signal to single ended output. Furthermore, I have also configured the circuit to block DC on the inputs and output. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"553\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-1024x553.png\" alt=\"\" class=\"wp-image-8333\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-1024x553.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-300x162.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-768x415.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-1536x830.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/output-conditioning-2048x1106.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">AD9913 output conditioning with OPA683 opamp<\/figcaption><\/figure>\n\n\n\n<p>Now that we are done understanding the hardware schematic, lets move on to the firmware section.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The PCB Layout<\/h2>\n\n\n\n<p>I did the PCB layout in Altium Designer. Here, I started by placing the regulator section first. Referring to the recommendations provided by the chip manufacturer guarantees better chances of your design working in the first attempt. <\/p>\n\n\n\n<p>Also, before starting any PCB layout, I ensure to set my PCB stack up properly. I used a 4-layer stackup with first layer for signals, second layer for ground, third layer for power and the fourth layer for general signal routing. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout.png\"><img loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"1024\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout-744x1024.png\" alt=\"AD9913 DDS and ADP3334 pcb layout\" class=\"wp-image-8334\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout-744x1024.png 744w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout-218x300.png 218w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout-768x1058.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/regulator_layout.png 1090w\" sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/a><figcaption class=\"wp-element-caption\">ADP3334 layout<\/figcaption><\/figure>\n\n\n\n<p>When layout the regulator section, I tried keeping the decoupling capacitors and filters closer together to ensure minimum noise pickup a small ground loops. Since, this board is a 4 layer board, I routed certain power rails from the 3rd layer.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"686\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane-1024x686.png\" alt=\"AD9913 DDS pcb layout\" class=\"wp-image-8335\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane-1024x686.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane-300x201.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane-768x515.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane-1536x1029.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/power-plane.png 1827w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Power plane<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"700\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer-1024x700.png\" alt=\"AD9913 DDS pcb layout\" class=\"wp-image-8336\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer-1024x700.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer-300x205.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer-768x525.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer-1536x1050.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/bottom-layer.png 1801w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Bottom layer<\/figcaption><\/figure>\n\n\n\n<p>The microcontroller and its decoupling capacitors went down on the bottom layer. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"709\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer-1024x709.png\" alt=\"AD9913 DDS pcb layout\" class=\"wp-image-8337\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer-1024x709.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer-300x208.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer-768x532.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer-1536x1063.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/top_layer.png 1813w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Top layer<\/figcaption><\/figure>\n\n\n\n<p>Observe carefully, how the power traces are thicker than the other signal tracks. This is to ensure low impedance power path. <\/p>\n\n\n\n<p>Additionally, also observe the copper under the capacitors has been removed to reduce all parasitic capacitances. Finally, the output signal is drawn out from an SMA connector on the edge.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"789\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d-1024x789.png\" alt=\"\" class=\"wp-image-8350\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d-1024x789.png 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d-300x231.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d-768x592.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d-1536x1184.png 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/ad9913_dds_3d.png 2043w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">AD9913 DDS Firmware for STM32 microcontroller<\/h2>\n\n\n\n<p>It&#8217;s important to program the AD9913 DDS chip to make it function properly. There are a bunch of registers that set the frequency and phase of the output signal. Additionally, two configuration registers control the overall chip behaviour.<\/p>\n\n\n\n<p>I wrote register definitions in the header file such that each bit can be configured independently. Furthermore, my easy-to-use library allows me to quickly set the output frequency. An output scaling register allows me to control the output amplitude.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dac_ad9913.bit.FS_C = 425; \/\/Controls the amplitude<\/pre>\n\n\n\n<p>To set the output frequency, call this function.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ftw_ad9913.bit.freq_tuning_word = AD9913_calculateFreqReg(70000000, sys_clk);<\/pre>\n\n\n\n<p>After every SPI transaction, we need to toggle the IO_Update pin for the configuration to take effect.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);<\/pre>\n\n\n\n<p>The full configuration section is shown below.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  HAL_GPIO_WritePin(MRESET_GPIO_Port, MRESET_Pin, GPIO_PIN_SET);\n  HAL_Delay(1);\n  HAL_GPIO_WritePin(MRESET_GPIO_Port, MRESET_Pin, GPIO_PIN_RESET);\n\n  cfr1_ad9913.reg = 0x00000000;\n  cfr1_ad9913.bit.sin_out_en = 0;\n  cfr1_ad9913.bit.sync_clk_disable = 0;\n  dac_ad9913.reg = 0x00000000;\n  dac_ad9913.bit.FS_C = 425;\n\n  ftw_ad9913.bit.freq_tuning_word = AD9913_calculateFreqReg(70000000, sys_clk);\n  HAL_Delay(10);\n  AD9913_writeSPI_32bit(SPI1_CS_GPIO_Port, SPI1_CS_Pin, &amp;hspi1, cfr1_ad9913.reg, CFR1_ADDRESS);\n  HAL_Delay(4);\n  AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);\n\n  cfr2_ad9913.reg = 0x00000000;\n  cfr2_ad9913.bit.pll_pwr_down = 0;\n  cfr2_ad9913.bit.pll_reset = 1;\n  cfr2_ad9913.bit.pll_mul_factor = 0x0C;\n  cfr2_ad9913.bit.pll_out_div_2 = 0;\n  cfr2_ad9913.bit.pll_input_div_2 = 0;\n  cfr2_ad9913.bit.vco2_sel = 0;\n  cfr2_ad9913.bit.cmos_clk_mode = 0;\n  cfr2_ad9913.bit.crystal_clk_mode = 0;\n  AD9913_writeSPI_16bit(SPI1_CS_GPIO_Port, SPI1_CS_Pin, &amp;hspi1, cfr2_ad9913.reg, CFR2_ADDRESS);\n  HAL_Delay(4);\n  AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);\n\n  AD9913_writeSPI_16bit(SPI1_CS_GPIO_Port, SPI1_CS_Pin, &amp;hspi1, cfr2_ad9913.reg, CFR2_ADDRESS);\n  HAL_Delay(4);\n  AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);\n\n  AD9913_writeSPI_32bit(SPI1_CS_GPIO_Port, SPI1_CS_Pin, &amp;hspi1, dac_ad9913.reg, DAC_ADDRESS);\n  HAL_Delay(4);\n  AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);\n\n  AD9913_writeSPI_32bit(SPI1_CS_GPIO_Port, SPI1_CS_Pin, &amp;hspi1, ftw_ad9913.reg, FTW_ADDRESS);\n  HAL_Delay(3);\n  AD9913_IO_UPDATE(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin);<\/pre>\n\n\n\n<p>It&#8217;s imperative that we reset the chip using &#8220;Master reset&#8221; pin. Without the reset, the DDS exhibits very unpredictable behaviour.<\/p>\n\n\n\n<center><p><script type=\"text\/javascript\">\n\tatOptions = {\n\t\t'key' : 'a488f095e80c8a74746e5fdca977eaea',\n\t\t'format' : 'iframe',\n\t\t'height' : 90,\n\t\t'width' : 728,\n\t\t'params' : {}\n\t};\n\tdocument.write('<scr' + 'ipt type=\"text\/javascript\" src=\"http' + (location.protocol === 'https:' ? 's' : '') + ':\/\/www.profitabledisplaynetwork.com\/a488f095e80c8a74746e5fdca977eaea\/invoke.js\"><\/scr' + 'ipt>');\n<\/script><\/p><\/center>\n\n\n\n<h2 class=\"wp-block-heading\">Debugging<\/h2>\n\n\n\n<p>We all love a way to know if our design works correctly. Fortunately, there is one way to verify the clocking network by observing the SYNC_CLK pin of the DDS chip. It so happened in the beginning that I wasn&#8217;t able to get a signal out of the DDS. By observing if there was a signal on the SYNC_CLK I could at least verify that my board was working fine. By default, the DDS outputs a signal of the same frequency as REF_CLK. For example, if your TCXO is 25MHz, then you should be able to observe 25MHz on the SYNC_CLK pin using an <a href=\"https:\/\/amzn.to\/3VXb8S0\">oscilloscope<\/a>. <\/p>\n\n\n\n<p>Furthermore, when you program the PLL to produce, lets say, 100MHz, then your SYNC_CLK should output 100MHz. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0002.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0002.png\" alt=\"\" class=\"wp-image-8338\" style=\"width:639px;height:auto\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0002.png 800w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0002-300x180.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0002-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">REF CLK after the clock buffer<\/figcaption><\/figure>\n\n\n\n<p>While getting my board to work, I wasn&#8217;t able to consistently produce any output on the SYNC_CLK. It was at that moment that I realized that I needed to reset the chip before programming the registers. After asserting master reset for 1 ms, and then following the configuration sequence resolved most of my problems. I could consistently program the chip and obtain the desired signal out of the DDS.<\/p>\n\n\n\n<p>So, here are a few screenshots that demonstrate various output frequencies produced by the DDS. The true spectral purity of the DDS should be observed on a spectrum analyzer. Unfortunately, I do not have the spectrum analyzer at hand. <\/p>\n\n\n\n<p>I will definitely post part 2 of this article where I would implement the frequency ramps, triangle output, frequency modulation, etc.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0003-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0003-1.png\" alt=\"\" class=\"wp-image-8344\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0003-1.png 800w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0003-1-300x180.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0003-1-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Generating 7.1MHz from the AD9913 DDS<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0001-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0001-1.png\" alt=\"\" class=\"wp-image-8345\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0001-1.png 800w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0001-1-300x180.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0001-1-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Generating 70.5MHz from the AD9913. <\/figcaption><\/figure>\n\n\n\n<p>Due to the low pass response of the Opamp, I had to pump up the output scaling factor on the DDS. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0006-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0006-1.png\" alt=\"\" class=\"wp-image-8347\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0006-1.png 800w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0006-1-300x180.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/DS0006-1-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">95MHz out of the DDS<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>AD9913 DDS is a very versatile DDS which could be used like a VFO in an amateur radio receiver. It could also be used for generating a frequency ramp for a stepped frequency radar. If not for anything, it could at least be used as a low-frequency signal generator on your desk.<\/p>\n\n\n\n<p>I made a few extra boards for myself. If you happen to love the design and wish to purchase it, let me know in the email below.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Email me to buy at: salil at nuclearrambo.com<\/h2>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-pale-pink-color has-text-color has-link-color wp-elements-027a63faa18ea3b93eb81637ded38910\"><a href=\"https:\/\/amzn.to\/3VXb8S0\">BUY an oscilloscope<\/a><\/h2>\n<h4>Incoming search terms:<\/h4><ul><li><a href=\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\" title=\"ad9913 \u0441\u0445\u0435\u043c\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\">ad9913 \u0441\u0445\u0435\u043c\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><\/li><li><a href=\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\" title=\"how to properly configure analog devices rf transmitter using stm32 microcontroller\">how to properly configure analog devices rf transmitter using stm32 microcontroller<\/a><\/li><li><a href=\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\" title=\"PLL DDS\">PLL DDS<\/a><\/li><\/ul>","protected":false},"excerpt":{"rendered":"<p>The AD9913 direct digital synthesizer works as a digital waveform synthesizer that can generate signals with very precise resolution. When it comes to radio receivers, the AD9913 with &lt;0.05Hz resolution can be used as&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":8349,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1694,1212],"tags":[1803,1804,170,1700,1556,1645,1776],"class_list":["post-8324","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-amateur-radio","category-electronics-2","tag-ad991","tag-ad9913-dds","tag-electronics","tag-embedded","tag-ham-radio","tag-rf","tag-stm32"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DIY STM32 and AD9913 signal generator board<\/title>\n<meta name=\"description\" content=\"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DIY STM32 and AD9913 signal generator board\" \/>\n<meta property=\"og:description\" content=\"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\" \/>\n<meta property=\"og:site_name\" content=\"Nuclearrambo\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-13T15:02:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-03T09:26:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master-e1713019890918.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"915\" \/>\n\t<meta property=\"og:image:height\" content=\"599\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"nuclearrambo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@darkusul\" \/>\n<meta name=\"twitter:site\" content=\"@darkusul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"nuclearrambo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\"},\"author\":{\"name\":\"nuclearrambo\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c\"},\"headline\":\"DIY STM32 and AD9913 signal generator board\",\"datePublished\":\"2024-04-13T15:02:40+00:00\",\"dateModified\":\"2024-10-03T09:26:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\"},\"wordCount\":1609,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\"},\"keywords\":[\"ad991\",\"ad9913 dds\",\"electronics\",\"embedded\",\"ham radio\",\"rf\",\"stm32\"],\"articleSection\":[\"Amateur Radio\",\"Electronics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\",\"name\":\"DIY STM32 and AD9913 signal generator board\",\"isPartOf\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#website\"},\"datePublished\":\"2024-04-13T15:02:40+00:00\",\"dateModified\":\"2024-10-03T09:26:45+00:00\",\"description\":\"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library\",\"breadcrumb\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/nuclearrambo.com\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DIY STM32 and AD9913 signal generator board\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#website\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/\",\"name\":\"Nuclearrambo\",\"description\":\"Information is FREE! Progress is MUST! Awakening is inevitable!\",\"publisher\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nuclearrambo.com\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\",\"name\":\"Nuclearrambo\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png\",\"contentUrl\":\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png\",\"width\":1489,\"height\":1152,\"caption\":\"Nuclearrambo\"},\"image\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/darkusul\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c\",\"name\":\"nuclearrambo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g\",\"caption\":\"nuclearrambo\"},\"description\":\"Salil is an electronics enthusiast working on various electronics systems. In his free time he writes on the blog, talks over ham radio or builds circuits. He has Yaesu FT2900R VHF transceiver, FT450D HF transceiver, TYT UV8000E and Quansheng UVK6 Handheld transceivers.\",\"sameAs\":[\"http:\/\/nuclearrambo.com\/wordpress\"],\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DIY STM32 and AD9913 signal generator board","description":"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/","og_locale":"en_US","og_type":"article","og_title":"DIY STM32 and AD9913 signal generator board","og_description":"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library","og_url":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/","og_site_name":"Nuclearrambo","article_published_time":"2024-04-13T15:02:40+00:00","article_modified_time":"2024-10-03T09:26:45+00:00","og_image":[{"width":915,"height":599,"url":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2024\/04\/signal_master-e1713019890918.jpg","type":"image\/jpeg"}],"author":"nuclearrambo","twitter_card":"summary_large_image","twitter_creator":"@darkusul","twitter_site":"@darkusul","twitter_misc":{"Written by":"nuclearrambo","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#article","isPartOf":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/"},"author":{"name":"nuclearrambo","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c"},"headline":"DIY STM32 and AD9913 signal generator board","datePublished":"2024-04-13T15:02:40+00:00","dateModified":"2024-10-03T09:26:45+00:00","mainEntityOfPage":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/"},"wordCount":1609,"commentCount":3,"publisher":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization"},"keywords":["ad991","ad9913 dds","electronics","embedded","ham radio","rf","stm32"],"articleSection":["Amateur Radio","Electronics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/","url":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/","name":"DIY STM32 and AD9913 signal generator board","isPartOf":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#website"},"datePublished":"2024-04-13T15:02:40+00:00","dateModified":"2024-10-03T09:26:45+00:00","description":"I made a small PCB for AD9913 DDS (direct digital synthesizer) interfaced to an STM32F103 and made it work using a custom C library","breadcrumb":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nuclearrambo.com\/wordpress\/diy-stm32-and-ad9913-signal-generator-board\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nuclearrambo.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"DIY STM32 and AD9913 signal generator board"}]},{"@type":"WebSite","@id":"https:\/\/nuclearrambo.com\/wordpress\/#website","url":"https:\/\/nuclearrambo.com\/wordpress\/","name":"Nuclearrambo","description":"Information is FREE! Progress is MUST! Awakening is inevitable!","publisher":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nuclearrambo.com\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization","name":"Nuclearrambo","url":"https:\/\/nuclearrambo.com\/wordpress\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/","url":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png","contentUrl":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png","width":1489,"height":1152,"caption":"Nuclearrambo"},"image":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/darkusul"]},{"@type":"Person","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c","name":"nuclearrambo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g","caption":"nuclearrambo"},"description":"Salil is an electronics enthusiast working on various electronics systems. In his free time he writes on the blog, talks over ham radio or builds circuits. He has Yaesu FT2900R VHF transceiver, FT450D HF transceiver, TYT UV8000E and Quansheng UVK6 Handheld transceivers.","sameAs":["http:\/\/nuclearrambo.com\/wordpress"],"url":"https:\/\/nuclearrambo.com\/wordpress\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/8324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/comments?post=8324"}],"version-history":[{"count":4,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/8324\/revisions"}],"predecessor-version":[{"id":8395,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/8324\/revisions\/8395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/media\/8349"}],"wp:attachment":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/media?parent=8324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/categories?post=8324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/tags?post=8324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}