0,0 → 1,272 |
{ |
"cells": [ |
{ |
"cell_type": "markdown", |
"metadata": { |
"deletable": true, |
"editable": true |
}, |
"source": [ |
"# On trigger signal acquisition\n", |
"\n", |
"## Description\n", |
"\n", |
"This example shows how to acquire 16k samples of signal on fast analog inputs.\n", |
"Signal will be acquired when the internal trigger condition is meet.\n", |
"Time length of the acquired signal depends on the time scale of a buffer\n", |
"that can be set with a decimation factor.\n", |
"\n", |
"TODO: describe some calculations\n", |
"\n", |
"## Required hardware\n", |
"\n", |
"- Red Pitaya\n", |
"- Signal (function) generator\n", |
"\n", |
"" |
] |
}, |
{ |
"cell_type": "markdown", |
"metadata": { |
"deletable": true, |
"editable": true |
}, |
"source": [ |
"The `rp` object is an instance of the `redpitaya` class.\n", |
"When the object is initialized, the FPGA bitstream is loaded and\n", |
"memory mapped FPGA registers are mapped into software.\n", |
"Repeating FPGA bitstream loading will cause all registers to reset,\n", |
"while mapping the memory space multiple times will cause segmentation faults.\n", |
"So untill this issues are handled by the driver\n", |
"a `redpitaya` instance should be created only once." |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"from redpitaya import redpitaya\n", |
"rp = redpitaya()" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"# generator configuration\n", |
"#rp.GenReset()\n", |
"#rp.GenFreq(0, 100000.0)\n", |
"#rp.GenAmp(0, 1.0)\n", |
"#rp.GenWaveform(0, rp.WAVEFORM_SINE)\n", |
"#rp.GenOutEnable(0)" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"# acquisition configuration\n", |
"size = rp.AcqGetBufSize()\n", |
"print(size)\n", |
"rp.AcqReset()\n", |
"rp.AcqSetDecimationFactor(1)\n", |
"rp.AcqSetTriggerLevel(0, -0.05)\n", |
"#rp.AcqSetPostTriggerDelay(size//2) # place trigger in the middle of the buffer\n", |
"#rp.AcqSetPostTriggerDelay(size//2)\n", |
"rp.AcqSetPostTriggerDelay(0)\n", |
"\n", |
"size = 1024\n", |
"channels = (0,1)\n", |
"\n", |
"# start acquisition process\n", |
"rp.AcqStart()\n", |
"# set trigger source to start acquisition\n", |
"rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_PE)\n", |
"# wait in a loop for trigger state to chage from TRIG_STATE_WAITING\n", |
"while rp.AcqGetTriggerSrc():\n", |
" pass\n", |
"print('triggered')\n", |
"\n", |
"# read data from FPGA FIFO into memory and display it\n", |
"buff = [rp.AcqGetOldestDataV(ch, size) for ch in channels];" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"import time\n", |
"import numpy as np\n", |
"\n", |
"from bokeh.io import push_notebook, show, output_notebook\n", |
"from bokeh.models import HoverTool, Range1d\n", |
"from bokeh.plotting import figure\n", |
"from bokeh.plotting import show, output_file, vplot\n", |
"from bokeh.resources import INLINE \n", |
"from bokeh.models import Column\n", |
"output_notebook(resources=INLINE)" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"def hfill(histogram, datum, weight=1):\n", |
" for idx, b in enumerate(histogram[1]):\n", |
" if idx > 0:\n", |
" if (datum < b and datum >= histogram[1][0]) or (datum <= b and idx == len(histogram[1]) - 1):\n", |
" histogram[0][idx - 1] += int(weight)\n", |
" break\n", |
" \n", |
"def h1d(title, titlex, titley, nbins, xmin,xmax):\n", |
" h = np.histogram([], bins=nbins, range= (xmin,xmax))\n", |
" p = figure(title=title,tools=\"save\", background_fill_color=\"#E8DDCB\")\n", |
" p.quad(top=h[0], bottom=0, left=h[1][:-1], right=h[1][1:])\n", |
" p.xaxis.axis_label = 'p.h.(ADC)'\n", |
" p.yaxis.axis_label = 'N'\n", |
" return [h,p]" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true, |
"scrolled": false |
}, |
"outputs": [], |
"source": [ |
"hadc = np.histogram([], bins=40, range= (0,0.5))\n", |
"p1 = figure(title=\"ADC distribution\",tools=\"save\", background_fill_color=\"#E8DDCB\")\n", |
"p1.quad(top=hadc[0], bottom=0, left=hadc[1][:-1], right=hadc[1][1:], fill_color=\"#036564\", line_color=\"#033649\")\n", |
"p1.xaxis.axis_label = 'p.h.(ADC)'\n", |
"p1.yaxis.axis_label = 'N'\n", |
"\n", |
"\n", |
"htdc = np.histogram([], bins=100, range= (0,size))\n", |
"p2 = figure(title=\"TDC distribution\",tools=\"save\", background_fill_color=\"#E8DDCB\")\n", |
"p2.quad(top=htdc[0], bottom=0, left=htdc[1][:-1], right=htdc[1][1:], fill_color=\"#036564\", line_color=\"#033649\")\n", |
"p2.xaxis.axis_label = 'p.h.(ADC)'\n", |
"p2.yaxis.axis_label = 'N'\n", |
"\n", |
"#print(hist)\n", |
"#for event in [ 1,2,3,4,4,5,6,32,4,10]:\n", |
"# hfill(hist,event)\n", |
"\n", |
"#adcplot = show(p1, notebook_handle=True)\n", |
"N = size\n", |
"x = np.arange(N) / rp.FS\n", |
"\n", |
"colors = ('red', 'blue')\n", |
"hover = HoverTool(mode = 'vline', tooltips=[(\"T\", \"@x\"), (\"V\", \"@y\")])\n", |
"tools = \"pan,wheel_zoom,box_zoom,reset,crosshair,save\"\n", |
"p = figure(plot_height=500, plot_width=900, title=\"oscilloscope\", toolbar_location=\"above\", tools=(tools, hover))\n", |
"p.xaxis.axis_label='time [s]'\n", |
"p.yaxis.axis_label='voltage [V]'\n", |
"p.y_range=Range1d(-0.1, 0.1)\n", |
"r = [p.line(x, buff[i], line_width=1, line_alpha=0.7, color=colors[i]) for i in channels]\n", |
"\n", |
"target = show( Column(p, p1, p2), notebook_handle=True)" |
] |
}, |
{ |
"cell_type": "code", |
"execution_count": null, |
"metadata": { |
"collapsed": false, |
"deletable": true, |
"editable": true |
}, |
"outputs": [], |
"source": [ |
"size = 1024\n", |
"channels = (0,1)\n", |
"\n", |
"rp.AcqReset()\n", |
"rp.AcqSetDecimationFactor(1)\n", |
"threshold = -0.05\n", |
"rp.AcqSetTriggerLevel(0, threshold)\n", |
"rp.AcqSetPostTriggerDelay(size-80)\n", |
"\n", |
"neve = 0\n", |
"while True:\n", |
" rp.AcqStart()\n", |
" rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_NE) \n", |
" while (rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_NE)): pass\n", |
" buff = [rp.AcqGetLatestDataV(ch, size) for ch in channels];\n", |
"\n", |
" adcdata = np.absolute(np.amin(buff[0]))\n", |
" signal = np.array(buff[0])\n", |
" tdcdata = np.where(signal < threshold)[0] # get item\n", |
"# print (adcdata, tdcdata)\n", |
" hfill(hadc,adcdata)\n", |
" \n", |
" for a in tdcdata:\n", |
" if a - tdcdata[0] > 5:\n", |
" hfill(htdc,a-tdcdata[0])\n", |
" break \n", |
" neve+=1\n", |
" for i in channels:\n", |
" r[i].data_source.data['y'] = buff[i]\n", |
"# push updates to the plot continuously using the handle (intererrupt the notebook kernel to stop)\n", |
" if (neve%10 == 0):\n", |
" push_notebook(handle=target)\n", |
"# time.sleep(0.05)" |
] |
} |
], |
"metadata": { |
"kernelspec": { |
"display_name": "Python 3", |
"language": "python", |
"name": "python3" |
}, |
"language_info": { |
"codemirror_mode": { |
"name": "ipython", |
"version": 3 |
}, |
"file_extension": ".py", |
"mimetype": "text/x-python", |
"name": "python", |
"nbconvert_exporter": "python", |
"pygments_lexer": "ipython3", |
"version": "3.5.2" |
} |
}, |
"nbformat": 4, |
"nbformat_minor": 2 |
} |