Heater for threaded program

Dependents:   LEX_Threaded_Programming

Committer:
omatthews
Date:
Tue Jul 23 08:04:51 2019 +0000
Revision:
11:785a0329f802
Parent:
10:0e16d8430d66
Child:
12:8a048f111140
Child:
13:8629d78fd93b
Working before PWM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
omatthews 0:4e33cc8171f4 1 /*------------------------------------------------------------------------------
omatthews 0:4e33cc8171f4 2 Library code file for interface to Heater
omatthews 0:4e33cc8171f4 3 Date: 16/07/2018
omatthews 0:4e33cc8171f4 4
omatthews 0:4e33cc8171f4 5
omatthews 0:4e33cc8171f4 6 ------------------------------------------------------------------------------*/
omatthews 1:4435d407d827 7 #include "mbed.h"
omatthews 1:4435d407d827 8 #include "MODSERIAL.h"
omatthews 0:4e33cc8171f4 9 #include "Heater.h"
omatthews 0:4e33cc8171f4 10 #include "ADS8568_ADC.h"
omatthews 0:4e33cc8171f4 11
omatthews 0:4e33cc8171f4 12 extern ADS8568_ADC adc;
omatthews 0:4e33cc8171f4 13 extern float scale_factors[8];
omatthews 0:4e33cc8171f4 14 extern Timer timer;
omatthews 1:4435d407d827 15 extern DigitalIn adc_busy;
omatthews 1:4435d407d827 16 extern MODSERIAL pc;
omatthews 11:785a0329f802 17 extern int log_count;
omatthews 11:785a0329f802 18 extern float R_avg;
omatthews 1:4435d407d827 19
omatthews 0:4e33cc8171f4 20
omatthews 0:4e33cc8171f4 21
omatthews 8:5da71ae16115 22 Heater::Heater(int i_port, int v_port, DigitalOut drive, float corr_grad, float corr_int, float R_ref)
omatthews 8:5da71ae16115 23 :R_ref(R_ref),i_port(i_port),v_port(v_port),drive(drive),corr_grad(corr_grad),corr_int(corr_int) {}
omatthews 7:59ece353eea2 24
omatthews 7:59ece353eea2 25 float Heater::R_to_T(float R) {return R*corr_grad + corr_int;}
omatthews 7:59ece353eea2 26 float Heater::T_to_R(float T) {return (T - corr_int)/corr_grad;}
omatthews 0:4e33cc8171f4 27
omatthews 11:785a0329f802 28 void Heater::output()
omatthews 11:785a0329f802 29 {
omatthews 11:785a0329f802 30 pc.printf("%d,%f,%f\n",timer.read_ms(),R_to_T(R),R);
omatthews 11:785a0329f802 31 }
omatthews 0:4e33cc8171f4 32
omatthews 2:7f15386fcc90 33 void Heater::read()
omatthews 0:4e33cc8171f4 34 {
omatthews 1:4435d407d827 35 //Reads R and then resets the drive back to its previous value
omatthews 1:4435d407d827 36 int i = 0;
omatthews 11:785a0329f802 37
omatthews 10:0e16d8430d66 38 int drive_prev = drive; //Store previous value of drive
omatthews 8:5da71ae16115 39 drive = 1;
omatthews 7:59ece353eea2 40 wait_us(MEAS_DELAY); //Wait for ADC to settle
omatthews 1:4435d407d827 41 adc.start_conversion(ALL_CH);
omatthews 1:4435d407d827 42 while(adc_busy == 1)
omatthews 1:4435d407d827 43 {
omatthews 1:4435d407d827 44 wait_us(1);
omatthews 1:4435d407d827 45 i++;
omatthews 1:4435d407d827 46 }
omatthews 10:0e16d8430d66 47 drive = drive_prev;
omatthews 0:4e33cc8171f4 48 adc.read_channels();
omatthews 10:0e16d8430d66 49
omatthews 8:5da71ae16115 50
omatthews 8:5da71ae16115 51 //pc.printf("conversion took %d us\n", i );
omatthews 7:59ece353eea2 52 //i=0;
omatthews 1:4435d407d827 53
omatthews 7:59ece353eea2 54 curr = adc.read_channel_result(i_port);
omatthews 7:59ece353eea2 55 v = adc.read_channel_result(v_port);
omatthews 7:59ece353eea2 56 if (v<0) {pc.printf("v is %d",v);}
omatthews 8:5da71ae16115 57 //if (curr > 0) {R = (float)v/curr;} //Avoid dividing by 0
omatthews 8:5da71ae16115 58 R = (float)v/curr;
omatthews 11:785a0329f802 59 log_count++;
omatthews 11:785a0329f802 60 if (log_count > 0)
omatthews 11:785a0329f802 61 {
omatthews 11:785a0329f802 62 log_count = 0;
omatthews 11:785a0329f802 63 output();
omatthews 11:785a0329f802 64 }
omatthews 0:4e33cc8171f4 65 }
omatthews 0:4e33cc8171f4 66
omatthews 2:7f15386fcc90 67
omatthews 2:7f15386fcc90 68
omatthews 2:7f15386fcc90 69
omatthews 0:4e33cc8171f4 70 void Heater::hold(int hold_time)
omatthews 0:4e33cc8171f4 71 {
omatthews 7:59ece353eea2 72 //Holds the heater at R_ref for the given hold time
omatthews 7:59ece353eea2 73 // in: int hold_time - is the time in ms to hold the reference
omatthews 7:59ece353eea2 74
omatthews 0:4e33cc8171f4 75 int end_time = timer.read_ms() + hold_time;
omatthews 1:4435d407d827 76 while (timer.read_ms() < end_time)
omatthews 0:4e33cc8171f4 77 {
omatthews 2:7f15386fcc90 78 read();
omatthews 11:785a0329f802 79 R_avg = (((N_ROLL_AVG - 1) * R_avg) + R)/N_ROLL_AVG;
omatthews 11:785a0329f802 80 if (R_avg > R_ref)
omatthews 0:4e33cc8171f4 81 {
omatthews 8:5da71ae16115 82 drive = 0;
omatthews 11:785a0329f802 83 wait_ms(5); //Minimum duty cycle of 10%
omatthews 0:4e33cc8171f4 84 }
omatthews 10:0e16d8430d66 85 else
omatthews 10:0e16d8430d66 86 {
omatthews 10:0e16d8430d66 87 drive = 1;
omatthews 11:785a0329f802 88 wait_ms(5);
omatthews 10:0e16d8430d66 89 }
omatthews 8:5da71ae16115 90
omatthews 0:4e33cc8171f4 91 }
omatthews 1:4435d407d827 92 }
omatthews 1:4435d407d827 93
omatthews 0:4e33cc8171f4 94
omatthews 7:59ece353eea2 95 void Heater::ramp_R(int ramp_time, float R_final, float R_start)
omatthews 7:59ece353eea2 96 {
omatthews 8:5da71ae16115 97 int time = timer.read_ms();
omatthews 8:5da71ae16115 98 int start_time = time;
omatthews 7:59ece353eea2 99 int end_time = start_time + ramp_time;
omatthews 7:59ece353eea2 100 float ramp_rate = (R_final - R_start)/ramp_time;
omatthews 7:59ece353eea2 101
omatthews 8:5da71ae16115 102 while (time < end_time)
omatthews 7:59ece353eea2 103 {
omatthews 8:5da71ae16115 104 Set_R_ref(R_start + ramp_rate * (time - start_time));
omatthews 7:59ece353eea2 105 hold(1);
omatthews 8:5da71ae16115 106 time = timer.read_ms();
omatthews 7:59ece353eea2 107 }
omatthews 8:5da71ae16115 108
omatthews 7:59ece353eea2 109 }
omatthews 7:59ece353eea2 110
omatthews 7:59ece353eea2 111 void Heater::ramp_T(int ramp_time, float T_final, float T_start)
omatthews 7:59ece353eea2 112 {
omatthews 7:59ece353eea2 113 ramp_R(ramp_time, T_to_R(T_final), T_to_R(T_start));
omatthews 7:59ece353eea2 114 }
omatthews 7:59ece353eea2 115 void Heater::Set_R_ref(float R) {R_ref = R;}
omatthews 7:59ece353eea2 116 void Heater::Set_T_ref(float T_ref) {R_ref = T_to_R(T_ref);}
omatthews 0:4e33cc8171f4 117
omatthews 2:7f15386fcc90 118 int Heater::Get_i() {return curr;}
omatthews 2:7f15386fcc90 119 int Heater::Get_v() {return v;}
omatthews 2:7f15386fcc90 120
omatthews 0:4e33cc8171f4 121 float Heater::Get_R() {return R;}
omatthews 7:59ece353eea2 122 float Heater::Get_T() {return R_to_T(R);}
omatthews 0:4e33cc8171f4 123
omatthews 8:5da71ae16115 124 void Heater::turn_on () {drive = 1;}
omatthews 1:4435d407d827 125
omatthews 8:5da71ae16115 126 void Heater::turn_off () {drive = 0;}