Oliver Keller
/
muonhunter-K8
experimental fork
hvcontrol.cpp@0:52895a475820, 2016-10-04 (annotated)
- Committer:
- mva111
- Date:
- Tue Oct 04 09:34:20 2016 +0000
- Revision:
- 0:52895a475820
- Child:
- 2:66a2e52ad175
initial;
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 | float to_adc_voltage(float voltage_){ return voltage_/(divider_value * voltage_ref); } |
mva111 | 0:52895a475820 | 21 | |
mva111 | 0:52895a475820 | 22 | float from_adc_voltage(float adc_v){ return adc_v * divider_value * voltage_ref; } |
mva111 | 0:52895a475820 | 23 | |
mva111 | 0:52895a475820 | 24 | public: |
mva111 | 0:52895a475820 | 25 | int *hvparams; //array is indexed with the frequency |
mva111 | 0:52895a475820 | 26 | Ticker hvtick; |
mva111 | 0:52895a475820 | 27 | |
mva111 | 0:52895a475820 | 28 | HVControl(PinName oscillator_pin_, PinName measure_pin_) { |
mva111 | 0:52895a475820 | 29 | max_freq = 10000; //default maximum frequency |
mva111 | 0:52895a475820 | 30 | min_freq = 1000; //default minimum frequency |
mva111 | 0:52895a475820 | 31 | divider_value = 304; //default board value |
mva111 | 0:52895a475820 | 32 | voltage_ref = 3.3; //mbed default voltage reference |
mva111 | 0:52895a475820 | 33 | voltage = 0; // actual voltage |
mva111 | 0:52895a475820 | 34 | safe_voltage = 20; |
mva111 | 0:52895a475820 | 35 | thresh = 1000; //default maximum high voltage threshold |
mva111 | 0:52895a475820 | 36 | oscillator_pin = oscillator_pin_; |
mva111 | 0:52895a475820 | 37 | measure_pin = measure_pin_; |
mva111 | 0:52895a475820 | 38 | freq = max_freq; |
mva111 | 0:52895a475820 | 39 | } |
mva111 | 0:52895a475820 | 40 | |
mva111 | 0:52895a475820 | 41 | void control_voltage(void){ |
mva111 | 0:52895a475820 | 42 | |
mva111 | 0:52895a475820 | 43 | } |
mva111 | 0:52895a475820 | 44 | void set_voltage(int target_v){ |
mva111 | 0:52895a475820 | 45 | float err = 0; |
mva111 | 0:52895a475820 | 46 | if(measure()){ |
mva111 | 0:52895a475820 | 47 | |
mva111 | 0:52895a475820 | 48 | }else{ |
mva111 | 0:52895a475820 | 49 | shutdown(); |
mva111 | 0:52895a475820 | 50 | } |
mva111 | 0:52895a475820 | 51 | |
mva111 | 0:52895a475820 | 52 | } |
mva111 | 0:52895a475820 | 53 | |
mva111 | 0:52895a475820 | 54 | bool measure(void){ |
mva111 | 0:52895a475820 | 55 | AnalogIn probe(measure_pin); |
mva111 | 0:52895a475820 | 56 | voltage = from_adc_voltage(probe.read()); |
mva111 | 0:52895a475820 | 57 | if(voltage > thresh){ return 0; } |
mva111 | 0:52895a475820 | 58 | else{ return 1; } |
mva111 | 0:52895a475820 | 59 | } |
mva111 | 0:52895a475820 | 60 | |
mva111 | 0:52895a475820 | 61 | void set_frequency(int f){ |
mva111 | 0:52895a475820 | 62 | if(f > max_freq){ |
mva111 | 0:52895a475820 | 63 | f = max_freq; |
mva111 | 0:52895a475820 | 64 | } |
mva111 | 0:52895a475820 | 65 | if(f < min_freq){ |
mva111 | 0:52895a475820 | 66 | f = min_freq; |
mva111 | 0:52895a475820 | 67 | } |
mva111 | 0:52895a475820 | 68 | PwmOut pwm(oscillator_pin); |
mva111 | 0:52895a475820 | 69 | int p = period(f); |
mva111 | 0:52895a475820 | 70 | freq = f; |
mva111 | 0:52895a475820 | 71 | pwm.period_us(p); |
mva111 | 0:52895a475820 | 72 | pwm.pulsewidth_us((int)(p/2)); |
mva111 | 0:52895a475820 | 73 | } |
mva111 | 0:52895a475820 | 74 | |
mva111 | 0:52895a475820 | 75 | int freq_to_index(int f){ return (f/100)-10; } |
mva111 | 0:52895a475820 | 76 | |
mva111 | 0:52895a475820 | 77 | int index_to_freq(int f){ return (f+10)*100; } |
mva111 | 0:52895a475820 | 78 | |
mva111 | 0:52895a475820 | 79 | void calibrate(void){ |
mva111 | 0:52895a475820 | 80 | hvparams = new int[69]; |
mva111 | 0:52895a475820 | 81 | shutdown(); |
mva111 | 0:52895a475820 | 82 | for(int f=7800; f>=1000; f-=100){ |
mva111 | 0:52895a475820 | 83 | set_frequency(f); |
mva111 | 0:52895a475820 | 84 | wait(1); |
mva111 | 0:52895a475820 | 85 | if(measure()){ |
mva111 | 0:52895a475820 | 86 | hvparams[freq_to_index(f)]=(int)voltage; |
mva111 | 0:52895a475820 | 87 | }else{ |
mva111 | 0:52895a475820 | 88 | shutdown(); |
mva111 | 0:52895a475820 | 89 | break; |
mva111 | 0:52895a475820 | 90 | } |
mva111 | 0:52895a475820 | 91 | } |
mva111 | 0:52895a475820 | 92 | } |
mva111 | 0:52895a475820 | 93 | |
mva111 | 0:52895a475820 | 94 | void shutdown(void){ |
mva111 | 0:52895a475820 | 95 | DigitalOut pwm_(oscillator_pin); |
mva111 | 0:52895a475820 | 96 | pwm_.write(1); |
mva111 | 0:52895a475820 | 97 | freq = 0; |
mva111 | 0:52895a475820 | 98 | bool m; |
mva111 | 0:52895a475820 | 99 | m = measure(); |
mva111 | 0:52895a475820 | 100 | while(voltage > safe_voltage){ |
mva111 | 0:52895a475820 | 101 | m = measure(); |
mva111 | 0:52895a475820 | 102 | wait(1); |
mva111 | 0:52895a475820 | 103 | } |
mva111 | 0:52895a475820 | 104 | } |
mva111 | 0:52895a475820 | 105 | |
mva111 | 0:52895a475820 | 106 | float get_voltage(void){ return voltage; } |
mva111 | 0:52895a475820 | 107 | |
mva111 | 0:52895a475820 | 108 | int *get_hvparams(void){ return hvparams; } |
mva111 | 0:52895a475820 | 109 | |
mva111 | 0:52895a475820 | 110 | int get_frequency(void){ return freq; } |
mva111 | 0:52895a475820 | 111 | }; |