Heater for threaded program

Dependents:   LEX_Threaded_Programming

Committer:
omatthews
Date:
Wed Jul 24 14:29:44 2019 +0000
Revision:
16:cd837b230b09
Parent:
15:e7838491c104
Child:
17:0bfed0e96927
Works quite well - needed to pass by pointer to change duty cycle!

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 16:cd837b230b09 22 Heater::Heater(int i_port, int v_port, PwmOut * 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 16:cd837b230b09 30 pc.printf("%d,%f,%f,%f,%f\n",timer.read_ms(),R_ref,R,R_avg,drive->read());
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 16:cd837b230b09 38 float drive_prev = drive->read(); //Store previous value of drive
omatthews 16:cd837b230b09 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 16:cd837b230b09 47 drive->write(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 12:8a048f111140 59 R_avg = (((N_ROLL_AVG - 1) * R_avg) + R)/N_ROLL_AVG;
omatthews 12:8a048f111140 60
omatthews 14:f266bf960b8d 61 error = R_ref - R_avg;
omatthews 14:f266bf960b8d 62
omatthews 14:f266bf960b8d 63 //Avoid integral windup by limiting error past actuation saturation (actuator does saturate for any negative error, but to ensure integrated error can decrease, the limit has been set to the negative of the positive limit
omatthews 14:f266bf960b8d 64 if (error*Kd > 1) {error = 1/Kd;}
omatthews 14:f266bf960b8d 65 else if (error*Kd < -1) {error = -1/Kd;}
omatthews 14:f266bf960b8d 66
omatthews 14:f266bf960b8d 67
omatthews 12:8a048f111140 68 error_integrated += error;
omatthews 12:8a048f111140 69
omatthews 11:785a0329f802 70 log_count++;
omatthews 14:f266bf960b8d 71 if (log_count > 50)
omatthews 11:785a0329f802 72 {
omatthews 11:785a0329f802 73 log_count = 0;
omatthews 11:785a0329f802 74 output();
omatthews 11:785a0329f802 75 }
omatthews 0:4e33cc8171f4 76 }
omatthews 0:4e33cc8171f4 77
omatthews 2:7f15386fcc90 78
omatthews 2:7f15386fcc90 79
omatthews 2:7f15386fcc90 80
omatthews 0:4e33cc8171f4 81 void Heater::hold(int hold_time)
omatthews 0:4e33cc8171f4 82 {
omatthews 7:59ece353eea2 83 //Holds the heater at R_ref for the given hold time
omatthews 7:59ece353eea2 84 // in: int hold_time - is the time in ms to hold the reference
omatthews 7:59ece353eea2 85
omatthews 0:4e33cc8171f4 86 int end_time = timer.read_ms() + hold_time;
omatthews 1:4435d407d827 87 while (timer.read_ms() < end_time)
omatthews 0:4e33cc8171f4 88 {
omatthews 2:7f15386fcc90 89 read();
omatthews 12:8a048f111140 90
omatthews 16:cd837b230b09 91 drive->write(Kd * error + Ki * error_integrated);
omatthews 12:8a048f111140 92 wait_ms(WAIT_DELAY); //Minimum duty cycle of 1%
omatthews 14:f266bf960b8d 93 //pc.printf("%f,%f,%f\n",error,error_integrated,drive.read());
omatthews 12:8a048f111140 94
omatthews 8:5da71ae16115 95
omatthews 0:4e33cc8171f4 96 }
omatthews 1:4435d407d827 97 }
omatthews 1:4435d407d827 98
omatthews 0:4e33cc8171f4 99
omatthews 7:59ece353eea2 100 void Heater::ramp_R(int ramp_time, float R_final, float R_start)
omatthews 7:59ece353eea2 101 {
omatthews 8:5da71ae16115 102 int time = timer.read_ms();
omatthews 8:5da71ae16115 103 int start_time = time;
omatthews 7:59ece353eea2 104 int end_time = start_time + ramp_time;
omatthews 7:59ece353eea2 105 float ramp_rate = (R_final - R_start)/ramp_time;
omatthews 7:59ece353eea2 106
omatthews 8:5da71ae16115 107 while (time < end_time)
omatthews 7:59ece353eea2 108 {
omatthews 8:5da71ae16115 109 Set_R_ref(R_start + ramp_rate * (time - start_time));
omatthews 7:59ece353eea2 110 hold(1);
omatthews 8:5da71ae16115 111 time = timer.read_ms();
omatthews 7:59ece353eea2 112 }
omatthews 8:5da71ae16115 113
omatthews 7:59ece353eea2 114 }
omatthews 7:59ece353eea2 115
omatthews 7:59ece353eea2 116 void Heater::ramp_T(int ramp_time, float T_final, float T_start)
omatthews 7:59ece353eea2 117 {
omatthews 7:59ece353eea2 118 ramp_R(ramp_time, T_to_R(T_final), T_to_R(T_start));
omatthews 7:59ece353eea2 119 }
omatthews 7:59ece353eea2 120 void Heater::Set_R_ref(float R) {R_ref = R;}
omatthews 7:59ece353eea2 121 void Heater::Set_T_ref(float T_ref) {R_ref = T_to_R(T_ref);}
omatthews 16:cd837b230b09 122
omatthews 16:cd837b230b09 123 void Heater::Set_D(float D) {drive->write(D);}
omatthews 0:4e33cc8171f4 124
omatthews 2:7f15386fcc90 125 int Heater::Get_i() {return curr;}
omatthews 2:7f15386fcc90 126 int Heater::Get_v() {return v;}
omatthews 2:7f15386fcc90 127
omatthews 0:4e33cc8171f4 128 float Heater::Get_R() {return R;}
omatthews 7:59ece353eea2 129 float Heater::Get_T() {return R_to_T(R);}
omatthews 0:4e33cc8171f4 130
omatthews 16:cd837b230b09 131 void Heater::turn_on () {*drive = 1;}
omatthews 1:4435d407d827 132
omatthews 16:cd837b230b09 133 void Heater::turn_off () {*drive = 0;}