MH K8 firmware with HV control.

Dependencies:   mbed NOKIA_5110

Fork of muonhunter-K8 by Oliver Keller

Revision:
0:52895a475820
Child:
2:66a2e52ad175
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hvcontrol.cpp	Tue Oct 04 09:34:20 2016 +0000
@@ -0,0 +1,111 @@
+#include "mbed.h"
+
+class HVControl{
+    
+private:
+    int freq, max_freq, min_freq; // oscillator parameters
+    float voltage_ref, divider_value, voltage, thresh, safe_voltage; //hv probe parameters
+    PinName oscillator_pin, measure_pin;
+    
+    int period(int f){
+    double T=0;
+    if (f < 1){
+        T = 1;
+        }else{
+        T = 1000000/f;
+        }
+    return (int)(T);
+    }
+    
+    float to_adc_voltage(float voltage_){ return voltage_/(divider_value * voltage_ref); }
+    
+    float from_adc_voltage(float adc_v){ return adc_v * divider_value * voltage_ref; }
+
+public:
+    int *hvparams; //array is indexed with the frequency
+    Ticker hvtick;
+    
+    HVControl(PinName oscillator_pin_, PinName measure_pin_) {
+        max_freq = 10000; //default maximum frequency
+        min_freq = 1000; //default minimum frequency
+        divider_value = 304; //default board value
+        voltage_ref = 3.3; //mbed default voltage reference
+        voltage = 0; // actual voltage
+        safe_voltage = 20;
+        thresh = 1000; //default maximum high voltage threshold
+        oscillator_pin = oscillator_pin_;
+        measure_pin = measure_pin_;
+        freq = max_freq;
+        }
+    
+    void control_voltage(void){
+        
+        }
+    void set_voltage(int target_v){
+        float err = 0;
+        if(measure()){
+            
+            }else{
+                shutdown();
+                }
+        
+        }
+    
+    bool measure(void){
+        AnalogIn probe(measure_pin);
+        voltage = from_adc_voltage(probe.read());
+        if(voltage > thresh){ return 0; }
+            else{ return 1; }
+        }
+    
+    void set_frequency(int f){
+        if(f > max_freq){
+            f = max_freq;
+            }
+        if(f < min_freq){
+            f = min_freq;
+            }
+        PwmOut pwm(oscillator_pin);
+        int p = period(f);
+        freq = f;
+        pwm.period_us(p);
+        pwm.pulsewidth_us((int)(p/2));
+        }
+    
+    int freq_to_index(int f){ return (f/100)-10; }
+    
+    int index_to_freq(int f){ return (f+10)*100; }
+        
+    void calibrate(void){
+        hvparams = new int[69];
+        shutdown();
+        for(int f=7800; f>=1000; f-=100){
+            set_frequency(f);
+            wait(1);
+            if(measure()){
+                hvparams[freq_to_index(f)]=(int)voltage;
+                }else{
+                    shutdown();
+                    break;
+                    }
+            }
+        }
+    
+    void shutdown(void){
+        DigitalOut pwm_(oscillator_pin);
+        pwm_.write(1);
+        freq = 0;
+        bool m;
+        m = measure();
+        while(voltage > safe_voltage){
+            m = measure();
+            wait(1);
+            }
+        }
+    
+    float get_voltage(void){ return voltage; }
+        
+    int *get_hvparams(void){ return hvparams; }
+    
+    int get_frequency(void){ return freq; }
+};
\ No newline at end of file