[LR11x0] Calibrate image based on frequency change
This commit is contained in:
parent
9f4c15333c
commit
28360f9b0f
6 changed files with 49 additions and 23 deletions
|
@ -1,4 +1,6 @@
|
||||||
#include "LR1110.h"
|
#include "LR1110.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#if !RADIOLIB_EXCLUDE_LR11X0
|
#if !RADIOLIB_EXCLUDE_LR11X0
|
||||||
|
|
||||||
LR1110::LR1110(Module* mod) : LR11x0(mod) {
|
LR1110::LR1110(Module* mod) : LR11x0(mod) {
|
||||||
|
@ -45,20 +47,24 @@ int16_t LR1110::beginLRFHSS(float freq, uint8_t bw, uint8_t cr, bool narrowGrid,
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR1110::setFrequency(float freq) {
|
int16_t LR1110::setFrequency(float freq) {
|
||||||
return(this->setFrequency(freq, true));
|
return(this->setFrequency(freq, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR1110::setFrequency(float freq, bool calibrate, float band) {
|
int16_t LR1110::setFrequency(float freq, bool skipCalibration, float band) {
|
||||||
RADIOLIB_CHECK_RANGE(freq, 150.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY);
|
RADIOLIB_CHECK_RANGE(freq, 150.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY);
|
||||||
|
|
||||||
// calibrate image rejection
|
// check if we need to recalibrate image
|
||||||
if(calibrate) {
|
int16_t state;
|
||||||
int16_t state = LR11x0::calibImage(freq - band, freq + band);
|
if(!skipCalibration && (fabsf(freq - this->freqMHz) >= RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG_MHZ)) {
|
||||||
|
state = LR11x0::calibrateImageRejection(freq - band, freq + band);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set frequency
|
// set frequency
|
||||||
return(LR11x0::setRfFrequency((uint32_t)(freq*1000000.0f)));
|
state = LR11x0::setRfFrequency((uint32_t)(freq*1000000.0f));
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
this->freqMHz = freq;
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR1110::setOutputPower(int8_t power) {
|
int16_t LR1110::setOutputPower(int8_t power) {
|
||||||
|
|
|
@ -71,7 +71,8 @@ class LR1110: public LR11x0 {
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
||||||
Will also perform calibrations.
|
Will automatically perform image calibration if the frequency changes by
|
||||||
|
more than RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG MHz.
|
||||||
\param freq Carrier frequency to be set in MHz.
|
\param freq Carrier frequency to be set in MHz.
|
||||||
\returns \ref status_codes
|
\returns \ref status_codes
|
||||||
*/
|
*/
|
||||||
|
@ -79,14 +80,16 @@ class LR1110: public LR11x0 {
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
||||||
|
Will automatically perform image calibration if the frequency changes by
|
||||||
|
more than RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG MHz.
|
||||||
\param freq Carrier frequency to be set in MHz.
|
\param freq Carrier frequency to be set in MHz.
|
||||||
\param calibrate Run image calibration.
|
\param skipCalibration Skip automated image calibration.
|
||||||
\param band Half bandwidth for image calibration. For example,
|
\param band Half bandwidth for image calibration. For example,
|
||||||
if carrier is 434 MHz and band is set to 4 MHz, then the image will be calibrate
|
if carrier is 434 MHz and band is set to 4 MHz, then the image will be calibrate
|
||||||
for band 430 - 438 MHz. Unused if calibrate is set to false, defaults to 4 MHz
|
for band 430 - 438 MHz. Unused if calibrate is set to false, defaults to 4 MHz
|
||||||
\returns \ref status_codes
|
\returns \ref status_codes
|
||||||
*/
|
*/
|
||||||
int16_t setFrequency(float freq, bool calibrate, float band = 4);
|
int16_t setFrequency(float freq, bool skipCalibration, float band = 4);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets output power. Allowed values are in range from -9 to 22 dBm (high-power PA) or -17 to 14 dBm (low-power PA).
|
\brief Sets output power. Allowed values are in range from -9 to 22 dBm (high-power PA) or -17 to 14 dBm (low-power PA).
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#include "LR1120.h"
|
#include "LR1120.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#if !RADIOLIB_EXCLUDE_LR11X0
|
#if !RADIOLIB_EXCLUDE_LR11X0
|
||||||
|
|
||||||
LR1120::LR1120(Module* mod) : LR11x0(mod) {
|
LR1120::LR1120(Module* mod) : LR11x0(mod) {
|
||||||
|
@ -45,26 +47,27 @@ int16_t LR1120::beginLRFHSS(float freq, uint8_t bw, uint8_t cr, bool narrowGrid,
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR1120::setFrequency(float freq) {
|
int16_t LR1120::setFrequency(float freq) {
|
||||||
return(this->setFrequency(freq, true));
|
return(this->setFrequency(freq, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR1120::setFrequency(float freq, bool calibrate, float band) {
|
int16_t LR1120::setFrequency(float freq, bool skipCalibration, float band) {
|
||||||
if(!(((freq >= 150.0) && (freq <= 960.0)) ||
|
if(!(((freq >= 150.0) && (freq <= 960.0)) ||
|
||||||
((freq >= 1900.0) && (freq <= 2200.0)) ||
|
((freq >= 1900.0) && (freq <= 2200.0)) ||
|
||||||
((freq >= 2400.0) && (freq <= 2500.0)))) {
|
((freq >= 2400.0) && (freq <= 2500.0)))) {
|
||||||
return(RADIOLIB_ERR_INVALID_FREQUENCY);
|
return(RADIOLIB_ERR_INVALID_FREQUENCY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// calibrate image rejection
|
// check if we need to recalibrate image
|
||||||
int16_t state;
|
int16_t state;
|
||||||
if(calibrate) {
|
if(!skipCalibration && (fabsf(freq - this->freqMHz) >= RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG_MHZ)) {
|
||||||
state = LR11x0::calibImage(freq - band, freq + band);
|
state = LR11x0::calibrateImageRejection(freq - band, freq + band);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set frequency
|
// set frequency
|
||||||
state = LR11x0::setRfFrequency((uint32_t)(freq*1000000.0f));
|
state = LR11x0::setRfFrequency((uint32_t)(freq*1000000.0f));
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
this->freqMHz = freq;
|
||||||
this->highFreq = (freq > 1000.0);
|
this->highFreq = (freq > 1000.0);
|
||||||
return(RADIOLIB_ERR_NONE);
|
return(RADIOLIB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,9 @@ class LR1120: public LR11x0 {
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz,
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz,
|
||||||
1900 - 2200 MHz and 2400 - 2500 MHz. Will also perform calibrations.
|
1900 - 2200 MHz and 2400 - 2500 MHz.
|
||||||
|
Will automatically perform image calibration if the frequency changes by
|
||||||
|
more than RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG MHz.
|
||||||
NOTE: When switching between sub-GHz and high-frequency bands, after changing the frequency,
|
NOTE: When switching between sub-GHz and high-frequency bands, after changing the frequency,
|
||||||
setOutputPower() must be called in order to set the correct power amplifier!
|
setOutputPower() must be called in order to set the correct power amplifier!
|
||||||
\param freq Carrier frequency to be set in MHz.
|
\param freq Carrier frequency to be set in MHz.
|
||||||
|
@ -81,17 +83,19 @@ class LR1120: public LR11x0 {
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz,
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz,
|
||||||
1900 - 2200 MHz and 2400 - 2500 MHz. Will also perform calibrations.
|
1900 - 2200 MHz and 2400 - 2500 MHz.
|
||||||
|
Will automatically perform image calibration if the frequency changes by
|
||||||
|
more than RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG MHz.
|
||||||
NOTE: When switching between sub-GHz and high-frequency bands, after changing the frequency,
|
NOTE: When switching between sub-GHz and high-frequency bands, after changing the frequency,
|
||||||
setOutputPower() must be called in order to set the correct power amplifier!
|
setOutputPower() must be called in order to set the correct power amplifier!
|
||||||
\param freq Carrier frequency to be set in MHz.
|
\param freq Carrier frequency to be set in MHz.
|
||||||
\param calibrate Run image calibration.
|
\param skipCalibration Skip automated image calibration.
|
||||||
\param band Half bandwidth for image calibration. For example,
|
\param band Half bandwidth for image calibration. For example,
|
||||||
if carrier is 434 MHz and band is set to 4 MHz, then the image will be calibrate
|
if carrier is 434 MHz and band is set to 4 MHz, then the image will be calibrate
|
||||||
for band 430 - 438 MHz. Unused if calibrate is set to false, defaults to 4 MHz
|
for band 430 - 438 MHz. Unused if calibrate is set to false, defaults to 4 MHz
|
||||||
\returns \ref status_codes
|
\returns \ref status_codes
|
||||||
*/
|
*/
|
||||||
int16_t setFrequency(float freq, bool calibrate, float band = 4);
|
int16_t setFrequency(float freq, bool skipCalibration, float band = 4);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets output power. Allowed values are in range from -9 to 22 dBm (high-power PA) or -17 to 14 dBm (low-power PA).
|
\brief Sets output power. Allowed values are in range from -9 to 22 dBm (high-power PA) or -17 to 14 dBm (low-power PA).
|
||||||
|
|
|
@ -2400,10 +2400,10 @@ int16_t LR11x0::setRegMode(uint8_t mode) {
|
||||||
return(this->SPIcommand(RADIOLIB_LR11X0_CMD_SET_REG_MODE, true, &mode, 1));
|
return(this->SPIcommand(RADIOLIB_LR11X0_CMD_SET_REG_MODE, true, &mode, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t LR11x0::calibImage(float freq1, float freq2) {
|
int16_t LR11x0::calibrateImageRejection(float freqMin, float freqMax) {
|
||||||
uint8_t buff[2] = {
|
uint8_t buff[2] = {
|
||||||
(uint8_t)floor((freq1 - 1.0f) / 4.0f),
|
(uint8_t)floor((freqMin - 1.0f) / 4.0f),
|
||||||
(uint8_t)ceil((freq2 + 1.0f) / 4.0f)
|
(uint8_t)ceil((freqMax + 1.0f) / 4.0f)
|
||||||
};
|
};
|
||||||
return(this->SPIcommand(RADIOLIB_LR11X0_CMD_CALIB_IMAGE, true, buff, sizeof(buff)));
|
return(this->SPIcommand(RADIOLIB_LR11X0_CMD_CALIB_IMAGE, true, buff, sizeof(buff)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,6 +233,7 @@
|
||||||
#define RADIOLIB_LR11X0_CALIBRATE_HF_RC (0x01UL << 1) // 1 1 high frequency RC
|
#define RADIOLIB_LR11X0_CALIBRATE_HF_RC (0x01UL << 1) // 1 1 high frequency RC
|
||||||
#define RADIOLIB_LR11X0_CALIBRATE_LF_RC (0x01UL << 0) // 0 0 low frequency RC
|
#define RADIOLIB_LR11X0_CALIBRATE_LF_RC (0x01UL << 0) // 0 0 low frequency RC
|
||||||
#define RADIOLIB_LR11X0_CALIBRATE_ALL (0x3FUL << 0) // 5 0 everything
|
#define RADIOLIB_LR11X0_CALIBRATE_ALL (0x3FUL << 0) // 5 0 everything
|
||||||
|
#define RADIOLIB_LR11X0_CAL_IMG_FREQ_TRIG_MHZ (20.0)
|
||||||
|
|
||||||
// RADIOLIB_LR11X0_CMD_SET_REG_MODE
|
// RADIOLIB_LR11X0_CMD_SET_REG_MODE
|
||||||
#define RADIOLIB_LR11X0_REG_MODE_LDO (0x00UL << 0) // 0 0 regulator mode: LDO in all modes
|
#define RADIOLIB_LR11X0_REG_MODE_LDO (0x00UL << 0) // 0 0 regulator mode: LDO in all modes
|
||||||
|
@ -1610,6 +1611,15 @@ class LR11x0: public PhysicalLayer {
|
||||||
*/
|
*/
|
||||||
int16_t getModem(ModemType_t* modem) override;
|
int16_t getModem(ModemType_t* modem) override;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Perform image rejection calibration for the specified frequency band.
|
||||||
|
WARNING: Use at your own risk! Setting incorrect values may lead to decreased performance
|
||||||
|
\param freqMin Frequency band lower bound.
|
||||||
|
\param freqMax Frequency band upper bound.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t calibrateImageRejection(float freqMin, float freqMax);
|
||||||
|
|
||||||
#if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL
|
#if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL
|
||||||
protected:
|
protected:
|
||||||
#endif
|
#endif
|
||||||
|
@ -1629,7 +1639,6 @@ class LR11x0: public PhysicalLayer {
|
||||||
int16_t clearErrors(void);
|
int16_t clearErrors(void);
|
||||||
int16_t calibrate(uint8_t params);
|
int16_t calibrate(uint8_t params);
|
||||||
int16_t setRegMode(uint8_t mode);
|
int16_t setRegMode(uint8_t mode);
|
||||||
int16_t calibImage(float freq1, float freq2);
|
|
||||||
int16_t setDioAsRfSwitch(uint8_t en, uint8_t stbyCfg, uint8_t rxCfg, uint8_t txCfg, uint8_t txHpCfg, uint8_t txHfCfg, uint8_t gnssCfg, uint8_t wifiCfg);
|
int16_t setDioAsRfSwitch(uint8_t en, uint8_t stbyCfg, uint8_t rxCfg, uint8_t txCfg, uint8_t txHpCfg, uint8_t txHfCfg, uint8_t gnssCfg, uint8_t wifiCfg);
|
||||||
int16_t setDioIrqParams(uint32_t irq1, uint32_t irq2);
|
int16_t setDioIrqParams(uint32_t irq1, uint32_t irq2);
|
||||||
int16_t setDioIrqParams(uint32_t irq);
|
int16_t setDioIrqParams(uint32_t irq);
|
||||||
|
@ -1790,6 +1799,7 @@ class LR11x0: public PhysicalLayer {
|
||||||
protected:
|
protected:
|
||||||
#endif
|
#endif
|
||||||
uint8_t chipType = 0;
|
uint8_t chipType = 0;
|
||||||
|
float freqMHz = 0;
|
||||||
|
|
||||||
#if !RADIOLIB_GODMODE
|
#if !RADIOLIB_GODMODE
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Reference in a new issue