Skip to content

Instantly share code, notes, and snippets.

@bodokaiser
Created September 11, 2024 15:24
Show Gist options
  • Save bodokaiser/98b86d4d84f51f304d0256e868696af1 to your computer and use it in GitHub Desktop.
Save bodokaiser/98b86d4d84f51f304d0256e868696af1 to your computer and use it in GitHub Desktop.
import spcm
import math
from spcm import units
import numpy as np
size = 100
f0 = np.linspace(85.0e6, 121.0e6, size)
f1 = np.linspace(84.5e6, 120.5e6, size)
x, y = np.meshgrid(f0, f1)
freqs = np.vstack([x.ravel(), y.ravel()]).T
card: spcm.Card
with spcm.Card("/dev/spcm1") as card:
card.card_mode(spcm.SPC_REP_STD_DDS)
channels = spcm.Channels(card)
channels.enable(True)
channels.amp(2.0 * units.V)
card.write_setup()
dds = spcm.DDSCommandQueue(card, channels=channels)
dds.reset()
dds.data_transfer_mode(spcm.SPCM_DDS_DTM_DMA)
dds.cores_on_channel(1, spcm.SPCM_DDS_CORE20)
card.start(spcm.M2CMD_CARD_ENABLETRIGGER)
dds.trg_src(spcm.SPCM_DDS_TRG_SRC_TIMER)
dds.trg_timer(0.01)
frac = 0.4
dds.amp(0, frac)
dds.freq(0, f0.mean())
dds.amp(20, frac)
dds.freq(20, f1.mean())
dds.exec_at_trg()
dds.write_to_card()
time_step = 1e-5
dds.trg_timer(time_step)
for i in range(math.floor(10 / time_step)):
dds.freq(0, f0.mean())
dds.freq(20, f1.mean())
dds.exec_at_trg()
dds.write_to_card()
dds.mode = dds.WRITE_MODE.WAIT_IF_FULL
card.cmd(spcm.M2CMD_CARD_FORCETRIGGER)
print("Card triggered")
print("Streaming... stop by pressing Ctrl+C")
try:
while True:
for (f0, f1) in freqs:
dds.freq(0, f0)
dds.freq(20, f1)
dds.exec_at_trg()
if dds.status() & spcm.SPCM_DDS_STAT_QUEUE_UNDERRUN:
break
print("ERROR: Buffer underrun")
except KeyboardInterrupt:
print("Ctrl+C pressed: streaming stopped by user")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment