Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of muonhunter-K8 by
main.cpp@4:87037e41c888, 2016-10-05 (annotated)
- Committer:
- mva111
- Date:
- Wed Oct 05 16:56:33 2016 +0000
- Revision:
- 4:87037e41c888
- Parent:
- 3:0a89a80bea94
- Child:
- 5:9c7c88f8f800
default code should have the buzzer on and removed some methods from the detection class
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 | 0:52895a475820 | 6 | //typically around 2 min data |
mva111 | 0:52895a475820 | 7 | //assuming normal background |
mva111 | 0:52895a475820 | 8 | #define DETECTION_MEMORY_LIMIT 128 |
mva111 | 0:52895a475820 | 9 | |
mva111 | 0:52895a475820 | 10 | //doesn't log the GM hits with a timestamp |
mva111 | 0:52895a475820 | 11 | //only counts them when set to 1 |
mva111 | 0:52895a475820 | 12 | #define DETECT_MUONS_ONLY 0 |
mva111 | 0:52895a475820 | 13 | |
mva111 | 0:52895a475820 | 14 | //set the coincidence time window in us |
mva111 | 0:52895a475820 | 15 | int coincidence_wait = 150; |
mva111 | 0:52895a475820 | 16 | bool mdet = 0; |
mva111 | 4:87037e41c888 | 17 | bool buzzer = 1; |
mva111 | 0:52895a475820 | 18 | |
mva111 | 2:66a2e52ad175 | 19 | volatile int muon_total; |
mva111 | 2:66a2e52ad175 | 20 | volatile int gm1_total; |
mva111 | 2:66a2e52ad175 | 21 | volatile int gm2_total; |
mva111 | 0:52895a475820 | 22 | |
mva111 | 0:52895a475820 | 23 | //storing a detections in a FIFO queue |
mva111 | 0:52895a475820 | 24 | queue<Detection> detections; |
mva111 | 0:52895a475820 | 25 | |
mva111 | 0:52895a475820 | 26 | //High voltage controls |
mva111 | 0:52895a475820 | 27 | HVControl hv1(PA_3, PA_0); |
mva111 | 0:52895a475820 | 28 | HVControl hv2(PB_1, PA_1); |
mva111 | 0:52895a475820 | 29 | |
mva111 | 0:52895a475820 | 30 | Serial rpi(PA_9,PA_10); |
mva111 | 0:52895a475820 | 31 | |
mva111 | 0:52895a475820 | 32 | Timer coincidence_timer; |
mva111 | 0:52895a475820 | 33 | Timer main_t; |
mva111 | 0:52895a475820 | 34 | |
mva111 | 0:52895a475820 | 35 | Serial pc(USBTX, USBRX); |
mva111 | 0:52895a475820 | 36 | // Ticker debug; |
mva111 | 0:52895a475820 | 37 | Ticker hv1monitor; |
mva111 | 0:52895a475820 | 38 | Ticker hv2monitor; |
mva111 | 0:52895a475820 | 39 | Ticker memory_checker; |
mva111 | 0:52895a475820 | 40 | |
mva111 | 0:52895a475820 | 41 | DigitalOut led(LED1); |
mva111 | 0:52895a475820 | 42 | DigitalOut GM1_led(PA_12); |
mva111 | 0:52895a475820 | 43 | DigitalOut GM2_led(PA_8); |
mva111 | 0:52895a475820 | 44 | DigitalOut C_led(PA_11); |
mva111 | 0:52895a475820 | 45 | DigitalOut Buzzer(PF_0); |
mva111 | 0:52895a475820 | 46 | |
mva111 | 0:52895a475820 | 47 | InterruptIn GM1(PB_0); |
mva111 | 0:52895a475820 | 48 | InterruptIn GM2(PF_1); |
mva111 | 0:52895a475820 | 49 | |
mva111 | 0:52895a475820 | 50 | //global variables for voltages |
mva111 | 0:52895a475820 | 51 | volatile float v1 = 0; |
mva111 | 0:52895a475820 | 52 | volatile float v2 = 0; |
mva111 | 0:52895a475820 | 53 | |
mva111 | 0:52895a475820 | 54 | //ui functions |
mva111 | 0:52895a475820 | 55 | void reset_counters (void){ |
mva111 | 0:52895a475820 | 56 | muon_total = 0; |
mva111 | 0:52895a475820 | 57 | gm1_total = 0; |
mva111 | 0:52895a475820 | 58 | gm2_total = 0; |
mva111 | 0:52895a475820 | 59 | } |
mva111 | 0:52895a475820 | 60 | |
mva111 | 0:52895a475820 | 61 | void muon_buzz(void){ |
mva111 | 0:52895a475820 | 62 | C_led = 1; |
mva111 | 1:549e331aefab | 63 | |
mva111 | 1:549e331aefab | 64 | if(buzzer){ |
mva111 | 1:549e331aefab | 65 | for(int i = 0; i < 32; i++){ |
mva111 | 1:549e331aefab | 66 | Buzzer = !Buzzer; |
mva111 | 1:549e331aefab | 67 | wait(0.002); |
mva111 | 1:549e331aefab | 68 | }} else { |
mva111 | 1:549e331aefab | 69 | wait(0.05); |
mva111 | 1:549e331aefab | 70 | } |
mva111 | 1:549e331aefab | 71 | |
mva111 | 0:52895a475820 | 72 | C_led = 0; |
mva111 | 0:52895a475820 | 73 | } |
mva111 | 0:52895a475820 | 74 | |
mva111 | 0:52895a475820 | 75 | void GM1_buzz(void){ |
mva111 | 0:52895a475820 | 76 | GM1_led = 1; |
mva111 | 1:549e331aefab | 77 | if(buzzer){ |
mva111 | 0:52895a475820 | 78 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 79 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 80 | wait(0.001); |
mva111 | 1:549e331aefab | 81 | }} else { |
mva111 | 1:549e331aefab | 82 | wait(0.05); |
mva111 | 1:549e331aefab | 83 | } |
mva111 | 0:52895a475820 | 84 | GM1_led = 0; |
mva111 | 0:52895a475820 | 85 | } |
mva111 | 0:52895a475820 | 86 | |
mva111 | 0:52895a475820 | 87 | void GM2_buzz(void){ |
mva111 | 0:52895a475820 | 88 | GM2_led = 1; |
mva111 | 1:549e331aefab | 89 | if(buzzer){ |
mva111 | 0:52895a475820 | 90 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 91 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 92 | wait(0.001); |
mva111 | 1:549e331aefab | 93 | }} else { |
mva111 | 1:549e331aefab | 94 | wait(0.05); |
mva111 | 1:549e331aefab | 95 | } |
mva111 | 0:52895a475820 | 96 | GM2_led = 0; |
mva111 | 0:52895a475820 | 97 | } |
mva111 | 0:52895a475820 | 98 | |
mva111 | 0:52895a475820 | 99 | |
mva111 | 0:52895a475820 | 100 | //adds a detection onto the queue |
mva111 | 0:52895a475820 | 101 | void add_detection(int channel, float time){ |
mva111 | 1:549e331aefab | 102 | Detection* det = new Detection(channel, time); |
mva111 | 0:52895a475820 | 103 | detections.push(*det); |
mva111 | 0:52895a475820 | 104 | delete det; |
mva111 | 0:52895a475820 | 105 | } |
mva111 | 0:52895a475820 | 106 | |
mva111 | 0:52895a475820 | 107 | //callback for GM1 detection |
mva111 | 0:52895a475820 | 108 | void GM1_hit(void){ |
mva111 | 0:52895a475820 | 109 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 110 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 111 | if(GM2 == 0){ |
mva111 | 0:52895a475820 | 112 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 113 | muon_buzz(); |
mva111 | 0:52895a475820 | 114 | muon_total++; |
mva111 | 0:52895a475820 | 115 | mdet = 1; |
mva111 | 0:52895a475820 | 116 | } |
mva111 | 0:52895a475820 | 117 | wait(1e-7); |
mva111 | 0:52895a475820 | 118 | } |
mva111 | 0:52895a475820 | 119 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 120 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 121 | if(mdet == 0) GM1_buzz(); |
mva111 | 0:52895a475820 | 122 | if ( !DETECT_MUONS_ONLY ) add_detection(1, main_t.read()); |
mva111 | 0:52895a475820 | 123 | gm1_total++; |
mva111 | 0:52895a475820 | 124 | mdet = 0; |
mva111 | 0:52895a475820 | 125 | } |
mva111 | 0:52895a475820 | 126 | |
mva111 | 0:52895a475820 | 127 | //callback for GM2 detection |
mva111 | 0:52895a475820 | 128 | void GM2_hit(void){ |
mva111 | 0:52895a475820 | 129 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 130 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 131 | if(GM1 == 0){ |
mva111 | 0:52895a475820 | 132 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 133 | muon_buzz(); |
mva111 | 0:52895a475820 | 134 | muon_total++; |
mva111 | 0:52895a475820 | 135 | mdet = 1; |
mva111 | 0:52895a475820 | 136 | } |
mva111 | 0:52895a475820 | 137 | wait(1e-7); |
mva111 | 0:52895a475820 | 138 | } |
mva111 | 0:52895a475820 | 139 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 140 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 141 | if(mdet == 0) GM2_buzz(); |
mva111 | 0:52895a475820 | 142 | if ( !DETECT_MUONS_ONLY ) add_detection(2, main_t.read()); |
mva111 | 0:52895a475820 | 143 | gm2_total++; |
mva111 | 0:52895a475820 | 144 | mdet = 0; |
mva111 | 0:52895a475820 | 145 | } |
mva111 | 0:52895a475820 | 146 | |
mva111 | 0:52895a475820 | 147 | // high voltage software monitors |
mva111 | 0:52895a475820 | 148 | void hv1monitor_(void){ |
mva111 | 0:52895a475820 | 149 | if(hv1.measure()){ |
mva111 | 0:52895a475820 | 150 | if(v1 - hv1.get_voltage() > 100){ hv1.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 151 | }else{ hv1.shutdown(); } |
mva111 | 0:52895a475820 | 152 | v1 = hv1.get_voltage(); |
mva111 | 0:52895a475820 | 153 | } |
mva111 | 0:52895a475820 | 154 | |
mva111 | 0:52895a475820 | 155 | void hv2monitor_(void){ |
mva111 | 0:52895a475820 | 156 | if(hv2.measure()){ |
mva111 | 0:52895a475820 | 157 | if(v2 - hv2.get_voltage() > 100){ hv2.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 158 | }else{ hv2.shutdown(); } |
mva111 | 0:52895a475820 | 159 | v2 = hv2.get_voltage(); |
mva111 | 0:52895a475820 | 160 | } |
mva111 | 0:52895a475820 | 161 | |
mva111 | 0:52895a475820 | 162 | //discarding older items if buffer gets too big |
mva111 | 0:52895a475820 | 163 | void memory_checker_(void){ |
mva111 | 0:52895a475820 | 164 | if ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/8)) ){ |
mva111 | 0:52895a475820 | 165 | while ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/4)) ){ |
mva111 | 0:52895a475820 | 166 | detections.pop(); |
mva111 | 0:52895a475820 | 167 | } |
mva111 | 0:52895a475820 | 168 | } |
mva111 | 0:52895a475820 | 169 | } |
mva111 | 0:52895a475820 | 170 | |
mva111 | 2:66a2e52ad175 | 171 | |
mva111 | 0:52895a475820 | 172 | int main() { |
mva111 | 0:52895a475820 | 173 | //start main timer |
mva111 | 0:52895a475820 | 174 | main_t.start(); |
mva111 | 0:52895a475820 | 175 | |
mva111 | 4:87037e41c888 | 176 | hv1.set_frequency(4300); |
mva111 | 4:87037e41c888 | 177 | hv2.set_frequency(4350); |
mva111 | 0:52895a475820 | 178 | GM1.fall(&GM1_hit); |
mva111 | 0:52895a475820 | 179 | GM2.fall(&GM2_hit); |
mva111 | 0:52895a475820 | 180 | |
mva111 | 0:52895a475820 | 181 | //tickers to monitor the high voltage |
mva111 | 0:52895a475820 | 182 | hv1monitor.attach(&hv1monitor_, 0.1); |
mva111 | 0:52895a475820 | 183 | hv2monitor.attach(&hv2monitor_, 0.1); |
mva111 | 0:52895a475820 | 184 | |
mva111 | 4:87037e41c888 | 185 | |
mva111 | 0:52895a475820 | 186 | //ticker to monitor memory usage |
mva111 | 2:66a2e52ad175 | 187 | memory_checker.attach(&memory_checker_, 0.2); |
mva111 | 0:52895a475820 | 188 | while(1){ |
mva111 | 3:0a89a80bea94 | 189 | while(!detections.empty()){ |
mva111 | 1:549e331aefab | 190 | Detection temp = detections.front(); |
mva111 | 4:87037e41c888 | 191 | pc.printf("%d, %d, %f, %f, %f \n\r", detections.size(), temp.channel, temp.time, v1, v2); |
mva111 | 1:549e331aefab | 192 | detections.pop(); |
mva111 | 1:549e331aefab | 193 | } |
mva111 | 1:549e331aefab | 194 | wait(1); |
mva111 | 0:52895a475820 | 195 | } |
mva111 | 0:52895a475820 | 196 | } |