Balluff - BVS CA-GT Technical Documentation
|
Getting images from several cameras exactly at the same time is a major task in
With Balluff/MATRIX VISION cameras you can solve this task as follows:
Timers can be used to generate pulses at regular intervals. These pulses can be connected to a digital output. The digital output can be connected again to the digital input of one or more cameras to use it as a trigger.
For the master camera, there are 2 possibilities how it is triggered:
You will need two timers and you have to set a trigger.
Two timers are used for the "start timer". Timer1 defines the interval between two triggers. Timer2 generates the trigger pulse at the end of Timer1.
The following sample shows a trigger
#include <mvIMPACT_CPP/mvIMPACT_acquire.h> #include <mvIMPACT_CPP/mvIMPACT_acquire_GenICam.h> ... // Master: Set timers to trig image: Start after queue is filled GenICam::CounterAndTimerControl catcMaster(pDev); catcMaster.timerSelector.writeS( "Timer1" ); catcMaster.timerDelay.write( 0. ); catcMaster.timerDuration.write( 1000000. ); catcMaster.timerTriggerSource.writeS( "Timer1End" ); catcMaster.timerSelector.writeS( "Timer2" ); catcMaster.timerDelay.write( 0. ); catcMaster.timerDuration.write( 10000. ); catcMaster.timerTriggerSource.writeS( "Timer1End" );
The timers are defined, now you have to do following steps:
In this step, the signal has to be connected to the digital output, e.g. "Line0":
// Set Digital I/O GenICam::DigitalIOControl io(pDev); io.lineSelector.writeS( "Line0" ); io.lineSource.writeS( "Timer2Active" );
This signal has to be connected with the digital inputs of the slave cameras as shown in Figure 1 and 2.
"If you want to use Master - Slave":
// Set Trigger of Master camera GenICam::AcquisitionControl ac(pDev); ac.triggerSelector.writeS( "FrameStart" ); ac.triggerMode.writeS( "On" ); ac.triggerSource.writeS( "Timer1Start" ); // or ac.triggerSource.writeS( "Timer1End" );
// Set Trigger of Slave camera GenICam::AcquisitionControl ac(pDev); ac.triggerSelector.writeS( "FrameStart" ); ac.triggerMode.writeS( "On" ); ac.triggerSource.writeS( "Line4" ); ac.triggerActivation.writeS( "RisingEdge" );
"If you want to use Slave - Slave":
// Set Trigger of Master and Slave camera GenICam::AcquisitionControl ac(pDev); ac.triggerSelector.writeS( "FrameStart" ); ac.triggerMode.writeS( "On" ); ac.triggerSource.writeS( "Line4" ); ac.triggerActivation.writeS( "RisingEdge" );
Now, the two timers will work like the following figure illustrates, which means
By the way, this is a simple "pulse width modulation (PWM)" example.
The following figures show, how you can set the timers and trigger using the GUI tool ImpactControlCenter
The mvCyclicSignal
makes it possible synchronizing image captures of all cameras without extra cabling and without steady image triggering from an application. For this the cameras in the system need to have synchronized clocks using the IEEE1588 feature.
ExposureStart
. This latency and jitter are sensor and operating mode specific.The mvCyclicSignal
can be found in "Setting → Base → Camera → GenICam → mvCyclicSignalControl".
mvCyclicSignal
provides two further properties:
mvCyclicSignalPeriod
mvCyclicSignalDelay
In the TriggerSelector
section of the AcquisitionControl
it is necessary to activate the mvCyclicSignal:
TriggerSource
. TriggerMode
to On. Setting the mvCyclicSignalPeriod to 10 minutes and having 2 cameras,
The acquisitions would be as follows:
Camera A: 12:10, 12:20, 12:30, 12:40, 12:50, 13:00, etc. Camera B: 12:40, 12:50, 13:00, etc.
The first image of Camera B would be synchronized with Camera A. As long as the cameras clocks are synced by IEEE1588, they will be synchronized with very good precision.
With the same mvCyclicSignalPeriod
as in example 1, the following mvCyclicSignalDelay
is added in each case:
The acquisitions would be as follows:
Camera A: 12:12, 12:22, 12:32, 12:42, 12:52, 13:02, etc. Camera B: 12:36, 12:46, 12:56, 13:06, etc.
Cameras A and B are still synchronized, but with a phase delay between them of 4 minutes (6 minutes – 2 minutes).