I’m using AD9102, I write and read in all register but I haven't output signal.
What is the minimum registers configuration for generate a signal?
Can it work without calibration?
In attachment the schematic.
Regards.
Valentino
AD9102
Production
The AD9102 TxDAC and waveform generator is a high performance digital-to-analog converter (DAC) integrating on-chip pattern memory for complex waveform...
Datasheet
AD9102 on Analog.com
I’m using AD9102, I write and read in all register but I haven't output signal.
What is the minimum registers configuration for generate a signal?
Can it work without calibration?
In attachment the schematic.
Regards.
Valentino
Hello Larry,
Yes it is true the paragraph discusses RAMUPDATE, but there is no example of a minimum control sequence in the data sheet, which I think many users would have found helpful (as evidenced…
Hello Larry,
I also seem to have two other problems.
1. DDS Clock Source
I cannot make the DDS_MSB_EN work in the DDS_CONFIG register.
My assumption is that if I program the RAM to have two values…
Hello Valemea,
I struggled with this as well. The documentation is appalling.
Anyway, the secret of making it work is to understand that it is only the shadow registers that are updated when you write to the register set. We used a clock frequency of 167.772160 MHz to give a 10 Hz step resolution. This is the sequence I used to output a sine wave based on the built in DDS sine wave generator:
Out_port(~ad9102_nTrigger, ad9102_nTrigger); //Trigger is off
Out_port(~sig_gen_reset,sig_gen_reset ); //reset is inactive
usleep(100); //I don't know how long it takes to come out of reset - not in data sheet
sig_gen_control_701(SPICONFIG, 0x0); //use 4 wire mode - seperate transmit and receive pins
sig_gen_control_701(POWERCONFIG,0); //set the power config
sig_gen_control_701(CLOCKCONFIG,0); //set the clock config
sig_gen_control_701(DDS_TW32, 0); //we go for 1000 Hz, in 10 Hz steps = 100. 0 in upper word
sig_gen_control_701(DDS_TW1, 100 <<8); //1kHz, but in upper 8 bits of lower tuning word
sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4); //set the gain to 1. DAC_GAINx1 = 0400h
sig_gen_control_701(DACDOF, 0); //No offset
sig_gen_control_701(WAV_CONFIG, WAVE_DDS_SINE | WAVE_prestored); //set the waveform to DDS SINE
sig_gen_control_701(PAT_TYPE,0); //repeat continuously
sig_gen_control_701(RAMUPDATE,1); //update all SPI registers --ABSOLUTELY CRUCIAL
sig_gen_control_701(PAT_STATUS,1); //start pattern
Out_port(~ad9102_nTrigger, 0); //Start Trigger
After that you can change frequency with:
sig_gen_control_701(DDS_TW32, freq_value >> 8); //put bits [23..8] in upper tuning word
sig_gen_control_701(DDS_TW1, (freq_value & 0xFF) << 8); //put bits [7..0] upper 8 bits of lower tuning word
sig_gen_control_701(RAMUPDATE,1); //update all SPI registers --ABSOLUTELY CRUCIAL
I hope this helps.
Bart
Hello Valemea,
I struggled with this as well. The documentation is appalling.
Anyway, the secret of making it work is to understand that it is only the shadow registers that are updated when you write to the register set. We used a clock frequency of 167.772160 MHz to give a 10 Hz step resolution. This is the sequence I used to output a sine wave based on the built in DDS sine wave generator:
Out_port(~ad9102_nTrigger, ad9102_nTrigger); //Trigger is off
Out_port(~sig_gen_reset,sig_gen_reset ); //reset is inactive
usleep(100); //I don't know how long it takes to come out of reset - not in data sheet
sig_gen_control_701(SPICONFIG, 0x0); //use 4 wire mode - seperate transmit and receive pins
sig_gen_control_701(POWERCONFIG,0); //set the power config
sig_gen_control_701(CLOCKCONFIG,0); //set the clock config
sig_gen_control_701(DDS_TW32, 0); //we go for 1000 Hz, in 10 Hz steps = 100. 0 in upper word
sig_gen_control_701(DDS_TW1, 100 <<8); //1kHz, but in upper 8 bits of lower tuning word
sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4); //set the gain to 1. DAC_GAINx1 = 0400h
sig_gen_control_701(DACDOF, 0); //No offset
sig_gen_control_701(WAV_CONFIG, WAVE_DDS_SINE | WAVE_prestored); //set the waveform to DDS SINE
sig_gen_control_701(PAT_TYPE,0); //repeat continuously
sig_gen_control_701(RAMUPDATE,1); //update all SPI registers --ABSOLUTELY CRUCIAL
sig_gen_control_701(PAT_STATUS,1); //start pattern
Out_port(~ad9102_nTrigger, 0); //Start Trigger
After that you can change frequency with:
sig_gen_control_701(DDS_TW32, freq_value >> 8); //put bits [23..8] in upper tuning word
sig_gen_control_701(DDS_TW1, (freq_value & 0xFF) << 8); //put bits [7..0] upper 8 bits of lower tuning word
sig_gen_control_701(RAMUPDATE,1); //update all SPI registers --ABSOLUTELY CRUCIAL
I hope this helps.
Bart