PicoScope 7 Software
Available on Windows, Mac and Linux
Code: Select all
void PicoSignal::armSignalGenerator()
{
PICO_STATUS status;
pkpk_m = 1200000; //1.2V pkpk
long offset = 0;
deltaphase_m = calculateDeltaFromFrequency(ddsfrequency_m);
short triggerVoltage = mv_to_adc(100, PS5000A_5V);
status = ps5000aSetSigGenArbitrary(unitOpened_m->handle, //unit handle
offset, //offset voltage
pkpk_m, //PkToPk in microvolts. Max = 4V +2v to -2V
deltaphase_m, //start delta
deltaphase_m, //stop delta
0, //deltaPhaseIncrement
0, //dwellCount
arbitrarywaveform_m, //waveForm
waveformsize_m, //waveFormSize
(PS5000A_SWEEP_TYPE)0, //sweepType
(PS5000A_EXTRA_OPERATIONS)0, //operation
PS5000A_SINGLE, //indexMode
1, //shots
0, //sweeps
(PS5000A_SIGGEN_TRIG_TYPE) PS5000A_SIGGEN_RISING, //triggerType
(PS5000A_SIGGEN_TRIG_SOURCE) PS5000A_SIGGEN_EXT_IN, //triggerSource
triggerVoltage);
}
Code: Select all
unsigned long PicoSignal::calculateDeltaFromFrequency(double frequency)
{
unsigned long returnValue = (((frequency * waveformsize_m) / unitOpened_m->AWGFileSize) * AWG_PHASE_ACCUMULATOR * (1/AWG_DAC_FREQUENCY));
return returnValue;
}
Code: Select all
void PicoSignal::generatingFunction(double a, double k, double b, double nu, double q, double m)
{
double logisticresult = 0;
QVector samples;
QString directory = QDir::currentPath().append("/SavedWaveforms/");
if (!QDir(directory).exists())
QDir().mkdir(directory);
QFile file(directory.append("lastusedlogisticfunction.csv"));
if (file.open(QFile::WriteOnly|QFile::Truncate))
{
QTextStream stream(&file);
for (double t = 0; tAWGFileSize; t++){
logisticresult = (a + ((k-a) / pow((1 + (q*exp(-b*(t - m)))), (1 / nu))));
stream /*<< t << "," */<< logisticresult << "\n";
samples.append(QPointF((t/unitOpened_m->AWGFileSize)*(1000/ddsfrequency_m), logisticresult*normalizingVoltageValue));
}
file.close();
emit functionGenerated(samples);
}
}
Code: Select all
for (int i = 0; i<1024; i++)
baselineArbitrarywaveform_m.append((unsigned int)0);
Code: Select all
void PicoSignal::loadZeroFunction()
{
waveformsize_m = (long)baselineArbitrarywaveform_m.size();
arbitrarywaveform_m = &baselineArbitrarywaveform_m[0];
PICO_STATUS status;
pkpk_m = 0;
long offset = 0;
unsigned long newddsf = 0;
deltaphase_m = calculateDeltaFromFrequency(newddsf);
status = ps5000aSetSigGenArbitrary(unitOpened_m->handle, //unit handle
offset, //offset voltage
pkpk_m, //PkToPk in microvolts. Max = 4V +2v to -2V
deltaphase_m, //start delta
deltaphase_m, //stop delta
0, //deltaPhaseIncrement
0, //dwellCount
arbitrarywaveform_m, //waveForm
waveformsize_m, //waveFormSize
(PS5000A_SWEEP_TYPE)0, //sweepType
(PS5000A_EXTRA_OPERATIONS)0, //operation
PS5000A_SINGLE, //indexMode
1, //shots
0, //sweeps
(PS5000A_SIGGEN_TRIG_TYPE) 0, //triggerType
(PS5000A_SIGGEN_TRIG_SOURCE) PS5000A_SIGGEN_SOFT_TRIG, //triggerSource
0);
unitStatus_m = ps5000aSigGenSoftwareControl(unitOpened_m->handle,0);
}
Code: Select all
#include "picosignal.h"
#include
#include
#include
#include
#include
static const unsigned short inputRanges [PS5000A_MAX_RANGES] = {10,20,50,100,200,500,1000,2000,5000,10000,20000};
PicoSignal::PicoSignal(UNIT *&unit, QObject *parent) : unitOpened_m(unit), QObject(parent)
{
connect(this, SIGNAL(functionGenerated(QVector )), this, SLOT(loadSignal(QVector )));
for (int i = 0; i<1024; i++)
baselineArbitrarywaveform_m.append((unsigned int)0);
}
PicoSignal::~PicoSignal()
{
}
void PicoSignal::loadSignal(QVector signalVector)
{
waveformsize_m = (long)signalVector.size();
waveformshortvector = convertWaveFormToSamples(signalVector);
arbitrarywaveform_m = &waveformshortvector[0];
}
void PicoSignal::generateDefaultSignal()
{
generatingFunction(-1, 1, .0003, 1, 1, 25000);
}
void PicoSignal::setFrequency(double frequency)
{
ddsfrequency_m = frequency*100;
emit timeScaledChanged(frequency);
}
void PicoSignal::loadZeroFunction()
{
waveformsize_m = (long)baselineArbitrarywaveform_m.size();
arbitrarywaveform_m = &baselineArbitrarywaveform_m[0];
PICO_STATUS status;
pkpk_m = 0;
long offset = 0;
unsigned long newddsf = 0;
deltaphase_m = calculateDeltaFromFrequency(newddsf);
status = ps5000aSetSigGenArbitrary(unitOpened_m->handle, //unit handle
offset, //offset voltage
pkpk_m, //PkToPk in microvolts. Max = 4V +2v to -2V
deltaphase_m, //start delta
deltaphase_m, //stop delta
0, //deltaPhaseIncrement
0, //dwellCount
arbitrarywaveform_m, //waveForm
waveformsize_m, //waveFormSize
(PS5000A_SWEEP_TYPE)0, //sweepType
(PS5000A_EXTRA_OPERATIONS)0, //operation
PS5000A_SINGLE, //indexMode
0, //shots
0, //sweeps
(PS5000A_SIGGEN_TRIG_TYPE) 0, //triggerType
(PS5000A_SIGGEN_TRIG_SOURCE) PS5000A_SIGGEN_SOFT_TRIG, //triggerSource
0);
unitStatus_m = ps5000aSigGenSoftwareControl(unitOpened_m->handle,0);
}
void PicoSignal::armSignalGenerator()
{
PICO_STATUS status;
pkpk_m = 1200000; //1.2V pkpk, start signal at -600mV due to offstate of ad8336
long offset = 0;
//ddsfrequency_m = 100;
deltaphase_m = calculateDeltaFromFrequency(ddsfrequency_m);
short triggerVoltage = mv_to_adc(100, PS5000A_5V);
//short triggerVoltage = mv_to_adc(20, unitOpened_m->channelSettings[PS5000A_CHANNEL_A].range);
status = ps5000aSetSigGenArbitrary(unitOpened_m->handle, //unit handle
offset, //offset voltage
pkpk_m, //PkToPk in microvolts. Max = 4V +2v to -2V
deltaphase_m, //start delta
deltaphase_m, //stop delta
0, //deltaPhaseIncrement
0, //dwellCount
arbitrarywaveform_m, //waveForm
waveformsize_m, //waveFormSize
(PS5000A_SWEEP_TYPE)0, //sweepType
(PS5000A_EXTRA_OPERATIONS)0, //operation
PS5000A_SINGLE, //indexMode
15, //shots
0, //sweeps
(PS5000A_SIGGEN_TRIG_TYPE) PS5000A_SIGGEN_RISING, //triggerType
(PS5000A_SIGGEN_TRIG_SOURCE) PS5000A_SIGGEN_EXT_IN, //triggerSource
triggerVoltage);
}
short PicoSignal::mv_to_adc(short mv, short rangeIndex) //maybe shorts?
{
// return (mv * unitOpened_m->maxADCValue) / (int)inputRanges[rangeIndex];
return ((int)mv * (int)unitOpened_m->maxADCValue) / (int)inputRanges[rangeIndex];
}
QVector PicoSignal::convertWaveFormToSamples(QVectorrawwaveform)
{
QVector tempvector;
for (int i = 0; i < rawwaveform.size(); i++)
{
tempvector.append((short)round((rawwaveform.at(i).y()/normalizingVoltageValue)*maxSampleConversionValue));
}
return tempvector;
}
unsigned long PicoSignal::calculateDeltaFromFrequency(double frequency)
{
unsigned long returnValue = (((frequency * waveformsize_m) / unitOpened_m->AWGFileSize) * AWG_PHASE_ACCUMULATOR * (1/AWG_DAC_FREQUENCY));
return returnValue;
}
void PicoSignal::triggerSignalGenerator()
{
if (systemArmed)
{
unitStatus_m = ps5000aSigGenSoftwareControl(unitOpened_m->handle,0);
systemArmed = false;
// emit finished();
}
}
void PicoSignal::generatingFunction(double a, double k, double b, double nu, double q, double m)
{
double logisticresult = 0;
QVector samples;
QString directory = QDir::currentPath().append("/SavedWaveforms/");
if (!QDir(directory).exists())
QDir().mkdir(directory);
QFile file(directory.append("lastusedlogisticfunction.csv"));
if (file.open(QFile::WriteOnly|QFile::Truncate))
{
QTextStream stream(&file);
for (double t = 0; tAWGFileSize; t++){
logisticresult = (a + ((k-a) / pow((1 + (q*exp(-b*(t - m)))), (1 / nu))));
stream /*<< t << "," */<< logisticresult << "\n";
samples.append(QPointF((t/unitOpened_m->AWGFileSize)*(1000/ddsfrequency_m), logisticresult*normalizingVoltageValue));
}
file.close();
emit functionGenerated(samples);
}
}
did you use the software trigger to actually force an output ?jaray wrote:No luck, here is what I have. Turns out I was already adjusting the ddsoutput in between captures. Forgot about that.
Code: Select all
for (int i = 0; i<1024; i++) baselineArbitrarywaveform_m.append((unsigned int)0);
Code: Select all
void PicoSignal::loadZeroFunction() { waveformsize_m = (long)baselineArbitrarywaveform_m.size(); arbitrarywaveform_m = &baselineArbitrarywaveform_m[0]; PICO_STATUS status; pkpk_m = 0; long offset = 0; unsigned long newddsf = 0; deltaphase_m = calculateDeltaFromFrequency(newddsf); status = ps5000aSetSigGenArbitrary(unitOpened_m->handle, //unit handle offset, //offset voltage pkpk_m, //PkToPk in microvolts. Max = 4V +2v to -2V deltaphase_m, //start delta deltaphase_m, //stop delta 0, //deltaPhaseIncrement 0, //dwellCount arbitrarywaveform_m, //waveForm waveformsize_m, //waveFormSize (PS5000A_SWEEP_TYPE)0, //sweepType (PS5000A_EXTRA_OPERATIONS)0, //operation PS5000A_SINGLE, //indexMode 1, //shots 0, //sweeps (PS5000A_SIGGEN_TRIG_TYPE) 0, //triggerType (PS5000A_SIGGEN_TRIG_SOURCE) PS5000A_SIGGEN_SOFT_TRIG, //triggerSource 0); unitStatus_m = ps5000aSigGenSoftwareControl(unitOpened_m->handle,0); }