Heater files
Dependents: LEX-Demo-Firmware-Logging LEX-Demo-Firmware-Logging
Heater.cpp@16:cd837b230b09, 2019-07-24 (annotated)
- 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?
User | Revision | Line number | New 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;} |