Mihaly Vadai
/
muonhunter-K8
MH K8 firmware with HV control.
Fork of muonhunter-K8 by
hvcontrol.cpp@4:87037e41c888, 2016-10-05 (annotated)
- Committer:
- mva111
- Date:
- Wed Oct 05 16:56:33 2016 +0000
- Revision:
- 4:87037e41c888
- Parent:
- 2:66a2e52ad175
- Child:
- 7:6a0958c2be7e
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 | |
mva111 | 4:87037e41c888 | 3 | struct HVControl{ |
mva111 | 0:52895a475820 | 4 | int freq, max_freq, min_freq; // oscillator parameters |
mva111 | 0:52895a475820 | 5 | float voltage_ref, divider_value, voltage, thresh, safe_voltage; //hv probe parameters |
mva111 | 0:52895a475820 | 6 | PinName oscillator_pin, measure_pin; |
mva111 | 0:52895a475820 | 7 | |
mva111 | 0:52895a475820 | 8 | int period(int f){ |
mva111 | 0:52895a475820 | 9 | double T=0; |
mva111 | 0:52895a475820 | 10 | if (f < 1){ |
mva111 | 0:52895a475820 | 11 | T = 1; |
mva111 | 0:52895a475820 | 12 | }else{ |
mva111 | 0:52895a475820 | 13 | T = 1000000/f; |
mva111 | 0:52895a475820 | 14 | } |
mva111 | 0:52895a475820 | 15 | return (int)(T); |
mva111 | 0:52895a475820 | 16 | } |
mva111 | 0:52895a475820 | 17 | |
mva111 | 0:52895a475820 | 18 | int *hvparams; //array is indexed with the frequency |
mva111 | 2:66a2e52ad175 | 19 | |
mva111 | 0:52895a475820 | 20 | HVControl(PinName oscillator_pin_, PinName measure_pin_) { |
mva111 | 0:52895a475820 | 21 | max_freq = 10000; //default maximum frequency |
mva111 | 0:52895a475820 | 22 | min_freq = 1000; //default minimum frequency |
mva111 | 0:52895a475820 | 23 | divider_value = 304; //default board value |
mva111 | 0:52895a475820 | 24 | voltage_ref = 3.3; //mbed default voltage reference |
mva111 | 0:52895a475820 | 25 | voltage = 0; // actual voltage |
mva111 | 0:52895a475820 | 26 | safe_voltage = 20; |
mva111 | 0:52895a475820 | 27 | thresh = 1000; //default maximum high voltage threshold |
mva111 | 0:52895a475820 | 28 | oscillator_pin = oscillator_pin_; |
mva111 | 0:52895a475820 | 29 | measure_pin = measure_pin_; |
mva111 | 0:52895a475820 | 30 | freq = max_freq; |
mva111 | 0:52895a475820 | 31 | } |
mva111 | 0:52895a475820 | 32 | |
mva111 | 2:66a2e52ad175 | 33 | float from_adc_voltage(float adc_v){ return adc_v * divider_value * voltage_ref; } |
mva111 | 2:66a2e52ad175 | 34 | |
mva111 | 2:66a2e52ad175 | 35 | float to_adc_voltage(float voltage_){ return voltage_/(divider_value * voltage_ref); } |
mva111 | 0:52895a475820 | 36 | |
mva111 | 0:52895a475820 | 37 | bool measure(void){ |
mva111 | 0:52895a475820 | 38 | AnalogIn probe(measure_pin); |
mva111 | 0:52895a475820 | 39 | voltage = from_adc_voltage(probe.read()); |
mva111 | 0:52895a475820 | 40 | if(voltage > thresh){ return 0; } |
mva111 | 0:52895a475820 | 41 | else{ return 1; } |
mva111 | 0:52895a475820 | 42 | } |
mva111 | 0:52895a475820 | 43 | |
mva111 | 0:52895a475820 | 44 | void set_frequency(int f){ |
mva111 | 0:52895a475820 | 45 | if(f > max_freq){ |
mva111 | 0:52895a475820 | 46 | f = max_freq; |
mva111 | 0:52895a475820 | 47 | } |
mva111 | 0:52895a475820 | 48 | if(f < min_freq){ |
mva111 | 0:52895a475820 | 49 | f = min_freq; |
mva111 | 0:52895a475820 | 50 | } |
mva111 | 0:52895a475820 | 51 | PwmOut pwm(oscillator_pin); |
mva111 | 0:52895a475820 | 52 | int p = period(f); |
mva111 | 0:52895a475820 | 53 | freq = f; |
mva111 | 0:52895a475820 | 54 | pwm.period_us(p); |
mva111 | 0:52895a475820 | 55 | pwm.pulsewidth_us((int)(p/2)); |
mva111 | 0:52895a475820 | 56 | } |
mva111 | 0:52895a475820 | 57 | |
mva111 | 0:52895a475820 | 58 | int freq_to_index(int f){ return (f/100)-10; } |
mva111 | 0:52895a475820 | 59 | |
mva111 | 0:52895a475820 | 60 | int index_to_freq(int f){ return (f+10)*100; } |
mva111 | 0:52895a475820 | 61 | |
mva111 | 0:52895a475820 | 62 | void calibrate(void){ |
mva111 | 0:52895a475820 | 63 | hvparams = new int[69]; |
mva111 | 0:52895a475820 | 64 | shutdown(); |
mva111 | 0:52895a475820 | 65 | for(int f=7800; f>=1000; f-=100){ |
mva111 | 0:52895a475820 | 66 | set_frequency(f); |
mva111 | 0:52895a475820 | 67 | wait(1); |
mva111 | 0:52895a475820 | 68 | if(measure()){ |
mva111 | 0:52895a475820 | 69 | hvparams[freq_to_index(f)]=(int)voltage; |
mva111 | 0:52895a475820 | 70 | }else{ |
mva111 | 0:52895a475820 | 71 | shutdown(); |
mva111 | 0:52895a475820 | 72 | break; |
mva111 | 0:52895a475820 | 73 | } |
mva111 | 0:52895a475820 | 74 | } |
mva111 | 0:52895a475820 | 75 | } |
mva111 | 0:52895a475820 | 76 | |
mva111 | 0:52895a475820 | 77 | void shutdown(void){ |
mva111 | 0:52895a475820 | 78 | DigitalOut pwm_(oscillator_pin); |
mva111 | 0:52895a475820 | 79 | pwm_.write(1); |
mva111 | 0:52895a475820 | 80 | freq = 0; |
mva111 | 2:66a2e52ad175 | 81 | measure(); |
mva111 | 0:52895a475820 | 82 | while(voltage > safe_voltage){ |
mva111 | 2:66a2e52ad175 | 83 | measure(); |
mva111 | 0:52895a475820 | 84 | wait(1); |
mva111 | 0:52895a475820 | 85 | } |
mva111 | 0:52895a475820 | 86 | } |
mva111 | 0:52895a475820 | 87 | |
mva111 | 2:66a2e52ad175 | 88 | float get_voltage(void){ |
mva111 | 2:66a2e52ad175 | 89 | measure(); |
mva111 | 2:66a2e52ad175 | 90 | return voltage; |
mva111 | 2:66a2e52ad175 | 91 | } |
mva111 | 0:52895a475820 | 92 | |
mva111 | 0:52895a475820 | 93 | int *get_hvparams(void){ return hvparams; } |
mva111 | 0:52895a475820 | 94 | |
mva111 | 0:52895a475820 | 95 | int get_frequency(void){ return freq; } |
mva111 | 0:52895a475820 | 96 | }; |