experimental fork

Dependencies:   NOKIA_5110 mbed

Committer:
OliverKeller
Date:
Wed Dec 21 15:34:09 2016 +0000
Revision:
7:6a0958c2be7e
Parent:
4:87037e41c888
added nokia display, disabled queue (save quite some flash space)

Who changed what in which revision?

UserRevisionLine numberNew 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 };