I finally managed to do something :
/*
* CMU200 Frequency List Table Auto Fill
* 02/02/2017
*/
#include <visa.h>
#include <stdio.h>
#include <string.h>
#define ARRAYSIZE 100 // Size of read buffer
// --- send command with trace
void sendCommand(ViSession vi, char * cb)
{
ViStatus rc;
printf("%s\r\n", cb);
if ((rc=viWrite(vi, (unsigned char*)cb, strlen(cb), VI_NULL)) != VI_SUCCESS)
{
printf ("Erreur viWrite (command %s) %08X\n", cb, rc);
return;
}
}
// --- main
void main(void) {
ViSession defaultRM, vi1;
ViStatus rc = VI_ERROR_LIBRARY_NFOUND;
ViUInt32 retCnt;
unsigned char ReadBuffer[ARRAYSIZE + 1]; // Read data buffer
char CommandBuffer[ARRAYSIZE + 1]; // Command buffer
/* Open session to GPIB device */
if ((rc=viOpenDefaultRM (&defaultRM)) != VI_SUCCESS)
{
printf ("Erreur viOpenDefaultRM %08X\n", rc);
return;
}
// CMU200 Primary address=6, secondary=1
if ((rc=viOpen (defaultRM, "GPIB0::6::1::INSTR", VI_NULL,VI_NULL, &vi1)) != VI_SUCCESS)
{
printf ("Erreur viOpen 1 %08X\n", rc);
return;
}
// Identification
if ((rc=viWrite(vi1, (unsigned char*)"*IDN?", 5, VI_NULL)) != VI_SUCCESS)
{
printf ("Erreur viWrite (command IDN) %08X\n", rc);
return;
}
rc=viRead(vi1, ReadBuffer, ARRAYSIZE, &retCnt);
if (rc != VI_SUCCESS && rc != VI_SUCCESS_TERM_CHAR && rc != VI_SUCCESS_MAX_CNT)
{
printf ("Erreur viRead (IDN) %08X\n", rc);
return;
}
ReadBuffer[retCnt] = '\0';
printf("IDN=%s\n", ReadBuffer);
// Frequency List Table
float startFrequency = 10; // MHz
float stopFrequency = 200; // MHz
int nbSteps = 200;
float stepFrequency = (stopFrequency - startFrequency) / (nbSteps - 1);
float frequency = startFrequency;
for (int step = 1 ; step <= nbSteps; step++) {
sprintf(CommandBuffer, "SOURce:RFGenerator:GLIStmode:LIST %d, 1, %f MHz, -10 dbm", step, frequency);
sendCommand(vi1, CommandBuffer);
frequency += stepFrequency;
}
// Go!
sendCommand(vi1, "SOURce:RFGenerator:GLIStmode:DWELltime 100 ms");
sendCommand(vi1, "SOURce:RFGenerator:GLIStmode:STARt 1");
sprintf(CommandBuffer, "SOURce:RFGenerator:GLIStmode:STEPs %d", nbSteps); sendCommand(vi1, CommandBuffer);
sprintf(CommandBuffer, "SOURce:RFGenerator:GLIStmode:SLENgth %d", nbSteps); sendCommand(vi1, CommandBuffer);
}
Direct connection RF3 out --> RF1 :
(http://sorenkir.free.fr/CMU200/flat.jpg)
Frequency response of a DC-10MHz amplifier (well beyond its bandwith!):
(http://sorenkir.free.fr/CMU200/10MHz_amp.jpg)
This is working well with 1MHz RBW because spectrum analyzer sweep time must be below 100ms.
With 200 steps @ 100ms, generator sweep time is 20s, which is acceptable.
Michel.