Oliver Keller
/
muonhunter-K8
experimental fork
main.cpp@6:e95598c44a7f, 2016-10-08 (annotated)
- Committer:
- mva111
- Date:
- Sat Oct 08 13:34:52 2016 +0000
- Revision:
- 6:e95598c44a7f
- Parent:
- 5:9c7c88f8f800
- Child:
- 7:6a0958c2be7e
new;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mva111 | 0:52895a475820 | 1 | #include "mbed.h" |
mva111 | 0:52895a475820 | 2 | #include "hvcontrol.cpp" |
mva111 | 0:52895a475820 | 3 | #include "detection.cpp" |
mva111 | 0:52895a475820 | 4 | #include <queue> |
mva111 | 0:52895a475820 | 5 | |
mva111 | 5:9c7c88f8f800 | 6 | //set the frequency of the oscillators below |
mva111 | 5:9c7c88f8f800 | 7 | int f1 = 4300; |
mva111 | 5:9c7c88f8f800 | 8 | int f2 = 4350; |
mva111 | 5:9c7c88f8f800 | 9 | |
mva111 | 5:9c7c88f8f800 | 10 | //set the coincidence times in us below |
mva111 | 5:9c7c88f8f800 | 11 | int coincidence_wait = 150; |
mva111 | 5:9c7c88f8f800 | 12 | bool buzzer = 1; |
mva111 | 5:9c7c88f8f800 | 13 | |
mva111 | 5:9c7c88f8f800 | 14 | /* NO USER CONFIGURABLE OPTIONS BELOW |
mva111 | 5:9c7c88f8f800 | 15 | */ |
mva111 | 5:9c7c88f8f800 | 16 | |
mva111 | 0:52895a475820 | 17 | //typically around 2 min data |
mva111 | 0:52895a475820 | 18 | //assuming normal background |
mva111 | 0:52895a475820 | 19 | #define DETECTION_MEMORY_LIMIT 128 |
mva111 | 0:52895a475820 | 20 | |
mva111 | 0:52895a475820 | 21 | //doesn't log the GM hits with a timestamp |
mva111 | 0:52895a475820 | 22 | //only counts them when set to 1 |
mva111 | 0:52895a475820 | 23 | #define DETECT_MUONS_ONLY 0 |
mva111 | 0:52895a475820 | 24 | |
mva111 | 0:52895a475820 | 25 | //set the coincidence time window in us |
mva111 | 5:9c7c88f8f800 | 26 | |
mva111 | 0:52895a475820 | 27 | bool mdet = 0; |
mva111 | 5:9c7c88f8f800 | 28 | |
mva111 | 0:52895a475820 | 29 | |
mva111 | 2:66a2e52ad175 | 30 | volatile int muon_total; |
mva111 | 2:66a2e52ad175 | 31 | volatile int gm1_total; |
mva111 | 2:66a2e52ad175 | 32 | volatile int gm2_total; |
mva111 | 0:52895a475820 | 33 | |
mva111 | 0:52895a475820 | 34 | //storing a detections in a FIFO queue |
mva111 | 0:52895a475820 | 35 | queue<Detection> detections; |
mva111 | 0:52895a475820 | 36 | |
mva111 | 0:52895a475820 | 37 | //High voltage controls |
mva111 | 0:52895a475820 | 38 | HVControl hv1(PA_3, PA_0); |
mva111 | 0:52895a475820 | 39 | HVControl hv2(PB_1, PA_1); |
mva111 | 0:52895a475820 | 40 | |
mva111 | 0:52895a475820 | 41 | Serial rpi(PA_9,PA_10); |
mva111 | 0:52895a475820 | 42 | |
mva111 | 0:52895a475820 | 43 | Timer coincidence_timer; |
mva111 | 0:52895a475820 | 44 | Timer main_t; |
mva111 | 0:52895a475820 | 45 | |
mva111 | 0:52895a475820 | 46 | Serial pc(USBTX, USBRX); |
mva111 | 0:52895a475820 | 47 | // Ticker debug; |
mva111 | 0:52895a475820 | 48 | Ticker hv1monitor; |
mva111 | 0:52895a475820 | 49 | Ticker hv2monitor; |
mva111 | 0:52895a475820 | 50 | Ticker memory_checker; |
mva111 | 0:52895a475820 | 51 | |
mva111 | 0:52895a475820 | 52 | DigitalOut led(LED1); |
mva111 | 0:52895a475820 | 53 | DigitalOut GM1_led(PA_12); |
mva111 | 0:52895a475820 | 54 | DigitalOut GM2_led(PA_8); |
mva111 | 0:52895a475820 | 55 | DigitalOut C_led(PA_11); |
mva111 | 0:52895a475820 | 56 | DigitalOut Buzzer(PF_0); |
mva111 | 0:52895a475820 | 57 | |
mva111 | 0:52895a475820 | 58 | InterruptIn GM1(PB_0); |
mva111 | 0:52895a475820 | 59 | InterruptIn GM2(PF_1); |
mva111 | 0:52895a475820 | 60 | |
mva111 | 0:52895a475820 | 61 | //global variables for voltages |
mva111 | 0:52895a475820 | 62 | volatile float v1 = 0; |
mva111 | 0:52895a475820 | 63 | volatile float v2 = 0; |
mva111 | 0:52895a475820 | 64 | |
mva111 | 0:52895a475820 | 65 | //ui functions |
mva111 | 0:52895a475820 | 66 | void reset_counters (void){ |
mva111 | 0:52895a475820 | 67 | muon_total = 0; |
mva111 | 0:52895a475820 | 68 | gm1_total = 0; |
mva111 | 0:52895a475820 | 69 | gm2_total = 0; |
mva111 | 0:52895a475820 | 70 | } |
mva111 | 0:52895a475820 | 71 | |
mva111 | 0:52895a475820 | 72 | void muon_buzz(void){ |
mva111 | 0:52895a475820 | 73 | C_led = 1; |
mva111 | 1:549e331aefab | 74 | |
mva111 | 1:549e331aefab | 75 | if(buzzer){ |
mva111 | 1:549e331aefab | 76 | for(int i = 0; i < 32; i++){ |
mva111 | 1:549e331aefab | 77 | Buzzer = !Buzzer; |
mva111 | 1:549e331aefab | 78 | wait(0.002); |
mva111 | 1:549e331aefab | 79 | }} else { |
mva111 | 1:549e331aefab | 80 | wait(0.05); |
mva111 | 1:549e331aefab | 81 | } |
mva111 | 1:549e331aefab | 82 | |
mva111 | 0:52895a475820 | 83 | C_led = 0; |
mva111 | 0:52895a475820 | 84 | } |
mva111 | 0:52895a475820 | 85 | |
mva111 | 0:52895a475820 | 86 | void GM1_buzz(void){ |
mva111 | 0:52895a475820 | 87 | GM1_led = 1; |
mva111 | 1:549e331aefab | 88 | if(buzzer){ |
mva111 | 0:52895a475820 | 89 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 90 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 91 | wait(0.001); |
mva111 | 1:549e331aefab | 92 | }} else { |
mva111 | 1:549e331aefab | 93 | wait(0.05); |
mva111 | 1:549e331aefab | 94 | } |
mva111 | 0:52895a475820 | 95 | GM1_led = 0; |
mva111 | 0:52895a475820 | 96 | } |
mva111 | 0:52895a475820 | 97 | |
mva111 | 0:52895a475820 | 98 | void GM2_buzz(void){ |
mva111 | 0:52895a475820 | 99 | GM2_led = 1; |
mva111 | 1:549e331aefab | 100 | if(buzzer){ |
mva111 | 0:52895a475820 | 101 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 102 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 103 | wait(0.001); |
mva111 | 1:549e331aefab | 104 | }} else { |
mva111 | 1:549e331aefab | 105 | wait(0.05); |
mva111 | 1:549e331aefab | 106 | } |
mva111 | 0:52895a475820 | 107 | GM2_led = 0; |
mva111 | 0:52895a475820 | 108 | } |
mva111 | 0:52895a475820 | 109 | |
mva111 | 0:52895a475820 | 110 | |
mva111 | 0:52895a475820 | 111 | //adds a detection onto the queue |
mva111 | 0:52895a475820 | 112 | void add_detection(int channel, float time){ |
mva111 | 1:549e331aefab | 113 | Detection* det = new Detection(channel, time); |
mva111 | 0:52895a475820 | 114 | detections.push(*det); |
mva111 | 0:52895a475820 | 115 | delete det; |
mva111 | 0:52895a475820 | 116 | } |
mva111 | 0:52895a475820 | 117 | |
mva111 | 0:52895a475820 | 118 | //callback for GM1 detection |
mva111 | 0:52895a475820 | 119 | void GM1_hit(void){ |
mva111 | 0:52895a475820 | 120 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 121 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 122 | if(GM2 == 0){ |
mva111 | 0:52895a475820 | 123 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 124 | muon_buzz(); |
mva111 | 0:52895a475820 | 125 | muon_total++; |
mva111 | 6:e95598c44a7f | 126 | gm2_total++; |
mva111 | 0:52895a475820 | 127 | mdet = 1; |
mva111 | 0:52895a475820 | 128 | } |
mva111 | 0:52895a475820 | 129 | wait(1e-7); |
mva111 | 0:52895a475820 | 130 | } |
mva111 | 0:52895a475820 | 131 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 132 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 133 | if(mdet == 0) GM1_buzz(); |
mva111 | 0:52895a475820 | 134 | if ( !DETECT_MUONS_ONLY ) add_detection(1, main_t.read()); |
mva111 | 0:52895a475820 | 135 | gm1_total++; |
mva111 | 0:52895a475820 | 136 | mdet = 0; |
mva111 | 0:52895a475820 | 137 | } |
mva111 | 0:52895a475820 | 138 | |
mva111 | 0:52895a475820 | 139 | //callback for GM2 detection |
mva111 | 0:52895a475820 | 140 | void GM2_hit(void){ |
mva111 | 0:52895a475820 | 141 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 142 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 143 | if(GM1 == 0){ |
mva111 | 0:52895a475820 | 144 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 145 | muon_buzz(); |
mva111 | 0:52895a475820 | 146 | muon_total++; |
mva111 | 6:e95598c44a7f | 147 | gm1_total++; |
mva111 | 0:52895a475820 | 148 | mdet = 1; |
mva111 | 0:52895a475820 | 149 | } |
mva111 | 0:52895a475820 | 150 | wait(1e-7); |
mva111 | 0:52895a475820 | 151 | } |
mva111 | 0:52895a475820 | 152 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 153 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 154 | if(mdet == 0) GM2_buzz(); |
mva111 | 0:52895a475820 | 155 | if ( !DETECT_MUONS_ONLY ) add_detection(2, main_t.read()); |
mva111 | 0:52895a475820 | 156 | gm2_total++; |
mva111 | 0:52895a475820 | 157 | mdet = 0; |
mva111 | 0:52895a475820 | 158 | } |
mva111 | 0:52895a475820 | 159 | |
mva111 | 0:52895a475820 | 160 | // high voltage software monitors |
mva111 | 0:52895a475820 | 161 | void hv1monitor_(void){ |
mva111 | 0:52895a475820 | 162 | if(hv1.measure()){ |
mva111 | 0:52895a475820 | 163 | if(v1 - hv1.get_voltage() > 100){ hv1.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 164 | }else{ hv1.shutdown(); } |
mva111 | 0:52895a475820 | 165 | v1 = hv1.get_voltage(); |
mva111 | 0:52895a475820 | 166 | } |
mva111 | 0:52895a475820 | 167 | |
mva111 | 0:52895a475820 | 168 | void hv2monitor_(void){ |
mva111 | 0:52895a475820 | 169 | if(hv2.measure()){ |
mva111 | 0:52895a475820 | 170 | if(v2 - hv2.get_voltage() > 100){ hv2.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 171 | }else{ hv2.shutdown(); } |
mva111 | 0:52895a475820 | 172 | v2 = hv2.get_voltage(); |
mva111 | 0:52895a475820 | 173 | } |
mva111 | 0:52895a475820 | 174 | |
mva111 | 0:52895a475820 | 175 | //discarding older items if buffer gets too big |
mva111 | 0:52895a475820 | 176 | void memory_checker_(void){ |
mva111 | 0:52895a475820 | 177 | if ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/8)) ){ |
mva111 | 0:52895a475820 | 178 | while ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/4)) ){ |
mva111 | 0:52895a475820 | 179 | detections.pop(); |
mva111 | 0:52895a475820 | 180 | } |
mva111 | 0:52895a475820 | 181 | } |
mva111 | 0:52895a475820 | 182 | } |
mva111 | 0:52895a475820 | 183 | |
mva111 | 2:66a2e52ad175 | 184 | |
mva111 | 0:52895a475820 | 185 | int main() { |
mva111 | 0:52895a475820 | 186 | //start main timer |
mva111 | 0:52895a475820 | 187 | main_t.start(); |
mva111 | 0:52895a475820 | 188 | |
mva111 | 5:9c7c88f8f800 | 189 | hv1.set_frequency(f1); |
mva111 | 5:9c7c88f8f800 | 190 | hv2.set_frequency(f2); |
mva111 | 0:52895a475820 | 191 | GM1.fall(&GM1_hit); |
mva111 | 0:52895a475820 | 192 | GM2.fall(&GM2_hit); |
mva111 | 0:52895a475820 | 193 | |
mva111 | 0:52895a475820 | 194 | //tickers to monitor the high voltage |
mva111 | 0:52895a475820 | 195 | hv1monitor.attach(&hv1monitor_, 0.1); |
mva111 | 0:52895a475820 | 196 | hv2monitor.attach(&hv2monitor_, 0.1); |
mva111 | 0:52895a475820 | 197 | |
mva111 | 4:87037e41c888 | 198 | |
mva111 | 0:52895a475820 | 199 | //ticker to monitor memory usage |
mva111 | 2:66a2e52ad175 | 200 | memory_checker.attach(&memory_checker_, 0.2); |
mva111 | 0:52895a475820 | 201 | while(1){ |
mva111 | 3:0a89a80bea94 | 202 | while(!detections.empty()){ |
mva111 | 1:549e331aefab | 203 | Detection temp = detections.front(); |
mva111 | 6:e95598c44a7f | 204 | pc.printf("Ch: %d, Time: %.2fs, V1: %.1fV, V2: %.1fV \n\r", temp.channel, temp.time, v1, v2); |
mva111 | 6:e95598c44a7f | 205 | pc.printf("Total GM1: %d, Total GM2: %d, Total Coinc: %d \n\r \n\r", gm1_total, gm2_total, muon_total); |
mva111 | 1:549e331aefab | 206 | detections.pop(); |
mva111 | 1:549e331aefab | 207 | } |
mva111 | 1:549e331aefab | 208 | wait(1); |
mva111 | 0:52895a475820 | 209 | } |
mva111 | 0:52895a475820 | 210 | } |