Post Go back to editing

How to config DPD on AD9375?

Hi,

I use default DPDconfig to configure DPD on my custom board:

static mykonosDpdConfig_t dpdConfig =
{
    10,              /* 1/2^(damping + 8) fraction of power `forgotten' per sample (default: `1/8192' = 5, valid 0 to 15), 0 = infinite damping*/
    1,              /* number of weights to use for int8_cpx weights weights member of this structure (default = 1)*/
    2,              /* DPD model version: one of four different generalized polynomial models: 0 = same as R0 silicon, 1-3 are new and the best one depends on the PA (default: 2)*/
    1,              /* 1 = Update saved model whenever peak Tx digital RMS is within 1dB of historical peak Tx RMS*/
    20,             /* Determines how much weight the loaded prior model has on DPD modeling (Valid 0 - 32, default 20)*/
    0,              /* Default off = 0, 1=enables automatic outlier removal during DPD modeling */
    512,            /* Number of samples to capture (default: 512, valid 64-32768)*/
    4096,           /* threshold for sample in AM-AM plot outside of 1:1 line to be thrown out. (default: 50% = 8192/2, valid 8192 to 1)*/
    0,              /* 16th of an ORx sample (16=1sample), (default 0, valid -64 to 64)*/
    255,            /* Default 255 (-30dBFs=(20Log10(value/8192)), (valid range  1 to 8191)*/
    {{64,0},{0,0},{0,0}}/* DPD model error weighting (real/imag valid from -128 to 127)*/
};

My system have multi mode BPSK, QPSK, QUAM16,QUAM64 with bandwidth 5MHz, 10MHz, 20Mhz. 

I have feedback Tx2 signal into ORX2 with power -24dbm and configure dpd follow ug992. But i don't see any different between have setup DPD and no have DPD.

Here is status that I read using MYKONOS_getDpdStatus:

 dpdStatus.dpdErrorStatus = 0,

dpdStatus.dpdExtPathDelay = 0x73B ,

dpdStatus.dpdIterCount = 0,

dpdStatus.dpdMaxAdaptation = 0,

dpdStatus.dpdModelErrorPercent = 1000,

dpdStatus.dpdTrackCount = 0

Can you suggest for me how to solve? Thanks. This is my output from tx:



dpdStatus.dpdErrorStatus = 0, dpdStatus.dpdExtPathDelay = 0x73B , dpdStatus.dpdIterCount = 0, dpdStatus.dpdMaxAdaptation = 0, dpdStatus.dpdModelErrorPercent = 1000, dpdStatus.dpdTrackCount = 0
[edited by: sonminh at 2:00 AM (GMT 0) on 24 Apr 2020]
Parents Reply Children
  • What is your target output power,?

    Above measurements are done at different power and hence the variation in ACLR is more.For comparison you need to make measurements at same output power. You can keep Tx1 as primary (center) so that you can read ACLR directly.

    4.5 -28.54 dBm
    4.6 - -26.84 dBm
    4.8 - 25.4 dBm

    Bandwidth is 22MHz , IS the waveform custom?

    The ACLR is not symmetric, The right and left adjacent are having upto 5 dB variation.You may need to correct that for better DPD performnce.

  • Hi

    My system run custom waveform with bandwidth 21.4Mhz. And now different frequency, output power may be not the same. My target output power is 30dbm. Above system has output power with attenuation 30dbm. 

    You say: "The ACLR is not symmetric, The right and left adjacent are having upto 5 dB variation.You may need to correct that for better DPD performence". So what is the maximum different  variation between right and left adjacent that AD9375 can still DPD? 

  • I don't have a exact value for symmetry , Its recommended to be within +/- 1 dB.

    For different power levels the linearity of PA will be different and different ACLR and DPD correction is as well dependent on that. So I guess what you see is expected.

    Mykonos DPD is good for LDMOS PA's where the memory effects are less. For GAN PA's electron trapping adds to short term memory effects and it becomes difficult for DPD to correct.

  • Thanks ,

    Thanks for your information.

    I have implement DPD successful follow your instruction.

    But there is one problem about consume current. My system have limit consume current is 3A.

    When my system run with output power 30dbm, consume current is 1.2A. Once DPD, consume current suddenly increase 2.2A in 0.2 seconds then return 1.2A after that.

    But once my system run at higher power  33dbm, consume current is 1.4A, Once DPD, consume current suddenly increase over 3A. Over current occur and my system be turn off.

    Can you explain this phenomenon and give me solution.

    Thanks

  • When you say Enable DPD , What function is called ? What is the sequence.? 

    Peak current going high, you can try adding some bulk capacitor to PA drain bias , Say 220 UF. 

    Can you share a wide band span spectrum plot of PA output with DPD enabled., Is the output unstable?

  • Hi

    With output power 30dbm, with DPD enable, spectrum plot stable.

    Here is sequence once change frequency and calib DPD:

    mykonosErr_t		mykError;
    
    
    #if DPD_ENABLE
    
    	/*************************************************************************/
    	/*****            Enable DPD calibrations                            *****/
    	/*************************************************************************/
    	uint8_t				errorFlag = 0;
    	uint8_t				errorCode = 0;
    	uint32_t			initCalsCompleted;
    
    	uint32_t initCalMask = TX_BB_FILTER | ADC_TUNER | TIA_3DB_CORNER | DC_OFFSET |
    										  TX_ATTENUATION_DELAY | RX_GAIN_DELAY | FLASH_CAL |
    										  PATH_DELAY | TX_LO_LEAKAGE_INTERNAL | TX_QEC_INIT |
    										  LOOPBACK_RX_LO_DELAY | LOOPBACK_RX_RX_QEC_INIT |
    										  RX_LO_DELAY | RX_QEC_INIT ;
    
    	uint32_t trackingCalMask = TRACK_ORX1_QEC | TRACK_ORX2_QEC | TRACK_RX1_QEC |
    							 TRACK_RX2_QEC | TRACK_TX1_QEC | TRACK_TX2_QEC | TRACK_TX1_LOL | TRACK_TX2_LOL;
    
    	uint32_t initCalMaskDpd = initCalMask | DPD_INIT | CLGC_INIT | VSWR_INIT;
    
    
    #endif
    	if ((mykError = MYKONOS_radioOff(&mykDevice)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why radioOn failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	if ((mykError = MYKONOS_setRfPllFrequency(&mykDevice, TX_PLL, u64TxFrq)) != MYKONOS_ERR_OK) {
    		return MYKONOS_ERR_FAILED;
    	}
    
    #if DPD_ENABLE
    
    	// Make sure PA is ON
    	if((mykError = MYKONOS_abortInitCals(&mykDevice, &initCalsCompleted)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("abortInitCals failed");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    	}
    
    	xil_printf("\r\n Mykonos ARM Initialization Calibrations for DPD");
    
    	if ((mykError = MYKONOS_runInitCals(&mykDevice, (initCalMaskDpd & ~TX_LO_LEAKAGE_EXTERNAL))) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_runInitCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	if ((mykError = MYKONOS_waitInitCals(&mykDevice, 60000, &errorFlag, &errorCode)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_waitInitCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    	 }
    
    	if ((mykError = MYKONOS_getEnabledTrackingCals(&mykDevice, &trackingCalMask)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_getEnabledTrackingCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	trackingCalMask |= TRACK_TX1_DPD | TRACK_TX2_DPD | TRACK_TX1_CLGC | TRACK_TX2_CLGC | TRACK_TX1_VSWR | TRACK_TX2_VSWR;
    
    	if ((mykError = MYKONOS_enableTrackingCals(&mykDevice, trackingCalMask)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why enableTrackingCals failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    #endif
    
    	MYKONOS_radioOn(&mykDevice);
    
    	return MYKONOS_ERR_OK;

  • What is the max current you are seeing when you are running init cals other than DPD?

    Please refer to the max current requirement for Mykonos chip from the datasheet, section "CURRENT AND POWER CONSUMPTION SPECIFICATIONS", table 2.

  • Hi

    Where are document that say ACLR should be symmetric within +- 1dB?

    Thanks

  • There is no document on this. What i mentioned was generic , 1dB is a tight requirement . DPD applies correction with assumption that the IM products are symmetric , 

    You can measure Video bandwidth of your PA and see if the lower and upper IM products are not deviating more than 3 dB,

  • Hi ,

    My system using GaN PA 's. What will happen when use DPD with GaN PA 's ?. What should I do with gaN PA 's and DPD on ADRV9375.

    Thanks