aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormichael-west <michael.west@ettus.com>2021-02-01 12:49:21 -0800
committerAaron Rossetto <aaron.rossetto@ni.com>2021-02-04 13:48:46 -0600
commitfbb0b0998992306375d179fb4fd0d25385689112 (patch)
tree0697ed79de857dc0b67c719c5f76115266c0d9d6
parentc5d7e88a9ec0c2c720993977a67cfb6263ec8d20 (diff)
downloaduhd-fbb0b0998992306375d179fb4fd0d25385689112.tar.gz
uhd-fbb0b0998992306375d179fb4fd0d25385689112.tar.bz2
uhd-fbb0b0998992306375d179fb4fd0d25385689112.zip
ADF535x: Change freq_resolution to mod2
The freq_resolution parameter to the set_frequency() method was confusing. Changing it to the mod2 value clarifies the intention and makes the math to reduce the FRAC2 and MOD2 values much easier to read and maintain. Signed-off-by: michael-west <michael.west@ettus.com>
-rw-r--r--host/lib/include/uhdlib/usrp/common/adf535x.hpp46
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp8
2 files changed, 28 insertions, 26 deletions
diff --git a/host/lib/include/uhdlib/usrp/common/adf535x.hpp b/host/lib/include/uhdlib/usrp/common/adf535x.hpp
index 61dd88451..20255ad00 100644
--- a/host/lib/include/uhdlib/usrp/common/adf535x.hpp
+++ b/host/lib/include/uhdlib/usrp/common/adf535x.hpp
@@ -68,7 +68,7 @@ public:
virtual void set_muxout_mode(const muxout_t mode) = 0;
virtual double set_frequency(const double target_freq,
- const double freq_resolution,
+ const uint32_t mod2 = 2,
const bool flush = false) = 0;
virtual double set_charge_pump_current(
@@ -227,10 +227,10 @@ public:
}
double set_frequency(const double target_freq,
- const double freq_resolution,
+ const uint32_t mod2 = 2,
const bool flush = false) override
{
- return _set_frequency(target_freq, freq_resolution, flush);
+ return _set_frequency(target_freq, mod2, flush);
}
double set_charge_pump_current(const double current, const bool flush) override
@@ -340,7 +340,7 @@ public:
protected:
uint8_t _set_vco_band_div(double);
- double _set_frequency(double, double, bool);
+ double _set_frequency(double, uint32_t, bool);
uhd::meta_range_t _get_charge_pump_current_range();
void _commit();
@@ -367,13 +367,13 @@ inline uint8_t adf535x_impl<adf5355_regs_t>::_set_vco_band_div(double pfd_freq)
template <>
inline double adf535x_impl<adf5355_regs_t>::_set_frequency(
- double target_freq, double freq_resolution, bool flush)
+ double target_freq, uint32_t mod2, bool flush)
{
if (target_freq > ADF535X_MAX_OUT_FREQ or target_freq < ADF535X_MIN_OUT_FREQ) {
throw uhd::runtime_error("requested frequency out of range.");
}
- if ((uint32_t)freq_resolution == 0) {
- throw uhd::runtime_error("requested resolution cannot be less than 1.");
+ if (mod2 < 2 or mod2 > ADF5355_MAX_MOD2) {
+ throw uhd::runtime_error("requested mod2 out of range.");
}
/* Calculate target VCOout frequency */
@@ -422,12 +422,13 @@ inline double adf535x_impl<adf5355_regs_t>::_set_frequency(
const auto FRAC1 = static_cast<uint32_t>(floor((N - INT) * ADF535X_MOD1));
const double residue = (N - INT) * ADF535X_MOD1 - FRAC1;
- const double gcd = double(
- uhd::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution)));
- const auto MOD2 = static_cast<uint16_t>(
- std::min(floor(_pfd_freq / gcd), static_cast<double>(ADF5355_MAX_MOD2)));
- const auto FRAC2 = static_cast<uint16_t>(
- std::min(ceil(residue * MOD2), static_cast<double>(ADF5355_MAX_FRAC2)));
+ // The data sheet recommends reducing FRAC2 and MOD2 to the lowest possible values
+ const auto frac2 = static_cast<uint16_t>(
+ std::min(ceil(residue * mod2), static_cast<double>(ADF5355_MAX_FRAC2)));
+ const auto gcd =
+ uhd::math::gcd(static_cast<int>(frac2), static_cast<int>(mod2));
+ const auto FRAC2 = frac2 == 0 ? 0 : frac2 / gcd;
+ const auto MOD2 = frac2 == 0 ? 2 : mod2 / gcd;
const double coerced_vco_freq =
_pfd_freq * (_fb_after_divider ? rf_divider : 1)
@@ -510,13 +511,13 @@ inline uint8_t adf535x_impl<adf5356_regs_t>::_set_vco_band_div(double pfd_freq)
template <>
inline double adf535x_impl<adf5356_regs_t>::_set_frequency(
- double target_freq, double freq_resolution, bool flush)
+ double target_freq, uint32_t mod2, bool flush)
{
if (target_freq > ADF535X_MAX_OUT_FREQ or target_freq < ADF535X_MIN_OUT_FREQ) {
throw uhd::runtime_error("requested frequency out of range.");
}
- if ((uint32_t)freq_resolution == 0) {
- throw uhd::runtime_error("requested resolution cannot be less than 1.");
+ if (mod2 < 2 or mod2 > ADF5355_MAX_MOD2) {
+ throw uhd::runtime_error("requested mod2 out of range.");
}
/* Calculate target VCOout frequency */
@@ -565,12 +566,13 @@ inline double adf535x_impl<adf5356_regs_t>::_set_frequency(
const auto FRAC1 = static_cast<uint32_t>(floor((N - INT) * ADF535X_MOD1));
const double residue = (N - INT) * ADF535X_MOD1 - FRAC1;
- const double gcd = double(
- uhd::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution)));
- const auto MOD2 = static_cast<uint32_t>(
- std::min(floor(_pfd_freq / gcd), static_cast<double>(ADF5356_MAX_MOD2)));
- const auto FRAC2 = static_cast<uint32_t>(
- std::min(round(residue * MOD2), static_cast<double>(ADF5356_MAX_FRAC2)));
+ // The data sheet recommends reducing FRAC2 and MOD2 to the lowest possible values
+ const auto frac2 = static_cast<uint16_t>(
+ std::min(ceil(residue * mod2), static_cast<double>(ADF5356_MAX_FRAC2)));
+ const auto gcd =
+ uhd::math::gcd(static_cast<int>(frac2), static_cast<int>(mod2));
+ const auto FRAC2 = frac2 == 0 ? 0 : frac2 / gcd;
+ const auto MOD2 = frac2 == 0 ? 2 : mod2 / gcd;
const double coerced_vco_freq =
_pfd_freq * (_fb_after_divider ? rf_divider : 1)
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
index 315861cd9..c337af2f9 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
@@ -33,6 +33,7 @@ inline uint32_t bool2bin(bool x)
const double TWINRX_REV_AB_PFD_FREQ = 6.25e6;
const double TWINRX_REV_C_PFD_FREQ = 12.5e6;
const double TWINRX_SPI_CLOCK_FREQ = 3e6;
+const uint32_t TWINRX_LO1_MOD2 = 2;
} // namespace
class twinrx_ctrl_impl : public twinrx_ctrl
@@ -137,7 +138,7 @@ public:
_lo1_iface[i]->set_reference_freq(
_db_iface->get_clock_rate(dboard_iface::UNIT_TX));
_lo1_iface[i]->set_muxout_mode(adf535x_iface::MUXOUT_DLD);
- _lo1_iface[i]->set_frequency(3e9, _lo1_pfd_freq / 2);
+ _lo1_iface[i]->set_frequency(3e9, TWINRX_LO1_MOD2);
// LO2
_lo2_iface[i] =
@@ -562,17 +563,16 @@ public:
double set_lo1_synth_freq(channel_t ch, double freq, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
- static const double RESOLUTION = _lo1_pfd_freq / 2;
double coerced_freq = 0.0;
if (ch == CH1 or ch == BOTH) {
coerced_freq =
- _lo1_iface[size_t(CH1)]->set_frequency(freq, RESOLUTION, false);
+ _lo1_iface[size_t(CH1)]->set_frequency(freq, TWINRX_LO1_MOD2, false);
_lo1_freq[size_t(CH1)] = tune_freq_t(freq);
}
if (ch == CH2 or ch == BOTH) {
coerced_freq =
- _lo1_iface[size_t(CH2)]->set_frequency(freq, RESOLUTION, false);
+ _lo1_iface[size_t(CH2)]->set_frequency(freq, TWINRX_LO1_MOD2, false);
_lo1_freq[size_t(CH2)] = tune_freq_t(freq);
}