Mihaly Vadai
/
muonhunter-K8
MH K8 firmware with HV control.
Fork of muonhunter-K8 by
hvcontrol.cpp@11:5a5f16e09f10, 2019-04-22 (annotated)
- Committer:
- mihaly
- Date:
- Mon Apr 22 14:00:08 2019 +0000
- Revision:
- 11:5a5f16e09f10
- Parent:
- 7:6a0958c2be7e
K8 fimrware 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 | |
OliverKeller | 7:6a0958c2be7e | 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; |
OliverKeller | 7:6a0958c2be7e | 7 | |
OliverKeller | 7:6a0958c2be7e | 8 | int period(int f) { |
OliverKeller | 7:6a0958c2be7e | 9 | double T=0; |
OliverKeller | 7:6a0958c2be7e | 10 | if (f < 1) { |
OliverKeller | 7:6a0958c2be7e | 11 | T = 1; |
OliverKeller | 7:6a0958c2be7e | 12 | } else { |
OliverKeller | 7:6a0958c2be7e | 13 | T = 1000000/f; |
mva111 | 0:52895a475820 | 14 | } |
OliverKeller | 7:6a0958c2be7e | 15 | return (int)(T); |
mva111 | 0:52895a475820 | 16 | } |
OliverKeller | 7:6a0958c2be7e | 17 | |
mva111 | 0:52895a475820 | 18 | int *hvparams; //array is indexed with the frequency |
OliverKeller | 7:6a0958c2be7e | 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; |
OliverKeller | 7:6a0958c2be7e | 31 | } |
OliverKeller | 7:6a0958c2be7e | 32 | |
OliverKeller | 7:6a0958c2be7e | 33 | float from_adc_voltage(float adc_v) { |
OliverKeller | 7:6a0958c2be7e | 34 | return adc_v * divider_value * voltage_ref; |
OliverKeller | 7:6a0958c2be7e | 35 | } |
OliverKeller | 7:6a0958c2be7e | 36 | |
OliverKeller | 7:6a0958c2be7e | 37 | float to_adc_voltage(float voltage_) { |
OliverKeller | 7:6a0958c2be7e | 38 | return voltage_/(divider_value * voltage_ref); |
OliverKeller | 7:6a0958c2be7e | 39 | } |
OliverKeller | 7:6a0958c2be7e | 40 | |
OliverKeller | 7:6a0958c2be7e | 41 | bool measure(void) { |
mva111 | 0:52895a475820 | 42 | AnalogIn probe(measure_pin); |
mva111 | 0:52895a475820 | 43 | voltage = from_adc_voltage(probe.read()); |
OliverKeller | 7:6a0958c2be7e | 44 | if(voltage > thresh) { |
OliverKeller | 7:6a0958c2be7e | 45 | return 0; |
OliverKeller | 7:6a0958c2be7e | 46 | } else { |
OliverKeller | 7:6a0958c2be7e | 47 | return 1; |
mva111 | 0:52895a475820 | 48 | } |
OliverKeller | 7:6a0958c2be7e | 49 | } |
OliverKeller | 7:6a0958c2be7e | 50 | |
OliverKeller | 7:6a0958c2be7e | 51 | void set_frequency(int f) { |
OliverKeller | 7:6a0958c2be7e | 52 | if(f > max_freq) { |
mva111 | 0:52895a475820 | 53 | f = max_freq; |
OliverKeller | 7:6a0958c2be7e | 54 | } |
OliverKeller | 7:6a0958c2be7e | 55 | if(f < min_freq) { |
mva111 | 0:52895a475820 | 56 | f = min_freq; |
OliverKeller | 7:6a0958c2be7e | 57 | } |
mva111 | 0:52895a475820 | 58 | PwmOut pwm(oscillator_pin); |
mva111 | 0:52895a475820 | 59 | int p = period(f); |
mva111 | 0:52895a475820 | 60 | freq = f; |
mva111 | 0:52895a475820 | 61 | pwm.period_us(p); |
mva111 | 0:52895a475820 | 62 | pwm.pulsewidth_us((int)(p/2)); |
OliverKeller | 7:6a0958c2be7e | 63 | } |
OliverKeller | 7:6a0958c2be7e | 64 | |
OliverKeller | 7:6a0958c2be7e | 65 | int freq_to_index(int f) { |
OliverKeller | 7:6a0958c2be7e | 66 | return (f/100)-10; |
OliverKeller | 7:6a0958c2be7e | 67 | } |
OliverKeller | 7:6a0958c2be7e | 68 | |
OliverKeller | 7:6a0958c2be7e | 69 | int index_to_freq(int f) { |
OliverKeller | 7:6a0958c2be7e | 70 | return (f+10)*100; |
OliverKeller | 7:6a0958c2be7e | 71 | } |
OliverKeller | 7:6a0958c2be7e | 72 | |
OliverKeller | 7:6a0958c2be7e | 73 | void calibrate(void) { |
mva111 | 0:52895a475820 | 74 | hvparams = new int[69]; |
mva111 | 0:52895a475820 | 75 | shutdown(); |
OliverKeller | 7:6a0958c2be7e | 76 | for(int f=7800; f>=1000; f-=100) { |
mva111 | 0:52895a475820 | 77 | set_frequency(f); |
mva111 | 0:52895a475820 | 78 | wait(1); |
OliverKeller | 7:6a0958c2be7e | 79 | if(measure()) { |
mva111 | 0:52895a475820 | 80 | hvparams[freq_to_index(f)]=(int)voltage; |
OliverKeller | 7:6a0958c2be7e | 81 | } else { |
OliverKeller | 7:6a0958c2be7e | 82 | shutdown(); |
OliverKeller | 7:6a0958c2be7e | 83 | break; |
mva111 | 0:52895a475820 | 84 | } |
mva111 | 0:52895a475820 | 85 | } |
OliverKeller | 7:6a0958c2be7e | 86 | } |
OliverKeller | 7:6a0958c2be7e | 87 | |
OliverKeller | 7:6a0958c2be7e | 88 | void shutdown(void) { |
mva111 | 0:52895a475820 | 89 | DigitalOut pwm_(oscillator_pin); |
mva111 | 0:52895a475820 | 90 | pwm_.write(1); |
mva111 | 0:52895a475820 | 91 | freq = 0; |
mva111 | 2:66a2e52ad175 | 92 | measure(); |
OliverKeller | 7:6a0958c2be7e | 93 | while(voltage > safe_voltage) { |
mva111 | 2:66a2e52ad175 | 94 | measure(); |
mva111 | 0:52895a475820 | 95 | wait(1); |
mva111 | 0:52895a475820 | 96 | } |
OliverKeller | 7:6a0958c2be7e | 97 | } |
OliverKeller | 7:6a0958c2be7e | 98 | |
OliverKeller | 7:6a0958c2be7e | 99 | float get_voltage(void) { |
mva111 | 2:66a2e52ad175 | 100 | measure(); |
OliverKeller | 7:6a0958c2be7e | 101 | return voltage; |
OliverKeller | 7:6a0958c2be7e | 102 | } |
OliverKeller | 7:6a0958c2be7e | 103 | |
OliverKeller | 7:6a0958c2be7e | 104 | int *get_hvparams(void) { |
OliverKeller | 7:6a0958c2be7e | 105 | return hvparams; |
mva111 | 2:66a2e52ad175 | 106 | } |
OliverKeller | 7:6a0958c2be7e | 107 | |
OliverKeller | 7:6a0958c2be7e | 108 | int get_frequency(void) { |
OliverKeller | 7:6a0958c2be7e | 109 | return freq; |
OliverKeller | 7:6a0958c2be7e | 110 | } |
mva111 | 0:52895a475820 | 111 | }; |