//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; }