📄 cal_gen3.c
字号:
copyPcdac = max_pcdac;
for (ii=0; ii<pRawDataset_gen3[mode]->numChannels; ii++)
{
channel = pRawDataset_gen3[mode]->pDataPerChannel[ii].channelValue;
if (ii == 0)
{
art_resetDevice(devNum, txStation, NullID, channel, 0);
} else
{
art_changeChannel(devNum, channel); // for efficiency
}
uiPrintf("ch: %d --> ", channel);
//** the following added by ccshiang
myAtten = saved_myAtten + agiGetCableLost(channel);
//uiPrintf("L%d, myAtten = %g\n",_module_line(),myAtten);
//** the above added by ccshiang
if (CalSetup.cal_mult_xpd_gain_mask[mode] == 0) {
if((swDeviceID & 0xff) >= 0x16) { // derby2
jj = art_getFieldForMode(devNum,"rf_pdgain_lo", devlibMode, BASE);
kk = art_getFieldForMode(devNum,"rf_pdgain_hi", devlibMode, BASE);
pRawDataset_gen3[mode]->xpd_mask = ((1 << jj) | (1 << kk));
xgain_list[0] = jj;
xgain_list[1] = kk;
} else { // derby1
jj = art_getFieldForMode(devNum,"rf_xpd_gain", devlibMode, BASE);
kk = jj;
pRawDataset_gen3[mode]->xpd_mask = (1 << jj);
xgain_list[0] = jj;
xgain_list[1] = kk;
}
} else {
jj = 0;
pRawDataset_gen3[mode]->xpd_mask = (A_UINT16) CalSetup.cal_mult_xpd_gain_mask[mode];
xpd_gain = CalSetup.cal_mult_xpd_gain_mask[mode];
kk = 0;
ll = 0;
while (ll < 4) {
if ((xpd_gain & 0x1) == 1) {
if (kk > 2) {
uiPrintf("ERROR: A maximum of 2 xpd_gains allowed to be specified in the rf_xpd_gain parameter in the eep file.\n");
exit(0);
}
xgain_list[kk++] = ll;
}
ll++;
xpd_gain = (xpd_gain >> 1);
}
if (kk == 1) {
xgain_list[1] = xgain_list[0];
}
}
jj = xgain_list[0];
if((swDeviceID & 0xff) >= 0x16) {
art_writeField(devNum, "rf_pdgain_lo", jj);
art_writeField(devNum, "rf_pdgain_hi", jj);
} else {
uiPrintf("SNOOP: xgain0 = %d[%d]\n", xgain_list[0], jj);
art_writeField(devNum, "rf_xpd_gain", jj);
}
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].xpd_gain = (A_UINT16)jj;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].numPcdacs = NUM_POINTS_XPD0;
pcdac = copyPcdac;
art_ForceSinglePCDACTable(devNum, pcdac);
art_forceSinglePowerTxMax(devNum, 0);
art_txContBegin(devNum, CONT_FRAMED_DATA, RANDOM_PATTERN,
rates[0], DESC_ANT_A | USE_DESC_ANT);
Sleep(50); // sleep 20 ms
art_ForceSinglePCDACTable(devNum, pcdac);
Sleep(sleep_interval);
maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
if (maxPower < 10) {
Sleep(sleep_interval);
maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
}
if (maxPower < 10) {
uiPrintf("The max transmit Power is too small (%3.2f) at ch = %d. Giving up.\n", maxPower, channel);
REWIND_TEST = TRUE;
//** the following added by ccshiang
if (AgN4010.boolPauseAfterPowerCalFailed) {
long boolShow = true;
while (agiShowPauseThenMeasurePower(boolShow,&maxPower)) {
printf("<%3.1f+%3.1f=%3.1f>"
,maxPower,myAtten,maxPower+myAtten);
boolShow = false;
}
}
//** the above added by ccshiang
return;
}
//if max power is less than the desired attemptPower, try to achieve it slowly
if (maxPower < attemptPower) {
tempPcdac = pcdac;
//printf("SNOOP: attempting to achieve power of %6.2f\n", attemptPower);
while ((maxPower < attemptPower) && (tempPcdac < 62)) {
art_ForceSinglePCDACTable(devNum, ++tempPcdac);
Sleep(sleep_interval);
maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
//printf("SNOOP: got power of %6.2f for pcdac %d\n", maxPower, tempPcdac);
}
max_pcdac = tempPcdac;
}
if (maxPower > CalSetup.maxPowerCap[mode]) {
pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4 = (A_UINT16)(4*CalSetup.maxPowerCap[mode] + 0.5);
} else {
pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4 = (A_UINT16)(4*maxPower + 0.5);
}
if (CalSetup.customerDebug) {
uiPrintf("maxPower = %3.2f", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0));
} else {
if(max_pcdac < 63) {
uiPrintf("pcdac limited pwr is %2.1f dBm (pcdac %d)\n", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0), max_pcdac) ;
} else {
uiPrintf("max pwr is %2.1f dBm\n", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0)) ;
}
}
lo_pcd = 1;
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
if (fabs(power - maxPower) < 10.0) {
art_ForceSinglePCDACTable(devNum, 1);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
}
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[0] = (A_UINT16)(4*power + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[0] = lo_pcd;
gain1 = read_gainf_twice(devNum) ;
if (gain1 < 5) { // possibly a bad reading
gain1 = read_gainf_twice(devNum) ;
}
pwr1 = power;
if (CalSetup.customerDebug) {
uiPrintf(", %3.2f[%d]", power, lo_pcd);
}
lo_pcd = 25;
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
gain25 = read_gainf_twice(devNum) ;
if (gain25 < 5) { // possibly a bad reading
gain25 = read_gainf_twice(devNum) ;
}
pwr25 = power;
if (CalSetup.customerDebug) {
uiPrintf(", %3.2f[%d]", power, lo_pcd);
}
// start search for highest linear power at pcdac for (maxPower - 3dB)
lo_pcd = (A_UINT16)((((maxPower - 3) - pwr1)/(pwr25 - pwr1))*(25 - 1) + 1);
if ((lo_pcd < 0) || (lo_pcd > 56)) {
lo_pcd = 56;
}
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
intp_gain = (A_UINT16)(((lo_pcd - 1)/(25 - 1))*(gain25 - gain1) + gain1);
dirxn = (gainF > (intp_gain + 5)) ? -1 : 1;
prev_gain = gainF;
if (dirxn < 0) {
while ((abs(gainF - prev_gain) < 4) && (lo_pcd < max_pcdac)){
lo_pcd -= dirxn ;
prev_gain = gainF;
if (CalSetup.customerDebug) printf("SNOOP: loop 1 dirxn-1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
}
while ((abs(gainF - prev_gain) >= 4) && (lo_pcd < max_pcdac)){
lo_pcd += dirxn ;
prev_gain = gainF;
if (CalSetup.customerDebug) printf("SNOOP: loop 2 dirxn-1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
}
} else { // dirxn > 0
prev_gain = 107;
while ((abs(gainF - prev_gain) >= 4) && (lo_pcd < max_pcdac)){
lo_pcd -= dirxn ;
prev_gain = gainF;
if (CalSetup.customerDebug) printf("SNOOP: loop 1 dirxn1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
}
while ((abs(gainF - prev_gain) < 4) && (lo_pcd < max_pcdac)) {
lo_pcd += dirxn ;
prev_gain = gainF;
if (CalSetup.customerDebug) printf("SNOOP: loop 2 dirxn1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
}
lo_pcd -= dirxn;
}
lo_pcd -= 1; // back off 1 into linear range
if (lo_pcd > max_pcdac) {
lo_pcd = max_pcdac;
}
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
// highest linear power
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16)(4*power + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2] = lo_pcd;
// if highest linear pcdac > 40, use pcdacs (25, 70% intrcpt[25,pcdMaxLin], pcdMaxLin, pcdMaxPwr) instead
// of (1, 25, pcdMaxLin, pcdMaxPwr).
if (CalSetup.customerDebug) printf("SNOOP: pcd2=%d, pwr2=%f\n", lo_pcd, power);
if (lo_pcd > 40) {
if (CalSetup.customerDebug) printf("SNOOP: lo_pcd is > 40 : %d\n", lo_pcd);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[0] = (A_UINT16)(4*pwr25 + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[0] = 25;
if (CalSetup.customerDebug) printf("SNOOP: pcd0=%d, pwr0=%f\n", 25, pwr25);
// lo_pcd = (A_UINT16)(0.75*(lo_pcd-1) + 1);
// if (lo_pcd > 32) {
// lo_pcd = 32;
// }
lo_pcd = (A_UINT16)(0.7*(lo_pcd-25) + 25);
if (lo_pcd > 56) {
lo_pcd = 56;
}
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1] = (A_UINT16)(4*power + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1] = lo_pcd;
if (CalSetup.customerDebug) printf("SNOOP: pcd1=%d, pwr1=%f\n", lo_pcd, power);
} else {
if (CalSetup.customerDebug) printf("SNOOP: lo_pcd is < 40 : %d\n", lo_pcd);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1] = (A_UINT16)(4*pwr25 + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1] = 25;
if (CalSetup.customerDebug) printf("SNOOP: pcd1=%d, pwr1=%f\n", 25, pwr25);
}
power = ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2])/4.0;
// limit power[2] to maxPowerCap if highest linear power > maxPower
if (power >= CalSetup.maxPowerCap[mode]) {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
pcd1 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1];
pcd2 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
pwrL = (double) ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1]/4.0);
pwrH = power;
pcd_interp = (A_INT16)( ( (CalSetup.maxPowerCap[mode] - pwrL)*pcd2 + (pwrH - CalSetup.maxPowerCap[mode])*pcd1)/(pwrH - pwrL));
//uiPrintf("SNOOP: maxpwr2 : pcdI = %d, pcd1 = %d, pcd2 = %d, pwr1 = %3.1f, pwr2 = %3.1f, pwrT = %3.1f\n", pcd_interp, pcd1, pcd2, pwrL, pwrH, CalSetup.maxPowerCap[mode]);
if ((pcd_interp >= pcd1) && (pcd_interp <= pcd2)) {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2] = pcd_interp;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = pcd_interp;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
} else {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2] = pcd2;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16) (4*pwrH);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = pcd2;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16) (4*pwrH);
}
} else {
// search for min pcdac corresponding to maxPower
lo_pcd = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
if (lo_pcd == max_pcdac) { // not hit saturation yet
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2];
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
if (CalSetup.customerDebug) printf("SNOOP: pcd3=%d, pwr3=%f\n", lo_pcd, (pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] - 0.5)/4);
lo_pcd = 47;
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16)(4*power + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2] = lo_pcd;
if (CalSetup.customerDebug) printf("SNOOP: pcd2=%d, pwr2=%f\n", lo_pcd, (pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] - 0.5)/4);
} else {
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
gainF = read_gainf_twice(devNum) ;
prev_gain = 107;
while (((gainF < 100) || (gainF == prev_gain))&& (lo_pcd < max_pcdac)){
lo_pcd++;
art_ForceSinglePCDACTable(devNum, lo_pcd);
Sleep(10);
prev_gain = gainF;
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) printf("SNOOP: gainF = %d, pcd = %d\n", gainF, lo_pcd);
}
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16)(4*power + 0.5);
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = lo_pcd;
if (CalSetup.customerDebug) printf("SNOOP: pcd3=%d, pwr3=%f\n", lo_pcd, power);
// limit power[3] to maxPowerCap if highest power > maxPower
if (power >= CalSetup.maxPowerCap[mode]) {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
pcd1 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
pcd2 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3];
pwrL = (double) ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2]/4.0);
pwrH = power;
if (pwrH == pwrL) {
pcd_interp = pcd2;
} else {
pcd_interp = (A_INT16)( ( (CalSetup.maxPowerCap[mode] - pwrL)*pcd2 + (pwrH - CalSetup.maxPowerCap[mode])*pcd1)/(pwrH - pwrL));
}
//uiPrintf("SNOOP: maxpwr3 : pcdI = %d, pcd1 = %d, pcd2 = %d, pwr1 = %3.1f, pwr2 = %3.1f, pwrT = %3.1f\n", pcd_interp, pcd1, pcd2, pwrL, pwrH, CalSetup.maxPowerCap[mode]);
if ((pcd_interp >= pcd1) && (pcd_interp <= pcd2)) {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = pcd_interp;
} else {
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3] = pcd2;
pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16) (4*pwrH);
}
}
}
}
/*
// hi_pcd = (A_UINT16)(lo_pcd + (maxPower - power)*curr_intercept_estimate/10.0 - 5);
hi_pcd = 55;
// if (hi_pcd > 63) hi_pcd = 63;
// if (hi_pcd < 0) {
// uiPrintf("The max transmit Power (%3.2f) is too close to power at pcdac = 1 (%3.2f) at ch = %d. Try again.\n", maxPower, power, channel);
// REWIND_TEST = TRUE;
// return;
// hi_pcd = 45;
// }
art_ForceSinglePCDACTable(devNum, hi_pcd);
Sleep(sleep_interval);
power = pmMeasAvgPower(devPM, reset) + myAtten ;
gainF = read_gainf_twice(devNum) ;
if (CalSetup.customerDebug) {
uiPrintf(", %3.2f[%d, %d]", power, hi_pcd, gainF);
}
tmpPower = power;
tmpGainF = gainF;
if (power < (maxPower - 1.5)) {
hi_pcd += 5;
art_ForceSinglePCDACTable(devNum, hi_pcd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -