// Messung eines Gamma-Spektrums, Lehner 2021 // Teil des SiPM-Projektes, siehe martinlehner.ch // Kommentare jeweils unter der entsprechenden Zeile // // Parameter ------------------------------------------------- int kama=800; // Hoechster benutzter Slot (fuer normale Spektren reicht 800) // Moeglich bis 1024 int imo1=200; // Zwischenresultat nach imo1 Pulsen, speichern nach imo2 Pulsen // (fuer Quellen imo1=200, imo2=2000) int imo2=2000; // // Spektrum aus Kanal 1 auf Analogeingang A0 des Arduino ----- int Pin=4; // Digitalpuls zur Ausloesung einer Analog-Messung int akanal=0; // Analog-Pin fuer Pulshoehen-Verhaeltnis (Dig. 4) // // Spektrum aus Kanal 2 auf Analogeingang A1 des Arduino ----- int akan2=1; // Analog-Pin fuer Pulshoehen-Verhaeltnis (Dig. 2) int Pin2 = 2; // Puls auf Dig. Pin 4 , Spektrum auf Analog A0 // Puls auf Dig. Pin 2 , Spektrum auf Analog A1 // Einstellung Prescaler: siehe setup int iverhm=100; // Anzahl Testmessungen fuer RC-Abnahme (normal 100) float verh1=1.15; float verh2=1.45; // float bverh1=1.15; // float bverh2=1.45; // Bereich wird unten ev. durch Automatik ueberschrieben // ----------------------------------------------------------- // Deklaration verschiedener Variablen int messv[8]; byte spek[800]; String meld; int messa; int messb; int messc; int messk; unsigned long zeit1; unsigned long zeit2; unsigned long zeit3; unsigned long iges; unsigned long igesa; int ibma; int nbma; int irest; int ires2; int akoi; int ipri; float verh; int iverh; float verhs; int iana=0; // Moegliche Prescaler-Einstellungen ------------------------- // ADCSRA |= bit (ADPS0); // 2 // ADCSRA |= bit (ADPS1); // 4 // ADCSRA |= bit (ADPS0) | bit (ADPS1); // 8 // ADCSRA |= bit (ADPS2); // 16 // ADCSRA |= bit (ADPS0) | bit (ADPS2); // 32 // ADCSRA |= bit (ADPS1) | bit (ADPS2); // 64 // Default ist prescaler 128 // ----------------------------------------------------------- void setup(){ ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2)); // clear prescaler bits // ADCSRA |= bit (ADPS2); // 16 ca. 12 micro-s pro Messung // ADCSRA |= bit (ADPS0) | bit (ADPS2); // 32 ca. 30 micro-s pro Messung ADCSRA |= bit (ADPS1) | bit (ADPS2); // 64 ca. 56 micro-s pro Analog-Messung // // Verbindung zum Raspberry vorbereiten Serial.begin(38400); // Alle Slots auf Null for (int i = 0; i < kama; i++) { spek[i]=0 ;} iges=0; igesa=0; akoi=0; char data; // delay(100); for (int i = 0; i < 4; i++) { delay(100); Serial.println(" Bereit ");} // //Befehl von Python auf Raspberry empfangen ipri=0; while (ipri==0) { if (Serial.available() > 0) // Waiting for request {meld = Serial.readString(); delay(100); ipri=1; } } delay(200); Serial.println(" Steuercode auf Arduino empfangen: "+meld); iana=0; messk=meld.length(); int ikwe=0; if (meld.charAt(0)=='2') {iana=1;} if (meld.charAt(0)=='4') {iana=1;} if (meld.charAt(0)=='3') {ikwe=1;} if (meld.charAt(0)=='4') {ikwe=1;} // Serial.println(" Neues Spektrum Arduino"); delay(200); Serial.println(" Schreibparameter iana nach python "+(String)iana+" Kanalwechsel "+(String)ikwe); delay(200); if(ikwe==1) {Pin=Pin2; akanal=akan2;} Serial.println(" Spektrum Null gesetzt "+(String)Pin+" Kanal "+(String)akanal); pinMode(Pin, INPUT); // Messung der RC-Abnahme iverh=0; verhs=0.; while (iverh1.05 && verh<1.5 && messv[1] verh1 && verh < verh2 && messc > 30 && messc < kama) { iges++; spek[messc]++; ipri=1; } // Akzeptierte Messung, Anzahl in Slot erhoehen // irest=iges%imo1; if (iges==0) {irest=1;} if (irest==0 && ipri==1) { Serial.println(" Anzahl Messungen "+(String)iges+" Koinzidenzen (ausgeschaltet) "+(String)akoi); } ires2=iges%imo2; if (iges==0) {ires2=1;} if (igesa==iges) {ires2=1;} // Spektrum schreiben if (ires2==0 && ipri==1) { ibma=0; nbma=0; zeit3=millis(); igesa=iges; Serial.println(" Spektrum "+(String)iges+" Zeit "+(String)zeit3+" ms "); for (int j = 80; j < kama; j++) { messc=spek[j]; if (messc>ibma) {ibma=messc; nbma=j;} if (messc>0) {Serial.println(" spw "+(String)j+" "+(String)messc+" ");} } delay(200); Serial.println(" Max. Besetzung "+(String)ibma+" in Slot "+(String)nbma+" "); delay(100); if (ibma=imo1) {Serial.println(" pri "); delay(100); for (int i = 0; i < kama; i++) { spek[i]=0 ;} iges=0; ibma=0; Serial.println(" Spektrum Null gesetzt "); delay(100); } delay(300); } // Warten bis Analogmessung klein messa=100; while (messa>50) { messa=analogRead(akanal);} // } }