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