Rev 240 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 240 | f9daq | 1 | { | 
        
| 2 | "cells": [  | 
        ||
| 3 |   { | 
        ||
| 4 | "cell_type": "markdown",  | 
        ||
| 5 |    "metadata": { | 
        ||
| 6 | "deletable": true,  | 
        ||
| 7 | "editable": true  | 
        ||
| 8 | },  | 
        ||
| 9 | "source": [  | 
        ||
| 10 | "# On trigger signal acquisition\n",  | 
        ||
| 11 | "\n",  | 
        ||
| 12 | "## Description\n",  | 
        ||
| 13 | "\n",  | 
        ||
| 14 | "This example shows how to acquire 16k samples of signal on fast analog inputs.\n",  | 
        ||
| 15 | "Signal will be acquired when the internal trigger condition is meet.\n",  | 
        ||
| 16 | "Time length of the acquired signal depends on the time scale of a buffer\n",  | 
        ||
| 17 | "that can be set with a decimation factor.\n",  | 
        ||
| 18 | "\n",  | 
        ||
| 19 | "TODO: describe some calculations\n",  | 
        ||
| 20 | "\n",  | 
        ||
| 21 | "## Required hardware\n",  | 
        ||
| 22 | "\n",  | 
        ||
| 23 | "- Red Pitaya\n",  | 
        ||
| 24 | "- Signal (function) generator\n",  | 
        ||
| 25 | "\n",  | 
        ||
| 26 | ""  | 
        ||
| 27 | ]  | 
        ||
| 28 | },  | 
        ||
| 29 |   { | 
        ||
| 30 | "cell_type": "markdown",  | 
        ||
| 31 |    "metadata": { | 
        ||
| 32 | "deletable": true,  | 
        ||
| 33 | "editable": true  | 
        ||
| 34 | },  | 
        ||
| 35 | "source": [  | 
        ||
| 36 | "The `rp` object is an instance of the `redpitaya` class.\n",  | 
        ||
| 37 | "When the object is initialized, the FPGA bitstream is loaded and\n",  | 
        ||
| 38 | "memory mapped FPGA registers are mapped into software.\n",  | 
        ||
| 39 | "Repeating FPGA bitstream loading will cause all registers to reset,\n",  | 
        ||
| 40 | "while mapping the memory space multiple times will cause segmentation faults.\n",  | 
        ||
| 41 | "So untill this issues are handled by the driver\n",  | 
        ||
| 42 | "a `redpitaya` instance should be created only once."  | 
        ||
| 43 | ]  | 
        ||
| 44 | },  | 
        ||
| 45 |   { | 
        ||
| 46 | "cell_type": "code",  | 
        ||
| 47 | "execution_count": null,  | 
        ||
| 48 |    "metadata": { | 
        ||
| 49 | "collapsed": false,  | 
        ||
| 50 | "deletable": true,  | 
        ||
| 51 | "editable": true  | 
        ||
| 52 | },  | 
        ||
| 53 | "outputs": [],  | 
        ||
| 54 | "source": [  | 
        ||
| 55 | "from redpitaya import redpitaya\n",  | 
        ||
| 56 | "rp = redpitaya()"  | 
        ||
| 57 | ]  | 
        ||
| 58 | },  | 
        ||
| 59 |   { | 
        ||
| 60 | "cell_type": "code",  | 
        ||
| 61 | "execution_count": null,  | 
        ||
| 62 |    "metadata": { | 
        ||
| 63 | "collapsed": false,  | 
        ||
| 64 | "deletable": true,  | 
        ||
| 65 | "editable": true  | 
        ||
| 66 | },  | 
        ||
| 67 | "outputs": [],  | 
        ||
| 68 | "source": [  | 
        ||
| 69 | "# generator configuration\n",  | 
        ||
| 70 | "#rp.GenReset()\n",  | 
        ||
| 71 | "#rp.GenFreq(0, 100000.0)\n",  | 
        ||
| 72 | "#rp.GenAmp(0, 1.0)\n",  | 
        ||
| 73 | "#rp.GenWaveform(0, rp.WAVEFORM_SINE)\n",  | 
        ||
| 74 | "#rp.GenOutEnable(0)"  | 
        ||
| 75 | ]  | 
        ||
| 76 | },  | 
        ||
| 77 |   { | 
        ||
| 78 | "cell_type": "code",  | 
        ||
| 79 | "execution_count": null,  | 
        ||
| 80 |    "metadata": { | 
        ||
| 81 | "collapsed": false,  | 
        ||
| 82 | "deletable": true,  | 
        ||
| 83 | "editable": true  | 
        ||
| 84 | },  | 
        ||
| 85 | "outputs": [],  | 
        ||
| 86 | "source": [  | 
        ||
| 87 | "# acquisition configuration\n",  | 
        ||
| 88 | "size = rp.AcqGetBufSize()\n",  | 
        ||
| 89 | "print(size)\n",  | 
        ||
| 90 | "rp.AcqReset()\n",  | 
        ||
| 91 | "rp.AcqSetDecimationFactor(1)\n",  | 
        ||
| 92 | "rp.AcqSetTriggerLevel(0, -0.05)\n",  | 
        ||
| 93 | "#rp.AcqSetPostTriggerDelay(size//2) # place trigger in the middle of the buffer\n",  | 
        ||
| 94 | "#rp.AcqSetPostTriggerDelay(size//2)\n",  | 
        ||
| 95 | "rp.AcqSetPostTriggerDelay(0)\n",  | 
        ||
| 96 | "\n",  | 
        ||
| 97 | "size = 1024\n",  | 
        ||
| 98 | "channels = (0,1)\n",  | 
        ||
| 99 | "\n",  | 
        ||
| 100 | "# start acquisition process\n",  | 
        ||
| 101 | "rp.AcqStart()\n",  | 
        ||
| 102 | "# set trigger source to start acquisition\n",  | 
        ||
| 103 | "rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_PE)\n",  | 
        ||
| 104 | "# wait in a loop for trigger state to chage from TRIG_STATE_WAITING\n",  | 
        ||
| 105 | "while rp.AcqGetTriggerSrc():\n",  | 
        ||
| 106 | " pass\n",  | 
        ||
| 107 |     "print('triggered')\n", | 
        ||
| 108 | "\n",  | 
        ||
| 109 | "# read data from FPGA FIFO into memory and display it\n",  | 
        ||
| 110 | "buff = [rp.AcqGetOldestDataV(ch, size) for ch in channels];"  | 
        ||
| 111 | ]  | 
        ||
| 112 | },  | 
        ||
| 113 |   { | 
        ||
| 114 | "cell_type": "code",  | 
        ||
| 115 | "execution_count": null,  | 
        ||
| 116 |    "metadata": { | 
        ||
| 117 | "collapsed": false,  | 
        ||
| 118 | "deletable": true,  | 
        ||
| 119 | "editable": true  | 
        ||
| 120 | },  | 
        ||
| 121 | "outputs": [],  | 
        ||
| 122 | "source": [  | 
        ||
| 123 | "import time\n",  | 
        ||
| 124 | "import numpy as np\n",  | 
        ||
| 125 | "\n",  | 
        ||
| 126 | "from bokeh.io import push_notebook, show, output_notebook\n",  | 
        ||
| 127 | "from bokeh.models import HoverTool, Range1d\n",  | 
        ||
| 128 | "from bokeh.plotting import figure\n",  | 
        ||
| 129 | "from bokeh.plotting import show, output_file, vplot\n",  | 
        ||
| 130 | "from bokeh.resources import INLINE \n",  | 
        ||
| 131 | "from bokeh.models import Column\n",  | 
        ||
| 132 | "output_notebook(resources=INLINE)"  | 
        ||
| 133 | ]  | 
        ||
| 134 | },  | 
        ||
| 135 |   { | 
        ||
| 136 | "cell_type": "code",  | 
        ||
| 137 | "execution_count": null,  | 
        ||
| 138 |    "metadata": { | 
        ||
| 139 | "collapsed": false,  | 
        ||
| 140 | "deletable": true,  | 
        ||
| 141 | "editable": true  | 
        ||
| 142 | },  | 
        ||
| 143 | "outputs": [],  | 
        ||
| 144 | "source": [  | 
        ||
| 145 | "def hfill(histogram, datum, weight=1):\n",  | 
        ||
| 146 | " for idx, b in enumerate(histogram[1]):\n",  | 
        ||
| 147 | " if idx > 0:\n",  | 
        ||
| 148 | " if (datum < b and datum >= histogram[1][0]) or (datum <= b and idx == len(histogram[1]) - 1):\n",  | 
        ||
| 149 | " histogram[0][idx - 1] += int(weight)\n",  | 
        ||
| 150 | " break\n",  | 
        ||
| 151 | " \n",  | 
        ||
| 152 | "def h1d(title, titlex, titley, nbins, xmin,xmax):\n",  | 
        ||
| 153 | " h = np.histogram([], bins=nbins, range= (xmin,xmax))\n",  | 
        ||
| 154 | " p = figure(title=title,tools=\"save\", background_fill_color=\"#E8DDCB\")\n",  | 
        ||
| 155 | " p.quad(top=h[0], bottom=0, left=h[1][:-1], right=h[1][1:])\n",  | 
        ||
| 156 | " p.xaxis.axis_label = 'p.h.(ADC)'\n",  | 
        ||
| 157 | " p.yaxis.axis_label = 'N'\n",  | 
        ||
| 158 | " return [h,p]"  | 
        ||
| 159 | ]  | 
        ||
| 160 | },  | 
        ||
| 161 |   { | 
        ||
| 162 | "cell_type": "code",  | 
        ||
| 163 | "execution_count": null,  | 
        ||
| 164 |    "metadata": { | 
        ||
| 165 | "collapsed": false,  | 
        ||
| 166 | "deletable": true,  | 
        ||
| 167 | "editable": true,  | 
        ||
| 168 | "scrolled": false  | 
        ||
| 169 | },  | 
        ||
| 170 | "outputs": [],  | 
        ||
| 171 | "source": [  | 
        ||
| 172 | "hadc = np.histogram([], bins=40, range= (0,0.5))\n",  | 
        ||
| 173 | "p1 = figure(title=\"ADC distribution\",tools=\"save\", background_fill_color=\"#E8DDCB\")\n",  | 
        ||
| 174 | "p1.quad(top=hadc[0], bottom=0, left=hadc[1][:-1], right=hadc[1][1:], fill_color=\"#036564\", line_color=\"#033649\")\n",  | 
        ||
| 175 | "p1.xaxis.axis_label = 'p.h.(ADC)'\n",  | 
        ||
| 176 | "p1.yaxis.axis_label = 'N'\n",  | 
        ||
| 177 | "\n",  | 
        ||
| 178 | "\n",  | 
        ||
| 179 | "htdc = np.histogram([], bins=100, range= (0,size))\n",  | 
        ||
| 180 | "p2 = figure(title=\"TDC distribution\",tools=\"save\", background_fill_color=\"#E8DDCB\")\n",  | 
        ||
| 181 | "p2.quad(top=htdc[0], bottom=0, left=htdc[1][:-1], right=htdc[1][1:], fill_color=\"#036564\", line_color=\"#033649\")\n",  | 
        ||
| 182 | "p2.xaxis.axis_label = 'p.h.(ADC)'\n",  | 
        ||
| 183 | "p2.yaxis.axis_label = 'N'\n",  | 
        ||
| 184 | "\n",  | 
        ||
| 185 | "#print(hist)\n",  | 
        ||
| 186 | "#for event in [ 1,2,3,4,4,5,6,32,4,10]:\n",  | 
        ||
| 187 | "# hfill(hist,event)\n",  | 
        ||
| 188 | "\n",  | 
        ||
| 189 | "#adcplot = show(p1, notebook_handle=True)\n",  | 
        ||
| 190 | "N = size\n",  | 
        ||
| 191 | "x = np.arange(N) / rp.FS\n",  | 
        ||
| 192 | "\n",  | 
        ||
| 193 |     "colors = ('red', 'blue')\n", | 
        ||
| 194 | "hover = HoverTool(mode = 'vline', tooltips=[(\"T\", \"@x\"), (\"V\", \"@y\")])\n",  | 
        ||
| 195 | "tools = \"pan,wheel_zoom,box_zoom,reset,crosshair,save\"\n",  | 
        ||
| 196 | "p = figure(plot_height=500, plot_width=900, title=\"oscilloscope\", toolbar_location=\"above\", tools=(tools, hover))\n",  | 
        ||
| 197 | "p.xaxis.axis_label='time [s]'\n",  | 
        ||
| 198 | "p.yaxis.axis_label='voltage [V]'\n",  | 
        ||
| 199 | "p.y_range=Range1d(-0.1, 0.1)\n",  | 
        ||
| 200 | "r = [p.line(x, buff[i], line_width=1, line_alpha=0.7, color=colors[i]) for i in channels]\n",  | 
        ||
| 201 | "\n",  | 
        ||
| 202 | "target = show( Column(p, p1, p2), notebook_handle=True)"  | 
        ||
| 203 | ]  | 
        ||
| 204 | },  | 
        ||
| 205 |   { | 
        ||
| 206 | "cell_type": "code",  | 
        ||
| 207 | "execution_count": null,  | 
        ||
| 208 |    "metadata": { | 
        ||
| 209 | "collapsed": false,  | 
        ||
| 210 | "deletable": true,  | 
        ||
| 211 | "editable": true  | 
        ||
| 212 | },  | 
        ||
| 213 | "outputs": [],  | 
        ||
| 214 | "source": [  | 
        ||
| 215 | "size = 1024\n",  | 
        ||
| 216 | "channels = (0,1)\n",  | 
        ||
| 217 | "\n",  | 
        ||
| 218 | "rp.AcqReset()\n",  | 
        ||
| 219 | "rp.AcqSetDecimationFactor(1)\n",  | 
        ||
| 220 | "threshold = -0.05\n",  | 
        ||
| 221 | "rp.AcqSetTriggerLevel(0, threshold)\n",  | 
        ||
| 222 | "rp.AcqSetPostTriggerDelay(size-80)\n",  | 
        ||
| 223 | "\n",  | 
        ||
| 224 | "neve = 0\n",  | 
        ||
| 225 | "while True:\n",  | 
        ||
| 226 | " rp.AcqStart()\n",  | 
        ||
| 227 | " rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_NE) \n",  | 
        ||
| 228 | " while (rp.AcqSetTriggerSrc(rp.TRIG_SRC_CHA_NE)): pass\n",  | 
        ||
| 229 | " buff = [rp.AcqGetLatestDataV(ch, size) for ch in channels];\n",  | 
        ||
| 230 | "\n",  | 
        ||
| 231 | " adcdata = np.absolute(np.amin(buff[0]))\n",  | 
        ||
| 232 | " signal = np.array(buff[0])\n",  | 
        ||
| 233 | " tdcdata = np.where(signal < threshold)[0] # get item\n",  | 
        ||
| 234 | "# print (adcdata, tdcdata)\n",  | 
        ||
| 235 | " hfill(hadc,adcdata)\n",  | 
        ||
| 236 | " \n",  | 
        ||
| 237 | " for a in tdcdata:\n",  | 
        ||
| 238 | " if a - tdcdata[0] > 5:\n",  | 
        ||
| 239 | " hfill(htdc,a-tdcdata[0])\n",  | 
        ||
| 240 | " break \n",  | 
        ||
| 241 | " neve+=1\n",  | 
        ||
| 242 | " for i in channels:\n",  | 
        ||
| 243 | " r[i].data_source.data['y'] = buff[i]\n",  | 
        ||
| 244 | "# push updates to the plot continuously using the handle (intererrupt the notebook kernel to stop)\n",  | 
        ||
| 245 | " if (neve%10 == 0):\n",  | 
        ||
| 246 | " push_notebook(handle=target)\n",  | 
        ||
| 247 | "# time.sleep(0.05)"  | 
        ||
| 248 | ]  | 
        ||
| 249 | }  | 
        ||
| 250 | ],  | 
        ||
| 251 |  "metadata": { | 
        ||
| 252 |   "kernelspec": { | 
        ||
| 253 | "display_name": "Python 3",  | 
        ||
| 254 | "language": "python",  | 
        ||
| 255 | "name": "python3"  | 
        ||
| 256 | },  | 
        ||
| 257 |   "language_info": { | 
        ||
| 258 |    "codemirror_mode": { | 
        ||
| 259 | "name": "ipython",  | 
        ||
| 260 | "version": 3  | 
        ||
| 261 | },  | 
        ||
| 262 | "file_extension": ".py",  | 
        ||
| 263 | "mimetype": "text/x-python",  | 
        ||
| 264 | "name": "python",  | 
        ||
| 265 | "nbconvert_exporter": "python",  | 
        ||
| 266 | "pygments_lexer": "ipython3",  | 
        ||
| 267 | "version": "3.5.2"  | 
        ||
| 268 | }  | 
        ||
| 269 | },  | 
        ||
| 270 | "nbformat": 4,  | 
        ||
| 271 | "nbformat_minor": 2  | 
        ||
| 272 | }  |