Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
FMC ADC 100M 14b 4cha - Testing
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
FMC ADC 100M 14b 4cha - Testing
Commits
4ec6d9fe
Commit
4ec6d9fe
authored
Jan 26, 2012
by
Matthieu Cattin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use adc acquisition DMA + averaging instead of current adc value register.
parent
a41d44f0
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
117 additions
and
28 deletions
+117
-28
test07.py
test/fmcadc100m14b4cha/python/test07.py
+117
-28
No files found.
test/fmcadc100m14b4cha/python/test07.py
View file @
4ec6d9fe
...
...
@@ -9,9 +9,11 @@ import sys
import
rr
import
time
import
os
from
numpy
import
*
from
ptsexcept
import
*
import
spec_fmc_adc
import
fmc_adc
"""
...
...
@@ -21,12 +23,84 @@ Note: Requires test00.py to run first to load the firmware!
"""
NB_CHANNELS
=
4
OFFSET_POS
=
0xFFFF
OFFSET_NEG
=
0x0000
ADC_POS
=
0x0000
ADC_MID
=
0x8000
ADC_NEG
=
0xFFFC
ADC_TOL
=
0x150
PRE_TRIG_SAMPLES
=
1000
POST_TRIG_SAMPLES
=
100000
NB_SHOTS
=
1
ACQ_LENGTH
=
50000
# in samples
ACQ_TIMEOUT
=
10
# Values for offset DAC
# Note:
# values < 0x8000 represents positive offset
# values > 0x8000 represents negative offset
OFFSET_POS
=
0x0000
OFFSET_NEG
=
0xFFFF
DAC_SET_SLEEP
=
0.1
# in [s]
# Expected ADC values
ADC_NEG
=
-
32768.0
ADC_MID
=
0.0
ADC_POS
=
32764.0
# not 32767.0 because the ADC is 14-bit left-shifted by 2, the last 3 bit are always 0
ADC_TOL
=
200.0
def
hex2signed
(
value
):
if
(
value
&
0x8000
):
return
-
((
~
value
&
0xFFFF
)
+
1
)
else
:
return
value
def
acq_config
(
fmc
):
print
(
'Initialise FMC board
\n
'
)
# Set trigger
fmc
.
set_soft_trig
()
# Set acquisition
fmc
.
set_pre_trig_samples
(
PRE_TRIG_SAMPLES
)
fmc
.
set_post_trig_samples
(
POST_TRIG_SAMPLES
)
fmc
.
set_shots
(
NB_SHOTS
)
def
acq_channels
(
fmc
,
spec_fmc
):
# Make sure no acquisition is running
fmc
.
stop_acq
()
# Start acquisition
fmc
.
start_acq
()
time
.
sleep
(
0.01
)
# Trigger
fmc
.
sw_trig
()
# Wait end of acquisition
timeout
=
0
while
(
'IDLE'
!=
fmc
.
get_acq_fsm_state
()):
time
.
sleep
(
.1
)
timeout
+=
1
if
(
ACQ_TIMEOUT
<
timeout
):
print
"Acquisition timeout. Missing trigger?."
print
"Acq FSm state:
%
s"
%
fmc
.
get_acq_fsm_state
()
return
1
# Retrieve data trough DMA
trig_pos
=
fmc
.
get_trig_pos
()
# Enable "DMA done" iinterrupt
spec_fmc
.
set_irq_en_mask
(
0x1
)
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data
=
spec_fmc
.
get_data
((
trig_pos
<<
3
),
ACQ_LENGTH
*
8
)
# Disable "DMA done" iinterrupt
spec_fmc
.
set_irq_en_mask
(
0x0
)
channels_data
=
[
hex2signed
(
item
)
for
item
in
channels_data
]
return
channels_data
def
acq_mean
(
acq_data
):
mean_d
=
[]
for
channel
in
range
(
1
,
NB_CHANNELS
+
1
):
# calculate mean value for each channel
mean_d
.
append
(
mean
(
acq_data
[
channel
-
1
::
4
]))
return
mean_d
def
main
(
default_directory
=
'.'
):
"""
...
...
@@ -43,8 +117,12 @@ def main (default_directory='.'):
# Objects declaration
spec
=
rr
.
Gennum
()
# bind to the SPEC board
spec_fmc
=
spec_fmc_adc
.
CSpecFmcAdc100Ms
(
spec
)
fmc
=
fmc_adc
.
CFmcAdc100Ms
(
spec
)
# Configuration
acq_config
(
fmc
)
error
=
0
# All inputs in calibration mode
...
...
@@ -54,52 +132,63 @@ def main (default_directory='.'):
# Disable test pattern (just in case)
fmc
.
testpat_dis
()
#---------------------------------------------------------------------------
# Set a positive offset on all channels
#---------------------------------------------------------------------------
print
(
'Set positive offset:
%.4
X'
%
OFFSET_POS
)
for
i
in
range
(
1
,
NB_CHANNELS
+
1
):
fmc
.
dc_offset_calibr
(
i
,
OFFSET_POS
)
time
.
sleep
(
1
)
# Read channels current data register
for
i
in
range
(
1
,
NB_CHANNELS
+
1
):
adc_value
=
fmc
.
get_current_adc_value
(
i
)
print
(
'ADC channel
%
d value:
%
d expected value:
%
d'
)
%
(
i
,
adc_value
,
ADC_POS
)
if
(
ADC_POS
!=
adc_value
):
time
.
sleep
(
DAC_SET_SLEEP
)
# Read channels
acq_data
=
acq_channels
(
fmc
,
spec_fmc
)
acq_data_mean
=
acq_mean
(
acq_data
)
for
i
in
range
(
len
(
acq_data_mean
)):
print
(
'ADC channel
%
d value:
%
d expected value:
%
d'
)
%
(
i
+
1
,
acq_data_mean
[
i
],
ADC_POS
)
if
(
ADC_POS
!=
acq_data_mean
[
i
]):
print
(
'Channel
%
d offset circuit is malfunctioning'
)
%
(
i
)
error
+=
1
#raise PtsError('Channel %d offset circuit is malfunctioning'%i)
# Reset offset DACs
#---------------------------------------------------------------------------
# Reset offset DACs, will output mid-range value (0x8000)
#---------------------------------------------------------------------------
print
(
'Reset offset'
)
fmc
.
dc_offset_reset
()
time
.
sleep
(
1
)
# Read channels current data register
for
i
in
range
(
1
,
NB_CHANNELS
+
1
):
adc_value
=
fmc
.
get_current_adc_value
(
i
)
print
(
'ADC channel
%
d value:
%
d expected value:
%
d tolerance:
%
d'
)
%
(
i
,
adc_value
,
ADC_MID
,
ADC_TOL
)
if
((
ADC_MID
-
ADC_TOL
>
adc_value
)
|
(
ADC_MID
+
ADC_TOL
<
adc_value
)):
time
.
sleep
(
DAC_SET_SLEEP
)
# Read channels
acq_data
=
acq_channels
(
fmc
,
spec_fmc
)
acq_data_mean
=
acq_mean
(
acq_data
)
for
i
in
range
(
len
(
acq_data_mean
)):
print
(
'ADC channel
%
d value:
%
d expected value:
%
d +/-
%
d'
)
%
(
i
+
1
,
acq_data_mean
[
i
],
ADC_MID
,
ADC_TOL
)
if
((
ADC_MID
-
ADC_TOL
>
acq_data_mean
[
i
])
|
(
ADC_MID
+
ADC_TOL
<
acq_data_mean
[
i
])):
print
(
'Channel
%
d offset circuit is malfunctioning'
)
%
(
i
)
error
+=
1
#raise PtsError('Channel %d offset circuit is malfunctioning'%i)
#---------------------------------------------------------------------------
# Set a negative offset on all channels
#---------------------------------------------------------------------------
print
(
'Set negative offset:
%.4
X'
%
OFFSET_NEG
)
for
i
in
range
(
1
,
NB_CHANNELS
+
1
):
fmc
.
dc_offset_calibr
(
i
,
OFFSET_NEG
)
time
.
sleep
(
1
)
# Read channels current data register
for
i
in
range
(
1
,
NB_CHANNELS
+
1
):
adc_value
=
fmc
.
get_current_adc_value
(
i
)
print
(
'ADC channel
%
d value:
%
d expected value:
%
d'
)
%
(
i
,
adc_value
,
ADC_NEG
)
if
(
ADC_NEG
!=
adc_value
):
time
.
sleep
(
DAC_SET_SLEEP
)
# Read channels
acq_data
=
acq_channels
(
fmc
,
spec_fmc
)
acq_data_mean
=
acq_mean
(
acq_data
)
for
i
in
range
(
len
(
acq_data_mean
)):
print
(
'ADC channel
%
d value:
%
d expected value:
%
d'
)
%
(
i
+
1
,
acq_data_mean
[
i
],
ADC_NEG
)
if
(
ADC_NEG
!=
acq_data_mean
[
i
]):
print
(
'Channel
%
d offset circuit is malfunctioning'
)
%
(
i
)
error
+=
1
#raise PtsError('Channel %d offset circuit is malfunctioning'%i)
# Reset offset DACs
fmc
.
dc_offset_reset
()
time
.
sleep
(
DAC_SET_SLEEP
)
# Check if an error occured during offset DAC test
if
(
error
!=
0
):
...
...
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