This is an old revision of the document!
Detailed schematics of the board are available here: ACM Schematics. To view the Revision A schematics, click on any document on the page, and when the relevant schematic loads, replace “edg.uchicago.edu/~bogdan/DAMIC_ACM/doc/…” with “edg.uchicago.edu/~bogdan/DAMIC_ACM/doc/docA/…” in the browser address bar.
To power the ACM board, we use the VME8004X from CAEN, which provides all necessary voltages except for ±15V and -30V. These must be added manually by connecting the V1 and V2 outputs on the backside of the VME. The input voltages are defined in the table below:
| Fuse | Input Voltage |
|---|---|
| -V1 | -15V |
| +V1 | +15V |
| -V2 | -30V |
| +V2 | Spare fuse |
There exists an outdated user manual; please use it with care: User Guide
To start the ACM board, it is important to follow this order:
Turn on the VME crate.
Turn on the external supplies (HMP 2030).
To shut down the ACM board:
Turn off the HMP2030.
Turn off the VME crate.
The ACM is driven by a two-stage software system:
cdaq: Sets up the ACM as a server station.
ldaq: Manages communication between the server and your workstation.
For download and installation, see the chapter Software Installation and Test.
The ACM always creates a temporary version of the BCF and SEQ files. This ensures that if certain values are changed using a command, the original files remain intact.
Execute the following steps:
Start Python scripts:
Execute commands:
These steps are part of the start_module.py script.
Erase/Purge CCD
Image Acquisition
Trace Acquisition
To shut down CDAQ:
The CCDID is assigned by the board. For example, board number 105 has the ID ccd105 (For Rev A, it’s 1). The ID is determined by the board's IP, which is based on its Chip ID. The default IP for Rev B is 192.168.105.5.
To synchronize multiple ACMs, a synchronization board is used. Communication between ACMs and the synchronization board is managed by the cdaq software, but ACMs must be set up correctly:
If the external clock is disconnected, it will automatically switch to the internal clock (not recommended). It will keep searching for an external clock and switch back once reconnected.
Master/Slave Commands:
Note: Different cable lengths can cause issues.
Before installing the ACM software, auxiliary software must be installed. Files are located in /Home/ACM.
Before installing cdaq and ldaq, the firmware must be uploaded. Firmware is located at:
To upload firmware, use Quartus: Located at: /intelFPGA_pro/24.2/quartus/bin
Reload rules:
After shutting down the ACM board, firmware must be re-uploaded. A permanent installation using a .pof file is possible.
After this you can download the files from ccd-cdaq and ldaq. Make sure that you choose the correct version for Rev A/B (see folowing chapter). Go to the directory /path/to/ccd-cdaq and untar the file. For the installation follow the guide in the README file. To check if the installation was a sucess open the ccd-cdaq directory in terminal and send the following lines:
now a tmux window sould appear, in the bottom shel type:
Now you should see command moving around. If the test was sucessull, you have to shut down the run que, clients and CDAQ:
wait for this process to finish
shutdown the CDAQ
Now for the ldaq software follow also the README file.
Multiple modificatioins have to made for the Rev A to work properly, first make sure that you use the correct commits:
Once this happens it is necessary to manually link the path of the libACM (which should be in /source/libDAQ/) in the bashcr shell
Second, also the init file in the libDAQ directory has to be heavely modified, otherwise it will fail to initialize the clients modified initfile
Third, there are two files the acmpy.py and daemon.py file, that have to be exchange with this versions:
otherwise the communication between the cdaq server and the ACM itself is not proparly started and some commands will produce errors.
Fourth, you have to correct an error in the acmpy file in line 120 os.mkdirs(tmppath, exist_ok=True) needs to be corrected to os.makedirs(tmppath, exist_ok=True). Otherwise the clients will fail to initialize with DAQ type ACM.
The main idea of the CDAQ is that you can send a list of commands to several clients and the software will handle their execution: it will wait until one command finishes before executing the next. This is accomplished via a 'queue'. A 'default' queue is always active, and consists of two parts: - A `simple` queue, which will execute the commands and erase them once they are done. - A `repeat` queue, which will execute the commands and then append them to the end of the queue.
Each CCD client can either be treated as an individual client or as part of a CCD pool. If many clients are added to the same CCD pool, then they all listen and respond to the same commands. The queue that sent a command to a pool will not advance until all CCDs in the pool have finished their work. The general command structure is:
./sendrun.py –to 'CCDID' 'CMD'
Take note of the quotation marks around the CMD, they are indeed needed (we send a string). The CCDID is set by the board for example board number 105 has the ID ccd105. All daq functions can be found in the acmpy.py file. Some function are calling ops/aqs functions, they are second level function and there corresponding files (operation/..) can be found in a subdirectory, where the acmpy.py is located.
Find below the most commonly used commands:
| Command | Additional arguments | Explanation |
|---|---|---|
| ./daq.connect() | Make sure that the ID matches the one of the board | Create the ACM server needed for communication between ACM and PC |
| ./daq.init_ccd(“.bcf file”, “.seq file”) | The .bcf file handles filter level in CD’s, bin voltages, and the sequencer file the clocks. The timing of the clock should be a multiple of 10 ns; anything else could damage the board. | Sets up the bcf file and sequencer |
| ./daq.daemon.send_command(“CMD”) | See the list in this File | Sends a command string to the ACM |
| ./daq.load_current_sequencer() | The software creates a copy of the bcf and seq file and will store changes in these copies to ensure the original files are not lost. | Starts the initial seq file |
| ./daq.startup.ccd() | Initializes communication between CCD client, ACM, and PC | |
| ./daq.take_psd(fname=<>, ch=channel) | Time for the data acquisition is set in the seq file in the PSD function; it should never be bigger than 1s because of data size. Sets the level to 3 and can only take raw data from one channel (0,1,2,3). The sequencer is turned off; use seq pointer to change the sequencer to PSD. | Takes a PSD |
| ./daq.ops.erase_CCD(highP=<?.>, delay=<?>) | Take note of the dot after the ? sign in the highP value. | Makes an erase procedure |
| ./daq.ops.epurge_CCD(lowP=<?.>, delay=<?>) | Take note of the dot after the ? sign in the LowP value. | Makes a purge procedure |
| ./daq.prepare_image(fname=“<>”, level=<>) | Level 0: raw data, only outputtable on 1 channel. Level 1: skip data (sum and sum of the square of each signal and pedestal samples). Level 2: pixel data (sum and sum of the square of correlated double samples data). Level 3: mute, no data at all. Data can only be taken in level 1/2. | Prepares the image settings |
| ./daq.only_take_image(level=<>) | Data can only be taken in level 1/2. | Takes an image in the given level |
| ./daq.take_trace(fname=“<>”, ch=channel) | See PSD. | Same as in PSD |
| ./daq.start_infinite_flush() | Can take up to 10s to stop when killed. | Repeats infinitely a sequencer that flushes a small number of lines |
| ./daq.stop_infinite_flush() | Takes up to 10s to compile. | Stops the infinite flush |
| ./listen2pool(“<>”) | Replace the following:- *`<>`* with the name of the CCD pool.- *`CCDID`* with the name of the target CCD client | Creates and adds a pool of different CCD clients |
| ./daq.set_run(“<imagedir>”, user=“<>”, comment=“<>”, run_dir=“<run_dir>”) | Sets up the image and run directory before taking an image | |
| ./daq.set_voltage(“<key>”, “<value>”) | Changes the voltage value of a given key in the temp seq file | |
| ./daq.set_seq_var(“<key>”, “<value>”) | Changes a specific value in the temp seq file | |
| ./daq.seqrunner.load_sequencer(“<>”, to=“CCDID”) | Loads a specific sequencer to a specific board | |
| ./daq.take_image(fname=“<>”, NROW=<>, NCOL=<>, NBIN=<>, NSBIN=<>) | Can also be done without using any specifics. Uses configuration from prepare command. | Takes an image with given specifics |
| ./daq.set_img_dir(<>) | Sets the image directory | |
| ./daq.flush_ccd() | Flushes the CCD | |
| ./daq.ops.acquire.set_readout_mode(<>) | Sets level | |
| ./daq.ops.acquire.seqrunner.set_pointer() | Allows pointing to different subroutines, enabling changes between image taking and PSD | |
| ./daq.take_trace() | Can be done with or without a sequencer. | Converts a binary file into CSV, raw video file without PSD |
In the following table you can find the schematics of the ACM board (in this setup Revision A is used):
Fuse continuity test
Output Fuse test from top to bottom including the back side resistors (measuring between capacitors and resistors)
| Supply | Compliance setting | current before firmware loading | current after firmware loading |
|---|---|---|---|
| +5 V | 4.02 A | 110 mA | 0.18 mA |
| +3.3 V | 4.0 A | 970 mA | 2.4 A |
| -30 V | 100 mA | 2 mA | 0 |
| +12 V | Disconnected, generated from the ±15V line | ||
| -12 V | |||
| + 15 V | 600 mA | 334 mA | 360 |
| - 15 V | 600 mA | 155 mA | 160 |
Voltage connections to the VME back-plane inputs of the ACM.
| Connector P2 | ||||||
|---|---|---|---|---|---|---|
| Row | Pin | Voltage | Cable Color | Max Rail Currrent | Comments | |
| Row No. | No. Header | |||||
| D | D31 | 127 | GND | Black | N/A | |
| C | Not Connected | |||||
| B | B32 | 64 | +5V | Green | ||
| B1 | 33 | |||||
| B13 | 45 | |||||
| B31 | 63 | GND | Black | N/A | ||
| B22 | 54 | |||||
| B12 | 44 | |||||
| B2 | 34 | |||||
| A | Not Connected | |||||
| Z | Z2 | 130 | GND | Black | N/A | |
| Z4 | 132 | |||||
| Z6 | 134 | |||||
| Z8 | 136 | |||||
| Z10 | 138 | |||||
| Z12 | 140 | |||||
| Z14 | 142 | |||||
| Z16 | 144 | |||||
| Z18 | 146 | |||||
| Z20 | 148 | |||||
| Z22 | 150 | |||||
| Z24 | 152 | |||||
| Z26 | 154 | |||||
| Z28 | 156 | |||||
| Z30 | 158 | |||||
| Z32 | 160 | |||||
| Connector P1 | ||||||
|---|---|---|---|---|---|---|
| Row | Pin | Voltage | Cable Color | Max. Rail Current | Comment | |
| Row No. | No. Header | |||||
| D | D30 | 126 | +3.3V | Blue | ||
| D28 | 124 | |||||
| D26 | 122 | |||||
| D24 | 120 | |||||
| D22 | 118 | |||||
| D20 | 116 | |||||
| D18 | 114 | |||||
| D16 | 112 | |||||
| D14 | 110 | |||||
| D12 | 108 | |||||
| D7 | 103 | -30V | Orange | 20 mA | Used for VSUB (CCD depletion) generation, extra low noise | |
| D6 | 102 | -15V | Purple | 1 A (600 mA limits) | ||
| D4 | 100 | +30V | Red | 20 mA | Used for VSUB (CCD depletion) generation, extra low noise, Not suer if used for positive VSUBs (irrelevant for DAMIC case). Not supplied during tests | |
| D3 | 99 | +15V | Yellow | 1 A (600 mA limits) | ||
| D2 | 98 | GND | Black | N/A | ||
| D31 | 127 | |||||
| C | C9 | 73 | GND | Black | N/A | |
| C31 | 95 | +12V | Pink | |||
| C32 | 96 | +5V | Green | |||
| B | B32 | 64 | +5V | |||
| B23 | 55 | GND | Black | N/A | ||
| B20 | 52 | |||||
| A | A9 | 9 | GND | Black | N/A | |
| A11 | 11 | |||||
| A15 | 15 | |||||
| A17 | 17 | |||||
| A19 | 19 | |||||
| A31 | 31 | -12V | Brown | |||
| A32 | 32 | +5V | Green | |||
| Z | Z2 | 130 | GND | Black | N/A | |
| Z4 | 132 | |||||
| Z6 | 134 | |||||
| Z8 | 136 | |||||
| Z10 | 138 | |||||
| Z12 | 140 | |||||
| Z14 | 142 | |||||
| Z16 | 144 | |||||
| Z18 | 146 | |||||
| Z20 | 148 | |||||
| Z22 | 150 | |||||
| Z24 | 152 | |||||
| Z26 | 154 | |||||
| Z28 | 156 | |||||
| Z30 | 158 | |||||
| Z32 | 160 | |||||