Post Go back to editing

Issues generating 4 DDS sine waves with independently variable amplitude, phase, and frequency

Category: Hardware
Product Number: AD9106
Our ultimate goal is to be able to generate 4 sine wave voltages with independently variable phase, amplitude, and frequency. We are able to successfully control the AD9106 and have confirmed that we can read/write to registers, start/stop/update patterns and have observed example waveforms on an oscilloscope. We recently attempted to program the AD9106 to output identical sine waves on each of the DACs by uploading the data values in the myVals array to the corresponding addresses in regAdd provided below. DACs 1,3, and 4 appear to be identical, however, DAC2 is outputting about 10x less voltage and has a noticeable phase shift as seen in the attached picture. We replaced the connections to DAC2 and went over the register values, but we cannot find any place where DAC2 differs from the other DACs. The relevant registers for DAC2 we found are 

DAC2AGAIN 0x06
DAC2RSET 0x0B
DAC2DOF 0x24
WAV2_1CONFIG 0x27
DAC2_1PATx 0x2B
DAC2_CST 0x30
DAC2_DGAIN 0x34
SAW2_1CONFIG 0x37
DDS2_PW 0x42
DDSx_CONFIG 0x45
START/STOP DDS CONFIG (0x58 - 0x5B)

What could be causing the output problems on DAC2 and how could we fix them?

Moreover, we want to be able to control the parameters of the waves independently of each other. For amplitude and phase, we accomplished this using the DACX_DGAIN and DDSx_PHASE registers. Since the DDS is a shared resource, we figured that the frequency of the sine waves can't be modified independently. However, we noticed that changing the values of the DDS tuning word in the DDSTW_MSB and DDSTW_LSB registers also affects the amplitude of the waves. The amplitudes for the waves are seen to vary proportionally with the tuning word. We would like to be able to change frequency without affecting the other parameters of the sine waves. Is this possible on the AD9106? 

uint16_t myVals[66] = {
      0x0000, 0x0e00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
      0x1f00, 0x1f00, 0x1f00, 0x1f00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
      0x0000, 0x0000, 0x0000, 0x3232, 0x3232, 0x0111, 0x8fff, 0x0101, 0x0101,
      0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, 0x4000,
      0x4000, 0x0000, 0x0000, 0x0050, 0x7500, 0x0000, 0x0000, 0x0000, 0x0000,
      0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
      0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
      0x0001, 0x0001, 0x0001};
 
uint16_t regAdd[66] = {
    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
    0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x001f, 0x0020, 0x0022,
    0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b,
    0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,
    0x0035, 0x0036, 0x0037, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043,
    0x0044, 0x0045, 0x0047, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055,
    0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e,
    0x005f, 0x001e, 0x001d};
Parents
  • Hi  ,

    Thank you for your interest in AD9106. Each DAC channel can independently control gain and phase based on the on-chip DDS. However, the 4 DACs cannot have different frequencies if the on-chip DDS is used because, as you mentioned, the DDS is a global shared resource. To generate different frequencies for each channel, you must generate a sinewave using the on-chip SRAM, and each channel will have an allocated start/stop address. Related query here: (+) Output different frequencise on AD9106 - Q&A - High-Speed DACs - EngineerZone (analog.com). More details on Page 27 of the datasheet. 

    Also, the DDS tuning word only affects frequency, not the amplitude of the waveform. It's likely that there is a component in your output datapath that has a certain bandwidth so increasing the frequency attenuates your waveform. Can you share your schematic? If all the 4 DAC datapaths are identical, the outputs in the 4 channels should be the same.

    Also, if a register will not be used in your application, please set it to its default value as it will likely have an effect on your waveform. For instance, Register 0x0E is set to 0 when is should be set to 0x0E. 

    Best regards,
    Marco

  • Would you recommend we use an external clock to obtain better performance at low frequencies? The most important thing for us is to be able to control phase, amplitude and DDS frequency independently of each other.

  • Hi  ,

    I agree it's unnatural for DAC2 output to have 10x less voltage than the other DACs. What version of EVAL-AD9106 are you using? If you could probe at the DAC2 outputs directly (with the jumper connections removed in JP9/JP10) and see if the issue still persists. If the output is still less than the other DACs, there might be a problem with the evaluation board. 

    ad9106-ardz-ebz_schematic.pdf (analog.com)

    Also, since you are operating in low frequencies (Hz-kHz range), the clock solution in the Evaluation Board needs to be configured for this low frequency. The clock input has to be lowered (max of 100 kHz?) so it's still proportional for an output of 2Hz-2kHz, then you can follow Figure 39 in the datasheet (single ended 1.8V CMOS clock) like below. The balun T9 needs to be bypassed, or be replaced with a Balun with a bandwidth that accommodates a lower frequency. You may also try to increase the value of the coupling capacitor (C44) or short that component altogether to ensure that the input clock frequency won’t be blocked.

    Regarding the FAQ# 14, the clipping when (digital data x digital gain) + digital offset is greater than the IOUTFS is for the current out of AD9106. The current is only limited to the range 0 to IOUTFS, and anything beyond this is clipped. It is not related to the waveform clipping you observed in the oscilloscope. For the full-scale current, IOUTFS = 32* Vrefio/Rsetx. Nominally, VREFIO is 1V and RSETx is 8kΩ which gives an IOUTFS of 4mA. 

    For the I2C, you can connect to the I2C pins in the Arduino Uno, but make sure that you use a different subordinate address for the other devices you will be connecting, as 0x52 is reserved for the EEPROM in EVAL-AD9106. 

    Best regards,
    Marco

  • Hi Marco, 

    Thanks for the feedback. We made a repost here with some of the updates we've had. Notably, the DAC2 issue isn't present in our replacement EVAl-AD9106 board. 

    We will look into using an external clock input to achieve better low frequency performance. With that in mind, do you know where we could find data on the frequency dependence of the amplitude and phase of the board? 

    If the waveform clipping we observed on the oscilloscope isn't related to the limiting of the full scale current output, do you know what could be causing it? We are getting output rms voltages of around 450mV maximally when sourcing from the DDS and using the on-board amplifiers before we see clipping. 

    How could we calculate what the expected voltage output of the EVAL-AD9106 board will be given the register values? 

    Thanks,

    Vishwanath. 

  • Thanks for the heads-up, I will provide a response to that thread instead. 

Reply Children
No Data