Iterate through RBW
Need to save results, and get value back when RBW changes and use
This commit is contained in:
parent
f36f478363
commit
1e34a6ae95
58
RXsweep.ino
58
RXsweep.ino
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* RX sweep fixes the LO and sweeps the receiver from a start value to an stop value to
|
* RX sweep fixes the LO and sweeps the receiver from a start value to an stop value to
|
||||||
* measure the RX FIR bandpass pass filter response. This eleimates any effect from the SAW
|
* measure the RX FIR bandpass pass filter response. This eliminates any effect from the SAW
|
||||||
* and low pass filters before the receiver.
|
* and low pass filters before the receiver.
|
||||||
* It requires a fixed strength and frequency signal, and this is provided
|
* It requires a fixed strength and frequency signal, and this is provided
|
||||||
* by setting the reference output to say 15MHz. Avoid 30Mhz due to some stray clock signal
|
* by setting the reference output to say 15MHz. Avoid 30Mhz due to some stray clock signal
|
||||||
@ -50,6 +50,9 @@ static uint32_t nextPointFreq = 0; // Frequency for the next display point. Us
|
|||||||
static unsigned long setFreqMicros;
|
static unsigned long setFreqMicros;
|
||||||
static unsigned long nowMicros;
|
static unsigned long nowMicros;
|
||||||
|
|
||||||
|
static uint16_t currentRBW10;
|
||||||
|
static uint16_t bpFilterIndex; // used to loop through the SI4432 bandpass filters when calibrating
|
||||||
|
|
||||||
static uint32_t sweepStep; // Step count
|
static uint32_t sweepStep; // Step count
|
||||||
static uint32_t sweepFreqStep;
|
static uint32_t sweepFreqStep;
|
||||||
|
|
||||||
@ -72,6 +75,8 @@ static uint16_t lastMinRSSI; // Minimum level for the previous sweep
|
|||||||
static bool jsonDocInitialised = false;
|
static bool jsonDocInitialised = false;
|
||||||
static uint16_t chunkIndex;
|
static uint16_t chunkIndex;
|
||||||
|
|
||||||
|
static double bpfCalibrations[MAX_SI4432_FILTERS]; // temporary storage for calibration values
|
||||||
|
static uint16_t bpfCalFirstSweepDone;
|
||||||
/*
|
/*
|
||||||
* If paused and at the start of a sweep then do nothing
|
* If paused and at the start of a sweep then do nothing
|
||||||
*/
|
*/
|
||||||
@ -81,9 +86,47 @@ static uint16_t chunkIndex;
|
|||||||
|
|
||||||
if (( !sweepStartDone || initSweep || changedSetting ) )
|
if (( !sweepStartDone || initSweep || changedSetting ) )
|
||||||
{
|
{
|
||||||
if ( initSweep || changedSetting ) // Something has changed, or a first start, so need to work out some basic things
|
if ( initSweep || changedSetting || (bpfCalibrate && !sweepStartDone) ) // Something has changed, or a first start, so need to work out some basic things
|
||||||
{
|
{
|
||||||
Serial.println("Init RXSweep or changedSetting");
|
//Serial.println("Init RXSweep or changedSetting");
|
||||||
|
|
||||||
|
if (bpfCalibrate)
|
||||||
|
{
|
||||||
|
if (bpfCalFirstSweepDone)
|
||||||
|
{
|
||||||
|
// max value for this bpFilter index (pervious sweep) is in peaks[0].Level
|
||||||
|
bpfCalibrations[bpFilterIndex] = CAL_POWER - rssiTodBm ( peaks[0].Level);
|
||||||
|
Serial.printf("bpfCalibration: filter: %i, rbw10=%i , cal=%f \n", bpFilterIndex, currentRBW10, bpfCalibrations[bpFilterIndex]);
|
||||||
|
|
||||||
|
bpFilterIndex ++;
|
||||||
|
if (bpFilterIndex >= bpfCount) // end of calibration
|
||||||
|
{
|
||||||
|
bpfCalibrate = false;
|
||||||
|
currentRBW10 = setting.Bandwidth10;
|
||||||
|
// savebpfCal();
|
||||||
|
Serial.println("bpfCalibration done");
|
||||||
|
}
|
||||||
|
else // not reached end of filters
|
||||||
|
{
|
||||||
|
currentRBW10 = rcvr.GetBandpassFilter10(bpFilterIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // first sweep not done
|
||||||
|
{
|
||||||
|
bpfCalFirstSweepDone = true;
|
||||||
|
currentRBW10 = rcvr.GetBandpassFilter10(bpFilterIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // not in calibrate
|
||||||
|
{
|
||||||
|
currentRBW10 = setting.Bandwidth10;
|
||||||
|
bpFilterIndex = 0;
|
||||||
|
bpfCalFirstSweepDone = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SetRXsweepSpan (currentRBW10 * 1000); // 10 * bandwidth - sets up stopFreq_RX and startFreq_RX
|
||||||
|
|
||||||
autoSweepFreqStep = ( stopFreq_RX - startFreq_RX ) / displayPoints;
|
autoSweepFreqStep = ( stopFreq_RX - startFreq_RX ) / displayPoints;
|
||||||
|
|
||||||
vbw = autoSweepFreqStep / 1000.0; // Set the video resolution
|
vbw = autoSweepFreqStep / 1000.0; // Set the video resolution
|
||||||
@ -91,7 +134,7 @@ static uint16_t chunkIndex;
|
|||||||
/*
|
/*
|
||||||
* Use the RBW setting. If zero then it is meaningless, use smallest instead
|
* Use the RBW setting. If zero then it is meaningless, use smallest instead
|
||||||
*/
|
*/
|
||||||
bandwidth = rcvr.SetRBW ( setting.Bandwidth10, &delaytime ); // Set it in the receiver Si4432. delaytime is returned
|
bandwidth = rcvr.SetRBW ( currentRBW10, &delaytime ); // Set it in the receiver Si4432. delaytime is returned
|
||||||
|
|
||||||
sweepPoints = displayPoints;
|
sweepPoints = displayPoints;
|
||||||
|
|
||||||
@ -100,9 +143,8 @@ static uint16_t chunkIndex;
|
|||||||
att.SetAtten ( 0 ); // Set the internal attenuator
|
att.SetAtten ( 0 ); // Set the internal attenuator
|
||||||
|
|
||||||
// pre-calculate adjustment for RSSI values
|
// pre-calculate adjustment for RSSI values
|
||||||
dBadjust = -120.0 + setting.LevelOffset - setting.ExternalGain;
|
dBadjust = -120.0 - setting.ExternalGain; // No correction applied for this mode
|
||||||
Serial.printf("RXSweep dBadjust = %f; leveloffset = %f; attenuate = %i, ext gain = %f\n",
|
//Serial.printf("RXSweep dBadjust = %f; ext gain = %f\n", dBadjust, setting.ExternalGain);
|
||||||
dBadjust, setting.LevelOffset, setting.Attenuate, setting.ExternalGain);
|
|
||||||
|
|
||||||
xmit.SetPowerReference ( setting.ReferenceOut ); // Set the GPIO reference output
|
xmit.SetPowerReference ( setting.ReferenceOut ); // Set the GPIO reference output
|
||||||
|
|
||||||
@ -326,7 +368,7 @@ static uint16_t chunkIndex;
|
|||||||
if ( rxRSSI > pointMaxRSSI ) // RSSI > maximum value for this point so far?
|
if ( rxRSSI > pointMaxRSSI ) // RSSI > maximum value for this point so far?
|
||||||
{
|
{
|
||||||
myActual[autoSweepStep] = rxRSSI; // Yes, save it
|
myActual[autoSweepStep] = rxRSSI; // Yes, save it
|
||||||
pointMaxRSSI = rxRSSI; // Added by G3ZQC - Remember new maximim
|
pointMaxRSSI = rxRSSI; // Added by G3ZQC - Remember new maximum
|
||||||
pointMaxFreq = oldSweepFreq;
|
pointMaxFreq = oldSweepFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
26
cmd.cpp
26
cmd.cpp
@ -44,6 +44,7 @@ extern bandpassFilter_t bandpassFilters[]; // RBW Setting data
|
|||||||
|
|
||||||
extern int bpfCount; // Number of entries in "bandpassFilters"
|
extern int bpfCount; // Number of entries in "bandpassFilters"
|
||||||
extern int changedSetting; // Something in "setting" changed
|
extern int changedSetting; // Something in "setting" changed
|
||||||
|
extern uint16_t bpfCalibrate; // set true if a SI4432 bandpass filter calibration run is taking place
|
||||||
|
|
||||||
extern uint16_t tinySA_mode;
|
extern uint16_t tinySA_mode;
|
||||||
|
|
||||||
@ -94,9 +95,9 @@ extern uint32_t startFreq_IF; // Last value of the IF sweep start frequency
|
|||||||
extern uint32_t stopFreq_IF; // Last value of the IF sweep end frequency
|
extern uint32_t stopFreq_IF; // Last value of the IF sweep end frequency
|
||||||
extern uint32_t sigFreq_IF; // Last value of the IF sweep end frequency
|
extern uint32_t sigFreq_IF; // Last value of the IF sweep end frequency
|
||||||
|
|
||||||
extern uint32_t startFreq_RX; // Last value of the IF sweep start frequency
|
extern uint32_t startFreq_RX; // Last value of the RX sweep start frequency
|
||||||
extern uint32_t stopFreq_RX; // Last value of the IF sweep end frequency
|
extern uint32_t stopFreq_RX; // Last value of the RX sweep end frequency
|
||||||
extern uint32_t sigFreq_RX; // Last value of the IF sweep end frequency
|
extern uint32_t sigFreq_RX; // Last value of the RX sweep end frequency
|
||||||
|
|
||||||
extern uint8_t showRSSI; // When true, RSSI readings are displayed
|
extern uint8_t showRSSI; // When true, RSSI readings are displayed
|
||||||
extern int initSweep; // Set by the "RSSI" command to restart the sweep
|
extern int initSweep; // Set by the "RSSI" command to restart the sweep
|
||||||
@ -191,6 +192,7 @@ extern uint8_t dBmToRSSI ( double dBm );
|
|||||||
{ "TRACKOFF", MSG_TGOFF }, // turn off tracking generator output
|
{ "TRACKOFF", MSG_TGOFF }, // turn off tracking generator output
|
||||||
{ "TRACKSIG", MSG_TGSIG }, // turn off tracking generator output
|
{ "TRACKSIG", MSG_TGSIG }, // turn off tracking generator output
|
||||||
{ "TGFREQ", MSG_TGFREQ }, // Set Track gen freq for sig gen mode
|
{ "TGFREQ", MSG_TGFREQ }, // Set Track gen freq for sig gen mode
|
||||||
|
{ "BPFCAL", MSG_BPFCAL }, // Start bandpass filter calibration
|
||||||
{ "", MSG_NONE } // Unrecognized command
|
{ "", MSG_NONE } // Unrecognized command
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -359,6 +361,8 @@ void ShowMenu ()
|
|||||||
|
|
||||||
Serial.println ( " IFSIGNAL......Frequency of signal injected for IF Sweep (External or Ref)" );
|
Serial.println ( " IFSIGNAL......Frequency of signal injected for IF Sweep (External or Ref)" );
|
||||||
|
|
||||||
|
Serial.println ( " BPFCAL........Start SI4432 bandpass filter calibration - RXSweep mode only");
|
||||||
|
|
||||||
Serial.println ();
|
Serial.println ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1779,10 +1783,21 @@ uint8_t reg69; // Ditto
|
|||||||
SetExtGain( tempFloat );
|
SetExtGain( tempFloat );
|
||||||
DisplayInfo (); // Re display the scan
|
DisplayInfo (); // Re display the scan
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.printf ( "External gain: %4.1f\n", setting.ExternalGain );
|
Serial.printf ( "External gain: %4.1f\n", setting.ExternalGain );
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start calibration of the SI4432 bandpass filters (ie different RBW)
|
||||||
|
* Valid only if already in RX Sweep mode
|
||||||
|
*/
|
||||||
|
case MSG_BPFCAL:
|
||||||
|
if ( setting.Mode == RX_SWEEP )
|
||||||
|
{
|
||||||
|
bpfCalibrate = true;
|
||||||
|
Serial.println("Starting bpf calibration");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -2431,7 +2446,6 @@ int16_t tempBw;
|
|||||||
if ( setting.Bandwidth10 != oldRBW )
|
if ( setting.Bandwidth10 != oldRBW )
|
||||||
{
|
{
|
||||||
changedSetting = true;
|
changedSetting = true;
|
||||||
SetRXsweepSpan (setting.Bandwidth10 * 1000); // 10 * bandwidth
|
|
||||||
WriteSettings ();
|
WriteSettings ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
cmd.h
1
cmd.h
@ -85,6 +85,7 @@
|
|||||||
#define MSG_TGOFF 56 // Turn Tracking Generator output off
|
#define MSG_TGOFF 56 // Turn Tracking Generator output off
|
||||||
#define MSG_TGFREQ 57 // Set Track Gen frequency for sig gen mode
|
#define MSG_TGFREQ 57 // Set Track Gen frequency for sig gen mode
|
||||||
#define MSG_TGSIG 58 // Set Track Gen sig gen mode
|
#define MSG_TGSIG 58 // Set Track Gen sig gen mode
|
||||||
|
#define MSG_BPFCAL 59 // Start bandpass filter calibration
|
||||||
|
|
||||||
#define MSG_COLOURTEST 99 // test of waterfall colours - remove this when done!
|
#define MSG_COLOURTEST 99 // test of waterfall colours - remove this when done!
|
||||||
|
|
||||||
|
@ -1023,6 +1023,7 @@ function handleSettings (settings)
|
|||||||
setTrackGen.disabled = true;
|
setTrackGen.disabled = true;
|
||||||
setTGFreq.disabled = true;
|
setTGFreq.disabled = true;
|
||||||
setTrackGenPower.disabled = true;
|
setTrackGenPower.disabled = true;
|
||||||
|
setActPower.disabled = true;
|
||||||
sigDiv.style.display = "none";
|
sigDiv.style.display = "none";
|
||||||
chartDiv.style.display = "block";
|
chartDiv.style.display = "block";
|
||||||
} else if (settings.mode == 4 ) { // IF Sweep (SAW test)
|
} else if (settings.mode == 4 ) { // IF Sweep (SAW test)
|
||||||
@ -1040,6 +1041,7 @@ function handleSettings (settings)
|
|||||||
setTrackGen.disabled = true;
|
setTrackGen.disabled = true;
|
||||||
setTGFreq.disabled = true;
|
setTGFreq.disabled = true;
|
||||||
setTrackGenPower.disabled = true;
|
setTrackGenPower.disabled = true;
|
||||||
|
setActPower.disabled = true;
|
||||||
sigDiv.style.display = "none";
|
sigDiv.style.display = "none";
|
||||||
chartDiv.style.display = "block";
|
chartDiv.style.display = "block";
|
||||||
} else if (settings.mode == 7 ) { // BANDSCOPE
|
} else if (settings.mode == 7 ) { // BANDSCOPE
|
||||||
@ -1056,6 +1058,7 @@ function handleSettings (settings)
|
|||||||
setSpur.disabled = true;
|
setSpur.disabled = true;
|
||||||
setTrackGen.disabled = true;
|
setTrackGen.disabled = true;
|
||||||
setTrackGenPower.disabled = true;
|
setTrackGenPower.disabled = true;
|
||||||
|
setActPower.disabled = true;
|
||||||
sigDiv.style.display = "none";
|
sigDiv.style.display = "none";
|
||||||
chartDiv.style.display = "block";
|
chartDiv.style.display = "block";
|
||||||
} else if (settings.mode == 2 ) { // Signal Generator
|
} else if (settings.mode == 2 ) { // Signal Generator
|
||||||
@ -1073,6 +1076,7 @@ function handleSettings (settings)
|
|||||||
setTrackGen.disabled = true;
|
setTrackGen.disabled = true;
|
||||||
setTGFreq.disabled = true;
|
setTGFreq.disabled = true;
|
||||||
setTrackGenPower.disabled = true;
|
setTrackGenPower.disabled = true;
|
||||||
|
setActPower.disabled = true;
|
||||||
sigDiv.style.display = "block";
|
sigDiv.style.display = "block";
|
||||||
chartDiv.style.display = "none";
|
chartDiv.style.display = "none";
|
||||||
} else {
|
} else {
|
||||||
@ -1090,6 +1094,7 @@ function handleSettings (settings)
|
|||||||
setTrackGen.disabled = false;
|
setTrackGen.disabled = false;
|
||||||
setTGFreq.disabled = false;
|
setTGFreq.disabled = false;
|
||||||
setTrackGenPower.disabled = false;
|
setTrackGenPower.disabled = false;
|
||||||
|
setActPower.disabled = false;
|
||||||
sigDiv.style.display = "none";
|
sigDiv.style.display = "none";
|
||||||
chartDiv.style.display = "block";
|
chartDiv.style.display = "block";
|
||||||
}
|
}
|
||||||
|
@ -170,6 +170,10 @@
|
|||||||
#define MIN_DRIVE 0
|
#define MIN_DRIVE 0
|
||||||
#define MAX_DRIVE 7
|
#define MAX_DRIVE 7
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SI4432 MAx no of bandpass filters
|
||||||
|
*/
|
||||||
|
#define MAX_SI4432_FILTERS 57
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The various operating modes:
|
* The various operating modes:
|
||||||
|
14
simpleSA.ino
14
simpleSA.ino
@ -141,6 +141,12 @@
|
|||||||
* Output range of signal generator increased by also reducing SI4432 output power as well as uing attenuator
|
* Output range of signal generator increased by also reducing SI4432 output power as well as uing attenuator
|
||||||
* Storage feature - temporary only not to disk - added to web page traces
|
* Storage feature - temporary only not to disk - added to web page traces
|
||||||
* X grid lines added to web chart
|
* X grid lines added to web chart
|
||||||
|
*
|
||||||
|
* Version 0.11 (pending)
|
||||||
|
* Fix scaling for track gen frequency on web
|
||||||
|
* Axis Y2 on web chart is hidden if relevant traces not enabled
|
||||||
|
* Add self-calibrate
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -403,8 +409,11 @@ uint32_t stopFreq = 100000000; // Default stop frequency is 100MHz
|
|||||||
uint32_t tempIF; // IF used for this sweep. Changes if Spur reduction is on
|
uint32_t tempIF; // IF used for this sweep. Changes if Spur reduction is on
|
||||||
double dBadjust; // Sum of attenuation, external gain, calibration offset and RBW correction
|
double dBadjust; // Sum of attenuation, external gain, calibration offset and RBW correction
|
||||||
|
|
||||||
|
uint16_t bpfCalibrate; // set true if a SI4432 bandpass filter calibration run is taking place
|
||||||
|
uint16_t bpfCount; // no of bandpass filters available
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variables for offset frequency tuning
|
* Variables for offset frequency tuning (used in Bandscope mode)
|
||||||
*/
|
*/
|
||||||
int32_t offsetFreq; // Frequency offset from nominal setting
|
int32_t offsetFreq; // Frequency offset from nominal setting
|
||||||
int16_t offsetStep; // increments by one at each reading
|
int16_t offsetStep; // increments by one at each reading
|
||||||
@ -677,6 +686,7 @@ bool fsStatus = false; // True if SPIFFS loads ok
|
|||||||
bandwidth = rcvr.SetRBW ( setting.Bandwidth10, &delaytime ); // Set initial bandwidth and delaytime
|
bandwidth = rcvr.SetRBW ( setting.Bandwidth10, &delaytime ); // Set initial bandwidth and delaytime
|
||||||
SetRX ( 0 ); // RX in receive, LO in transmit
|
SetRX ( 0 ); // RX in receive, LO in transmit
|
||||||
rcvr.SetPreampGain ( setting.PreampGain );
|
rcvr.SetPreampGain ( setting.PreampGain );
|
||||||
|
bpfCount = rcvr.GetBandpassFilterCount(); // no of RBW filters available
|
||||||
|
|
||||||
|
|
||||||
// If the tracking generator IF SI4432 is defined, then check to see if it is connected
|
// If the tracking generator IF SI4432 is defined, then check to see if it is connected
|
||||||
@ -1224,6 +1234,8 @@ void doSigGenHigh ()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "SetRX" - Mode 3 is sig gen, 0 is normal (RX as receive, LO on), 1 is both
|
* "SetRX" - Mode 3 is sig gen, 0 is normal (RX as receive, LO on), 1 is both
|
||||||
* receiving 2 not used
|
* receiving 2 not used
|
||||||
|
@ -792,7 +792,7 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to
|
|||||||
jsonDocument["IF"] = setting.IF_Freq / 1000000.0;
|
jsonDocument["IF"] = setting.IF_Freq / 1000000.0;
|
||||||
jsonDocument["attenuation"] = setting.Attenuate;
|
jsonDocument["attenuation"] = setting.Attenuate;
|
||||||
jsonDocument["extGain"] = setting.ExternalGain;
|
jsonDocument["extGain"] = setting.ExternalGain;
|
||||||
jsonDocument["levelOffset"] = setting.LevelOffset;
|
jsonDocument["levelOffset"] = 0;
|
||||||
jsonDocument["setRBW"] = setting.Bandwidth10;
|
jsonDocument["setRBW"] = setting.Bandwidth10;
|
||||||
jsonDocument["bandwidth"] = bandwidth;
|
jsonDocument["bandwidth"] = bandwidth;
|
||||||
jsonDocument["RefOut"] = setting.ReferenceOut;
|
jsonDocument["RefOut"] = setting.ReferenceOut;
|
||||||
|
Loading…
Reference in New Issue
Block a user