318 lines
5.7 KiB
C++
318 lines
5.7 KiB
C++
//Cosmic Pi V2 Simulator for Arduino DUE
|
|
//functions provided:
|
|
//outputs
|
|
//Analogue Out 0 -> Simulated PSU Voltage FB (open loop)
|
|
//Analogue Out 1 -> Simulated Events (SlowOutA/SlowOutB)
|
|
//GPS PPS Output -> 1 Hz
|
|
//Trigout -> 5Hz, randomomised
|
|
//Strig A out -> 10Hz, sync with trigout
|
|
//Strig B out -> 10Hz, sync with trigout
|
|
//inputs - to check detection is working
|
|
//Flag 0 - digital pin 3
|
|
//Flag 1 - digital pin 4
|
|
//Flag 2 - digital pin 5
|
|
|
|
//Serial output at 115200
|
|
|
|
//STM32 flag output detection
|
|
bool flag0 = false;
|
|
bool flag1 = false;
|
|
bool flag2 = false;
|
|
|
|
|
|
//variables
|
|
int evt0;
|
|
int evt1;
|
|
int evt2;
|
|
int evt3;
|
|
int evt4;
|
|
int filler0;
|
|
int filler1;
|
|
int filler2;
|
|
int filler3;
|
|
int filler4;
|
|
|
|
//Now 5 more events for ChA and 5 more for ChB
|
|
int evt0A;
|
|
int evt1A;
|
|
int evt2A;
|
|
int evt3A;
|
|
int evt4A;
|
|
int filler0A;
|
|
int filler1A;
|
|
int filler2A;
|
|
int filler3A;
|
|
int filler4A;
|
|
|
|
int evt0B;
|
|
int evt1B;
|
|
int evt2B;
|
|
int evt3B;
|
|
int evt4B;
|
|
int filler0B;
|
|
int filler1B;
|
|
int filler2B;
|
|
int filler3B;
|
|
int filler4B;
|
|
|
|
|
|
|
|
//pinouts
|
|
int GPSPPS=13;
|
|
int TRIG=12;
|
|
int STRIGA=11;
|
|
int STRIGB=10;
|
|
|
|
int eventpeak = 700;
|
|
int AnalogQPoint = 600;
|
|
int duration = 0;
|
|
|
|
//PSU wobble criteria
|
|
int psuupdown=0;
|
|
int psuupdownnext=0;
|
|
int wobble = 50;
|
|
int psusetpoint = 255;
|
|
|
|
//timer
|
|
int start_time = 0;
|
|
int stop_time = 0;
|
|
|
|
void setup() {
|
|
// put your setup code here, to run once:
|
|
analogWrite(DAC0, 255); //set the DC value for the PSU
|
|
|
|
analogWrite(DAC1, AnalogQPoint); //set the DC value for the analogue detector signal
|
|
pinMode(LED_BUILTIN, OUTPUT); //lets use pin 13 as the PPS
|
|
|
|
|
|
//init outputs
|
|
digitalWrite(GPSPPS,0);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
|
|
//attach interrupts
|
|
attachInterrupt(2, Flag0ISR, RISING);
|
|
attachInterrupt(3, Flag1ISR, RISING);
|
|
attachInterrupt(4, Flag2ISR, RISING);
|
|
|
|
|
|
Serial.begin(115200);
|
|
}
|
|
|
|
void loop() {
|
|
// put your main code here, to run repeatedly:
|
|
start_time = micros();
|
|
|
|
//each loop we'll have 5 events. Here are the times of each of them
|
|
evt0=random(0,80);
|
|
evt1=random(0,80);
|
|
evt2=random(0,80);
|
|
evt3=random(0,80);
|
|
evt4=random(0,80);
|
|
filler0= 80-evt0;
|
|
filler1= 80-evt1;
|
|
filler2= 80-evt2;
|
|
filler3= 80-evt3;
|
|
filler4= 80-evt4;
|
|
|
|
//Now 5 more events for ChA and 5 more for ChB
|
|
evt0A=random(0,40);
|
|
evt1A=random(0,40);
|
|
evt2A=random(0,40);
|
|
evt3A=random(0,40);
|
|
evt4A=random(0,40);
|
|
filler0A= 40-evt0A;
|
|
filler1A= 40-evt1A;
|
|
filler2A= 40-evt2A;
|
|
filler3A= 40-evt3A;
|
|
filler4A= 40-evt4A;
|
|
|
|
evt0B=random(0,40);
|
|
evt1B=random(0,40);
|
|
evt2B=random(0,40);
|
|
evt3B=random(0,40);
|
|
evt4B=random(0,40);
|
|
filler0B= 40-evt0B;
|
|
filler1B= 40-evt1B;
|
|
filler2B= 40-evt2B;
|
|
filler3B= 40-evt3B;
|
|
filler4B= 40-evt4B;
|
|
|
|
//set 1
|
|
delay(10);
|
|
delay(evt0);
|
|
analogWrite(DAC1, eventpeak);
|
|
//delay(5);
|
|
digitalWrite(TRIG,1);
|
|
digitalWrite(STRIGA,1);
|
|
digitalWrite(STRIGB,1);
|
|
delay(5);
|
|
analogWrite(DAC1, (eventpeak-50));
|
|
delay(5);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
analogWrite(DAC1, AnalogQPoint);
|
|
delay(filler0);
|
|
delay(evt0A);
|
|
digitalWrite(STRIGA,1);
|
|
delay(10);
|
|
digitalWrite(STRIGA,0);
|
|
delay(filler0A);
|
|
delay(evt0B);
|
|
digitalWrite(STRIGB,1);
|
|
delay(10);
|
|
digitalWrite(STRIGB,0);
|
|
delay(filler0B);
|
|
|
|
//set 2
|
|
delay(evt1);
|
|
analogWrite(DAC1, eventpeak);
|
|
//delay(5);
|
|
digitalWrite(TRIG,1);
|
|
digitalWrite(STRIGA,1);
|
|
digitalWrite(STRIGB,1);
|
|
delay(5);
|
|
analogWrite(DAC1, (eventpeak-50));
|
|
delay(5);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
analogWrite(DAC1, AnalogQPoint);
|
|
delay(filler1);
|
|
delay(evt1A);
|
|
digitalWrite(STRIGA,1);
|
|
delay(10);
|
|
digitalWrite(STRIGA,0);
|
|
delay(filler1A);
|
|
delay(evt1B);
|
|
digitalWrite(STRIGB,1);
|
|
delay(10);
|
|
digitalWrite(STRIGB,0);
|
|
delay(filler1B);
|
|
|
|
//set 3
|
|
delay(evt2);
|
|
analogWrite(DAC1, eventpeak);
|
|
//delay(5);
|
|
digitalWrite(TRIG,1);
|
|
digitalWrite(STRIGA,1);
|
|
digitalWrite(STRIGB,1);
|
|
delay(5);
|
|
analogWrite(DAC1, (eventpeak-50));
|
|
delay(5);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
analogWrite(DAC1, AnalogQPoint);
|
|
delay(filler2);
|
|
delay(evt2A);
|
|
digitalWrite(STRIGA,1);
|
|
delay(10);
|
|
digitalWrite(STRIGA,0);
|
|
delay(filler2A);
|
|
delay(evt2B);
|
|
digitalWrite(STRIGB,1);
|
|
delay(10);
|
|
digitalWrite(STRIGB,0);
|
|
delay(filler2B);
|
|
|
|
//set 4
|
|
delay(evt3);
|
|
analogWrite(DAC1, eventpeak);
|
|
//delay(5);
|
|
digitalWrite(TRIG,1);
|
|
digitalWrite(STRIGA,1);
|
|
digitalWrite(STRIGB,1);
|
|
delay(5);
|
|
analogWrite(DAC1, (eventpeak-50));
|
|
delay(5);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
analogWrite(DAC1, AnalogQPoint);
|
|
delay(filler3);
|
|
delay(evt3A);
|
|
digitalWrite(STRIGA,1);
|
|
delay(10);
|
|
digitalWrite(STRIGA,0);
|
|
delay(filler3A);
|
|
delay(evt3B);
|
|
digitalWrite(STRIGB,1);
|
|
delay(10);
|
|
digitalWrite(STRIGB,0);
|
|
delay(filler3B);
|
|
|
|
//set 5
|
|
delay(evt4);
|
|
analogWrite(DAC1, eventpeak);
|
|
//delay(5);
|
|
digitalWrite(TRIG,1);
|
|
digitalWrite(STRIGA,1);
|
|
digitalWrite(STRIGB,1);
|
|
delay(5);
|
|
analogWrite(DAC1, (eventpeak-50));
|
|
delay(5);
|
|
digitalWrite(TRIG,0);
|
|
digitalWrite(STRIGA,0);
|
|
digitalWrite(STRIGB,0);
|
|
analogWrite(DAC1, AnalogQPoint);
|
|
delay(filler4);
|
|
delay(evt4A);
|
|
digitalWrite(STRIGA,1);
|
|
delay(10);
|
|
digitalWrite(STRIGA,0);
|
|
delay(filler4A);
|
|
delay(evt4B);
|
|
digitalWrite(STRIGB,1);
|
|
delay(10);
|
|
digitalWrite(STRIGB,0);
|
|
delay(filler4B);
|
|
|
|
//pulse the pps
|
|
digitalWrite(GPSPPS,1);
|
|
delay(40);
|
|
digitalWrite(GPSPPS,0);
|
|
|
|
//let's wobble the PSU output every second;
|
|
if (psuupdown==0)
|
|
{
|
|
psusetpoint = psusetpoint + wobble;
|
|
psuupdownnext=1;
|
|
}
|
|
if (psuupdown==1)
|
|
{
|
|
psusetpoint = psusetpoint - wobble;
|
|
psuupdownnext=0;
|
|
}
|
|
psuupdown = psuupdownnext;
|
|
analogWrite(DAC0, psusetpoint);
|
|
|
|
Serial.print("The loop took ");
|
|
Serial.println(duration);
|
|
if (flag0==true) Serial.println("Saw Flag 0");
|
|
if (flag1==true) Serial.println("Saw Flag 1");
|
|
if (flag2==true) Serial.println("Saw Flag 2");
|
|
flag0=false;
|
|
flag1=false;
|
|
flag2=false;
|
|
|
|
|
|
stop_time = micros();
|
|
duration = stop_time - start_time;
|
|
}
|
|
|
|
void Flag0ISR()
|
|
{
|
|
flag0=true;
|
|
}
|
|
|
|
void Flag1ISR()
|
|
{
|
|
flag1=true;
|
|
}
|
|
void Flag2ISR()
|
|
{
|
|
flag2=true;
|
|
}
|