MH K8 firmware with HV control.

Dependencies:   mbed NOKIA_5110

Fork of muonhunter-K8 by Oliver Keller

Committer:
mva111
Date:
Tue Oct 04 16:45:02 2016 +0000
Revision:
2:66a2e52ad175
Parent:
1:549e331aefab
Child:
3:0a89a80bea94
cleaned hv module

Who changed what in which revision?

UserRevisionLine numberNew 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 1:549e331aefab 17 bool buzzer = 0;
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 0:52895a475820 176 hv1.set_frequency(4500);
mva111 0:52895a475820 177 hv2.set_frequency(4500);
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 2:66a2e52ad175 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 1:549e331aefab 189 if(detections.size() > 1){
mva111 1:549e331aefab 190 Detection temp = detections.front();
mva111 2:66a2e52ad175 191 pc.printf("%d, %d, %f, %f, %f \nr", detections.size(), temp.get_channel(), temp.get_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 }