File: external_clocksource.py

package info (click to toggle)
libm2k 0.9.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 95,580 kB
  • sloc: xml: 1,611,497; cpp: 16,278; python: 4,181; cs: 516; sh: 471; ansic: 403; makefile: 35
file content (104 lines) | stat: -rw-r--r-- 2,991 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#
# Copyright (c) 2019 Analog Devices Inc.
#
# This file is part of libm2k
# (see http://www.github.com/analogdevicesinc/libm2k).
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

# This example assumes the following connection:
# W1 -> DIO0
#
# The application will generate a square wave on W1 which is fed into DIO0
# and serves as external clock signal for the digital device. A pattern generated
# on DIO1 is plotted and displayed.

import libm2k
import numpy as np
import matplotlib.pyplot as plt

max_dac_sample_rate = 75000000
number_of_samples = 1024
clock_frequency = 75000000
digital_sampling_frequency = 100000000
samples_per_period = 1024
digital_ch = 1
clock_ch = 0
acquisition_buffer_size = 4096


def generate_clock_signal(number_of_samples):

    buffer = []
    for i in range(int(number_of_samples/2)):
        buffer.append(0)
    for i in range(int(number_of_samples/2)):
        buffer.append(3.3)
    print(buffer)
    return buffer


# Context setup

ctx = libm2k.m2kOpen()
aout = ctx.getAnalogOut()
dig = ctx.getDigital()

# Prevent bad initial config
dig.reset()
aout.reset()

ctx.calibrateDAC()
ctx.calibrateADC()

# AnalogOut setup

aout.setCyclic(True)
aout.enableChannel(clock_ch, True)
aout.setSampleRate(clock_ch, max_dac_sample_rate)
oversampling_ratio = max_dac_sample_rate/(clock_frequency * number_of_samples)
aout.setOversamplingRatio(clock_ch, int(oversampling_ratio))
buffer = generate_clock_signal(number_of_samples)
aout.push(clock_ch, buffer)

# Digital Setup

dig.reset()
dig.setExternalClocksource(True)
print("Clocksource external --> "+str(dig.isClocksourceExternal()))
dig.setCyclic(True)
dig.setSampleRateIn(digital_sampling_frequency)
dig.setDirection(clock_ch, libm2k.DIO_INPUT)
dig.enableChannel(clock_ch, False)
dig.setDirection(digital_ch, libm2k.DIO_OUTPUT)
dig.setSampleRateOut(digital_sampling_frequency)
dig.enableChannel(digital_ch, True)

duty = samples_per_period / 2  # 50%
signal = np.arange(samples_per_period) < duty
digital_buffer = list(map(lambda s: int(s) << digital_ch, signal))  # generate signal on desired channel

for i in range(8):
    buffer.extend(buffer)

dig.push(digital_buffer)

digital_data = dig.getSamples(acquisition_buffer_size)

digital_data_one_ch = list(map(lambda s: ((0x0001 << digital_ch) & int(s)) >> digital_ch, digital_data))
plt.plot(digital_data_one_ch, label='Digital')
plt.show()