Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
P
Production Test Suite
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
9
Issues
9
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Production Test Suite
Commits
5fbd54a2
Commit
5fbd54a2
authored
May 10, 2013
by
Matthieu Cattin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
test28: Fix few bugs, add comments.
parent
43f1a9c8
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
17 deletions
+49
-17
test28.py
test/fmcadc100m14b4cha/python/test28.py
+49
-17
No files found.
test/fmcadc100m14b4cha/python/test28.py
View file @
5fbd54a2
...
...
@@ -110,6 +110,7 @@ def hex2signed(value):
else
:
return
value
# Converts signed to two's complement hex
def
signed2hex
(
value
):
if
value
<
0
:
...
...
@@ -117,10 +118,12 @@ def signed2hex(value):
else
:
return
value
# Converts digital value to volts
def
digital2volt
(
value
,
full_scale
,
nb_bit
):
return
float
(
value
)
*
float
(
full_scale
)
/
2
**
nb_bit
# Converts volts to digital value with half full range offset
def
volt2digital
(
value
,
full_scale
,
nb_bit
):
digital
=
(
value
+
full_scale
/
2
)
*
2
**
nb_bit
/
full_scale
...
...
@@ -131,6 +134,7 @@ def volt2digital(value, full_scale, nb_bit):
#print('volt2digital: %2.9f > %2.9f')%(value,digital)
return
int
(
digital
)
# Converts volts to digital value
def
volt2digital_without_offset
(
value
,
full_scale
,
nb_bit
):
if
(
value
>
(
2
**
nb_bit
)
/
2
-
1
):
...
...
@@ -141,7 +145,8 @@ def volt2digital_without_offset(value, full_scale, nb_bit):
#print('volt2digital: %2.9f > %2.9f')%(value,digital)
return
int
(
digital
)
# Clear DDR memory (fill with zeros)
# Clears DDR memory (fill with zeros)
def
clear_ddr
(
carrier
,
verbose
=
False
):
if
verbose
:
print
(
"Clearing DDR memory"
)
...
...
@@ -174,6 +179,7 @@ def clear_ddr(carrier, verbose=False):
carrier
.
set_irq_dma_done_mask
(
0
)
# Returns calibration data from fmc eeprom
def
get_calibr_data
(
fmc
,
eeprom_bin_filename
,
calibr_bin_filename
,
verbose
=
False
):
if
verbose
:
print
"Read calibration data from FMC EEPROM:"
...
...
@@ -232,12 +238,12 @@ def get_calibr_data(fmc, eeprom_bin_filename, calibr_bin_filename, verbose=False
adc_corr_data
[
adc_range
][
'gain'
]
.
append
(
eeprom_corr_data
.
pop
(
0
))
adc_corr_data
[
adc_range
][
'temp'
]
=
eeprom_corr_data
.
pop
(
0
)
/
100.0
for
IN_RANGE
in
RANGES
:
for
dac_range
in
RANGES
:
for
ch
in
range
(
NB_CHANNELS
):
dac_corr_data
[
ad
c_range
][
'offset'
]
.
append
(
hex2signed
(
eeprom_corr_data
.
pop
(
0
)))
dac_corr_data
[
da
c_range
][
'offset'
]
.
append
(
hex2signed
(
eeprom_corr_data
.
pop
(
0
)))
for
ch
in
range
(
NB_CHANNELS
):
dac_corr_data
[
ad
c_range
][
'gain'
]
.
append
(
eeprom_corr_data
.
pop
(
0
))
dac_corr_data
[
ad
c_range
][
'temp'
]
=
eeprom_corr_data
.
pop
(
0
)
/
100.0
dac_corr_data
[
da
c_range
][
'gain'
]
.
append
(
eeprom_corr_data
.
pop
(
0
))
dac_corr_data
[
da
c_range
][
'temp'
]
=
eeprom_corr_data
.
pop
(
0
)
/
100.0
return
adc_corr_data
,
dac_corr_data
...
...
@@ -258,6 +264,7 @@ def set_awg(awg, freq, ampl, offset, verbose=False):
awg
.
sync
=
True
time
.
sleep
(
AWG_SET_SLEEP
)
# Get best adc input range for a given amplitude
def
get_best_input_range
(
in_ampl
,
term
,
verbose
=
False
):
# If the 50 ohms termination is enabled, input amplitude is reduced by a factor 2
...
...
@@ -272,6 +279,7 @@ def get_best_input_range(in_ampl, term, verbose=False):
print
(
"Selected input range:
%
s"
%
in_range
)
return
in_range
# Set acquisition params
def
set_acq
(
fmc
,
nb_shots
,
pre_trig_samples
,
post_trig_samples
,
decim_factor
,
verbose
=
False
):
fmc
.
set_pre_trig_samples
(
pre_trig_samples
)
...
...
@@ -281,6 +289,7 @@ def set_acq(fmc, nb_shots, pre_trig_samples, post_trig_samples, decim_factor, ve
if
verbose
:
print
(
"Acquisition params -> number of shots:
%
d, pre-trigger samples:
%
d, post-trigger samples:
%
d, decimation factor:
%
d"
%
(
nb_shots
,
pre_trig_samples
,
post_trig_samples
,
decim_factor
))
# Set analog input range and termination (same on all channels)
def
set_adc_input
(
fmc
,
term
,
in_range
,
verbose
=
False
):
for
channel
in
range
(
1
,
NB_CHANNELS
+
1
):
...
...
@@ -290,6 +299,7 @@ def set_adc_input(fmc, term, in_range, verbose=False):
if
verbose
:
print
(
"ADC input params -> Termination:
%
s, input range:
%
s"
%
(
term
,
in_range
))
# Set channel offset with the DAC (same on all channels)
def
set_adc_offset
(
fmc
,
offset_volt
,
verbose
=
False
):
dac_fs
=
DAC_FS
...
...
@@ -301,6 +311,7 @@ def set_adc_offset(fmc, offset_volt, verbose=False):
fmc
.
set_dc_offset
(
channel
,
dac_d
)
time
.
sleep
(
DAC_SET_SLEEP
)
# Set hardware trigger
def
set_adc_trig
(
fmc
,
hw_sel
,
hw_pol
,
channel
,
thres_volt
,
delay
,
in_range
,
verbose
=
False
):
fs
=
RANGES
[
in_range
]
...
...
@@ -365,6 +376,7 @@ def make_acq(carrier, fmc, verbose=False):
# Disables acquisition end interrupt
carrier
.
set_irq_acq_end_mask
(
0
)
# Make a linked list dma
def
make_dma
(
carrier
,
start_byte_addr
,
length_bytes
,
in_range
,
verbose
=
False
):
# Enable "DMA done" interrupt
...
...
@@ -394,6 +406,7 @@ def make_dma(carrier, start_byte_addr, length_bytes, in_range, verbose=False):
#carrier.print_irq_controller_regs()
return
data
# Get data from DDR memory
def
get_acq_data
(
carrier
,
fmc
,
samples
,
pre_trig_samples
,
nb_shots
,
in_range
,
verbose
=
False
):
...
...
@@ -420,9 +433,9 @@ def get_acq_data(carrier, fmc, samples, pre_trig_samples, nb_shots, in_range, ve
start_pos
=
trig_pos
-
pre_trig_samples
if
verbose
:
print
(
"Trigger position (samples) :
%
d"
%
(
trig_pos
))
print
(
"Acqisition start position (samples):
%
d"
%
(
start_pos
))
print
(
"Total number of samples :
%
d"
%
(
samples
))
print
(
"Trigger position (samples)
:
%
d"
%
(
trig_pos
))
print
(
"Acq
u
isition start position (samples):
%
d"
%
(
start_pos
))
print
(
"Total number of samples
:
%
d"
%
(
samples
))
# Check if acquisition is overlapping ddr memory
if
start_pos
+
samples
>
MEMORY_SIZE
:
...
...
@@ -491,6 +504,8 @@ def plot_all(data, ylimit, trig_level, trig_pos):
return
0
def
main
(
default_directory
=
'.'
):
...
...
@@ -525,7 +540,7 @@ def main (default_directory='.'):
try
:
#
Others
objects declaration
#
Calibration box and arbitrary waveform generator
objects declaration
usb_tty
=
CttyUSB
()
awg_tty
=
usb_tty
.
find_usb_tty
(
AWG_USB_VENDOR_ID
,
AWG_USB_PRODUCT_ID
)
box_tty
=
usb_tty
.
find_usb_tty
(
BOX_USB_VENDOR_ID
,
BOX_USB_PRODUCT_ID
)
...
...
@@ -542,7 +557,7 @@ def main (default_directory='.'):
calibr_bin_filename
=
os
.
path
.
join
(
default_directory
,
CALIBR_BIN_FILENAME
)
eeprom_bin_filename
=
os
.
path
.
join
(
default_directory
,
EEPROM_BIN_FILENAME
)
adc_corr_data
,
dac_corr_data
=
get_calibr_data
(
fmc
,
eeprom_bin_filename
,
calibr_bin_filename
,
False
)
# Apply DAC correction
# Apply DAC correction
(correction data will be used every time a DAC is set)
fmc
.
set_dac_corr
(
dac_corr_data
)
...
...
@@ -561,15 +576,15 @@ def main (default_directory='.'):
# Choose input termination randomly
##########################################################
#
adc_term = rdm.choice(['ON', 'OFF'])
adc_term
=
'OFF
'
adc_term
=
rdm
.
choice
([
'ON'
,
'OFF'
])
#adc_term = 'ON
'
##########################################################
print
(
"Input termination:
%
s"
%
adc_term
)
# Choose input range randomly
##########################################################
#
adc_range = rdm.choice(['10V', '1V', '100mV'])
adc_range
=
'10V'
adc_range
=
rdm
.
choice
([
'10V'
,
'1V'
,
'100mV'
])
#
adc_range = '10V'
##########################################################
print
(
"Input range:
%
s"
%
adc_range
)
...
...
@@ -593,14 +608,19 @@ def main (default_directory='.'):
if
adc_term
==
'ON'
:
sine_min_ampl
*=
2
sine_max_ampl
*=
2
print
(
"Input sine wave => m
ax amplitude:
%2.3
fV, min
amplitude:
%2.3
fV"
%
(
sine_min_ampl
,
sine_max_ampl
))
print
(
"Input sine wave => m
in amplitude:
%2.3
fV, max
amplitude:
%2.3
fV"
%
(
sine_min_ampl
,
sine_max_ampl
))
#sine_ampl = sine_min_ampl + ((sine_max_ampl-sine_min_ampl)*rdm.random())
sine_ampl
=
rdm
.
randrange
(
int
(
sine_min_ampl
*
1E3
),
int
(
sine_max_ampl
*
1E3
),
100
)
/
1000.0
#sine_offset = (sine_max_ampl-sine_ampl)*rdm.random()
sine_offset
=
0
sine_offset
=
0
.0
print
(
"Input sine wave => Frequency:
%3.3
fMHz, Amplitude:
%2.3
fVp, Offset:
%2.3
fV"
%
(
sine_freq
/
1E6
,
sine_ampl
,
sine_offset
))
# Configure AWG with sine wave
#######################
#sine_freq = 1E6
#sine_ampl = 2.0
#sien_offset = 0.0
#######################
set_awg
(
awg
,
sine_freq
,
sine_ampl
,
sine_offset
,
True
)
...
...
@@ -621,11 +641,14 @@ def main (default_directory='.'):
########################################################################
# Configure trigger
#######################
trig_hw_sel
=
0
# internal
#trig_hw_sel = 1 # external
trig_hw_pol
=
0
# rising
trig_channel
=
channel
trig_thres
=
(
sine_ampl
+
0.05
)
# in Volts
trig_thres
=
sine_offset
# in Volts
trig_delay
=
0
# in samples
#######################
set_adc_trig
(
fmc
,
trig_hw_sel
,
trig_hw_pol
,
trig_channel
,
trig_thres
,
trig_delay
,
adc_range
,
True
)
# Find the minimum number of samples to have ACQ_MIN_PERIODS of the sine wave
...
...
@@ -635,13 +658,16 @@ def main (default_directory='.'):
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Can't use all available memory on-board.
# Bad memory management in my Python program...
# -> Limiting the max number of samples.
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
mem_size
=
MEMORY_SIZE
/
100
print
(
"Memory size in samples :
%
d"
%
mem_size
)
# Choose the number of shots and samples randomly
#######################
#multishot = rdm.choice([False, True])
multishot
=
False
#######################
if
multishot
:
acq_samples
=
rdm
.
randrange
(
acq_min_samples
,
MULTISHOT_MAX_SIZE
+
1
)
acq_nb_shots
=
rdm
.
randrange
(
1
,
(
mem_size
/
acq_samples
)
+
1
)
...
...
@@ -655,7 +681,13 @@ def main (default_directory='.'):
acq_post_trig_samples
=
acq_samples
-
acq_pre_trig_samples
# Configure acquisition
####################
acq_decim_factor
=
1
acq_nb_shots
=
1
#acq_pre_trig_samples = 100
#acq_post_trig_samples = 1000
#acq_samples = acq_pre_trig_samples + acq_post_trig_samples
####################
set_acq
(
fmc
,
acq_nb_shots
,
acq_pre_trig_samples
,
acq_post_trig_samples
,
acq_decim_factor
,
True
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment