ad9910: fix asf range (#1450)

* ad9910: fix asf range

The ASF is a 14-bit word. The highest possible value is 0x3fff, not
0x3ffe. `int(round(1.0 * 0x3fff)) == 0x3fff`.

I don't remember and understand why this was 0x3ffe since the beginning.
0x3fff was already used as a default in `set_mu()`

Signed-off-by: Robert Jördens <rj@quartiq.de>

* RELEASE_NOTES: ad9910 asf scale change

Co-authored-by: David Nadlinger <code@klickverbot.at>
This commit is contained in:
Robert Jördens 2020-05-29 11:13:26 +02:00 committed by GitHub
parent cb76f9da89
commit 9822b88d9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 5 deletions

View File

@ -13,6 +13,8 @@ Highlights:
than the RTIO period than the RTIO period
* Coredevice SI to mu conversions now always return valid codes, or raise a `ValueError`. * Coredevice SI to mu conversions now always return valid codes, or raise a `ValueError`.
* Zotino now exposes `voltage_to_mu()` * Zotino now exposes `voltage_to_mu()`
* `ad9910`: The maximum amplitude scale factor is now `0x3fff` (was `0x3ffe`
before).
* Applets now restart if they are running and a ccb call changes their spec * Applets now restart if they are running and a ccb call changes their spec
Breaking changes: Breaking changes:

View File

@ -539,9 +539,9 @@ class AD9910:
def set_asf(self, asf): def set_asf(self, asf):
"""Set the value stored to the AD9910's amplitude scale factor (ASF) register. """Set the value stored to the AD9910's amplitude scale factor (ASF) register.
:param asf: Amplitude scale factor to be stored, range: 0 to 0x3ffe. :param asf: Amplitude scale factor to be stored, range: 0 to 0x3fff.
""" """
self.write32(_AD9910_REG_ASF, asf<<2) self.write32(_AD9910_REG_ASF, asf << 2)
@kernel @kernel
def set_pow(self, pow_): def set_pow(self, pow_):
@ -581,8 +581,8 @@ class AD9910:
def amplitude_to_asf(self, amplitude): def amplitude_to_asf(self, amplitude):
"""Return 14-bit amplitude scale factor corresponding to given """Return 14-bit amplitude scale factor corresponding to given
fractional amplitude.""" fractional amplitude."""
code = int32(round(amplitude * 0x3ffe)) code = int32(round(amplitude * 0x3fff))
if code < 0 or code > (1 << 14) - 1: if code < 0 or code > 0x3fff:
raise ValueError("Invalid AD9910 fractional amplitude!") raise ValueError("Invalid AD9910 fractional amplitude!")
return code return code
@ -590,7 +590,7 @@ class AD9910:
def asf_to_amplitude(self, asf): def asf_to_amplitude(self, asf):
"""Return amplitude as a fraction of full scale corresponding to given """Return amplitude as a fraction of full scale corresponding to given
amplitude scale factor.""" amplitude scale factor."""
return asf / float(0x3ffe) return asf / float(0x3fff)
@portable(flags={"fast-math"}) @portable(flags={"fast-math"})
def frequency_to_ram(self, frequency, ram): def frequency_to_ram(self, frequency, ram):