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
  • HI ,

    I have mistake once post this question in to that forum, then I received this answer:

    "Moving to No-Os forum for comments on the DPD configuration"

    Because I don't know delete that question, I have post again in this forum.

    Thanks

  • 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

  • AD9375 DPD has limited number of GMP terms and that may not work well with GaN PA's. I guess all our test reports are with LDMOS PA's.

    https://www.analog.com/en/applications/technology/sdr-radioverse-pavilion-home/wideband-transceivers/digital-pre-distortion.html  --> Power Amplifier Test Report

  • Thanks for your infomation.

    Because my system using GaN PA 's. So i try to use DPD on ad9375 at frequency that may be DPD. I implement high speed transmission 100Mbps between 2 system with have DPD and then run  between 2 system No DPD to compare. I see system NO DPD work much  better  than system HAVE DPD( speed higher).  Although spectrum of system have dpd better than no dpd and status of DPD return 0 (no error  ).

    Here is spectrum of system NO HAVE DPD:

    And here is spectrum of system  HAVE DPD:

    Can you give me solution ?

    Thanks

  • I see system NO DPD work much  better  than system HAVE DPD

    Why you say so?  The second plot with DPD seems to be better.(Have DPD)

    What is the target ACLR and what is the measured ACLR after DPD? 

Reply Children