
I am having problem with using 2 or more oscillators in one channel when the RF frequency analyzer. The carrier frequency is at 200MHz and the first two Oscs, osc0 and osc1 are at 5MHz and 10MHz. Amplitude = 1, phase = 0. The rest amplitudes are all 0. The read gives every multiple of 5MHz when it should be two peaks at 205 and 210MHz? Here is my code:
`from artiq.experiment import *
import kasli.coredevice.phaser
import numpy as np
from typing import List
class phaserTest(EnvExperiment):
def build(self):
self.setattr_device('core')
self.phaser: List[kasli.coredevice.phaser.Phaser] = [self.get_device('phaser0')]
#fixed
self.phaser_en: List[bool] = []
self.att: List[List[float]] = [[]] # [i][ch]
self.carrier_freq: List[List[float]] = [[]] # [i][ch]
self.osc_freq: List[List[List[float]]] = [[[], []]] # [i][ch][osc]
self.osc_amp: List[List[List[float]]] = [[[], []]]
self.osc_phase: List[List[List[float]]] = [[[], []]]
# takes input values
for i in range(1):
self.phaser_en.append(self.get_argument(f'Enable Phaser {i}', BooleanValue(False)))
for ch in range(2):
self.att[i].append(self.get_argument(
f'Phaser {i} Ch {ch} Attenuation',
NumberValue(0.0, unit='dB', min=0, max=31.5)
))
self.carrier_freq[i].append(self.get_argument(
f'Phaser {i} Ch {ch} Carrier Frequency',
NumberValue(200 * MHz, unit='MHz', min=112.5 * MHz, max=512.5 * MHz)
))
for osc in range(5):
self.osc_freq[i][ch].append(self.get_argument(
f'Phaser {i} Ch {ch} Osc {osc} Frequency',
NumberValue(0.0, unit='MHz', min=-10 * MHz, max=10 * MHz)
))
self.osc_amp[i][ch].append(self.get_argument(
f'Phaser {i} Ch {ch} Osc {osc} Amplitude',
NumberValue(0.0, min=0, max=1)
))
self.osc_phase[i][ch].append(self.get_argument(
f'Phaser {i} Ch {ch} Osc {osc} Phase',
NumberValue(0.0)
))
@rpc(flags={"async"})
def p(self, *p):
print([hex(_ & 0xffffffff) for _ in p])
@kernel
def run(self):
self.core.reset()
delay(1 * ms)
for i in range(1):
f = self.phaser[i]
if not self.phaser_en[i]:
f.set_cfg(dac_sleep=1, trf0_ps=1, trf1_ps=1)
continue
f.init()
delay(1 * ms)
for j in range(2):
ch = f.channel[j]
delay(100 * us)
ch.set_att(self.att[i][j])
ch.set_duc_frequency(self.carrier_freq[i][j] - 312.5 * MHz) # trf lo assumed 312.5 mhz
ch.set_duc_cfg(select=0, clr=0)
delay(100 * us)
for k in range(5):
osc = ch.oscillator[k]
osc.set_frequency(self.osc_freq[i][j][k])
delay(100 * us)
osc.set_amplitude_phase(self.osc_amp[i][j][k],
phase=self.osc_phase[i][j][k],
clr=np.int32(0))
delay(100 * us)
f.duc_stb()
for i in range(1):
for j in range(2):
for k in range(8):
r = self.phaser[i].channel[j].trf_read(k)
delay(.1 * ms)
self.p(r)
self.core.break_realtime()
alarm = self.phaser[i].dac_read(0x05)
self.p(alarm)
self.core.wait_until_mu(now_mu())
`