diff options
| author | Mark Meserve <mark.meserve@ni.com> | 2017-02-03 16:25:34 -0600 | 
|---|---|---|
| committer | Martin Braun <martin.braun@ettus.com> | 2017-02-20 17:39:02 -0800 | 
| commit | 454307a8845a3bc697531df5fd2e245233ed5218 (patch) | |
| tree | 61d74e982add5d0d276b7807485a70937b5be0f2 /host/lib/usrp/common | |
| parent | f3f9d95476e870c85ca1b0dfa9cee7a951800f87 (diff) | |
| download | uhd-454307a8845a3bc697531df5fd2e245233ed5218.tar.gz uhd-454307a8845a3bc697531df5fd2e245233ed5218.tar.bz2 uhd-454307a8845a3bc697531df5fd2e245233ed5218.zip | |
Revise calculation of ADF5355 FRAC2 register
Corrected residue formula
Fixed cast to uint16_t that was behaving differently in msvc14 32-bit vs 64-bit
Diffstat (limited to 'host/lib/usrp/common')
| -rw-r--r-- | host/lib/usrp/common/adf5355.cpp | 11 | 
1 files changed, 4 insertions, 7 deletions
| diff --git a/host/lib/usrp/common/adf5355.cpp b/host/lib/usrp/common/adf5355.cpp index e3fd66bc2..80c300d47 100644 --- a/host/lib/usrp/common/adf5355.cpp +++ b/host/lib/usrp/common/adf5355.cpp @@ -48,6 +48,7 @@ static const double ADF5355_PHASE_RESYNC_TIME       = 400e-6;  static const uint32_t ADF5355_MOD1           = 16777216;  static const uint32_t ADF5355_MAX_MOD2       = 16384; +static const uint32_t ADF5355_MAX_FRAC2      = 16384;  //static const uint16_t ADF5355_MIN_INT_PRESCALER_89 = 75;  class adf5355_impl : public adf5355_iface @@ -261,15 +262,11 @@ public:          double N = prescaler_input_freq / _pfd_freq;          uint16_t INT = static_cast<uint16_t>(floor(N));          uint32_t FRAC1 = static_cast<uint32_t>(floor((N - INT) * ADF5355_MOD1)); -        double residue = ADF5355_MOD1 * (N - (INT + FRAC1 / ADF5355_MOD1)); +        double residue = (N - INT) * ADF5355_MOD1 - FRAC1;          double gcd = boost::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution)); -        uint16_t MOD2 = static_cast<uint16_t>(floor(_pfd_freq / gcd)); - -        if (MOD2 > ADF5355_MAX_MOD2) { -            MOD2 = ADF5355_MAX_MOD2; -        } -        uint16_t FRAC2 = ceil(residue * MOD2); +        uint16_t MOD2 = static_cast<uint16_t>(std::min(floor(_pfd_freq / gcd), static_cast<double>(ADF5355_MAX_MOD2))); +        uint16_t FRAC2 = static_cast<uint16_t>(std::min(ceil(residue * MOD2), static_cast<double>(ADF5355_MAX_FRAC2)));          double coerced_vco_freq = _pfd_freq * (              todbl(INT) + ( | 
