Heater for threaded program
Dependents: LEX_Threaded_Programming
Heater.cpp
- Committer:
- omatthews
- Date:
- 2019-08-19
- Revision:
- 25:09a315a59956
- Parent:
- 23:947850bbf325
- Child:
- 26:f6c98b05ee85
File content as of revision 25:09a315a59956:
/*------------------------------------------------------------------------------ Library code file for interface to Heater Date: 16/07/2018 ------------------------------------------------------------------------------*/ #include "mbed.h" #include "MODSERIAL.h" #include "Heater.h" #include "ADS8568_ADC.h" extern ADS8568_ADC adc; extern Timer timer; extern DigitalIn adc_busy; extern MODSERIAL pc; extern DigitalOut led_0; Heater::Heater(const int i_port, const int v_port, FastPWM * drive, FastPWM * guard, const float corr_grad, const float corr_int, float R_ref) :R_ref(R_ref),i_port(i_port),v_port(v_port),drive(drive),guard(guard),corr_grad(corr_grad),corr_int(corr_int) {} void Heater::output()const { //Prints the current state to the terminal pc.printf("%d,%f,%f,%f,%f,%f\n",timer.read_ms(),R_ref,R,error,error_integrated,drive->read()); } void Heater::read() { //Reads R and then resets the drive back to its previous value int i = 0; //float error_prev = error; double drive_prev = drive->read(); //Store previous value of drive *drive = 1.0f; //Turn the driver on for the measurement wait_us(MEAS_DELAY); //Wait for ADC to settle adc.start_conversion(15); //Incremental back off until ADC is free while(adc_busy == 1) { wait_us(1); i++; } drive->write(0); //Reset the duty cycle back to what it was //Get voltage, current and R values from the ADC conversion adc.read_channels(); curr = adc.read_channel_result(i_port); v = adc.read_channel_result(v_port); if (curr > 0) {R = (float)v/curr;} //Avoid dividing by 0 //Get error values error = R_ref - R; //Only allow positive integrated errors and limit change in integrated error //to help avoid integral windup if (abs(error) < WIND_UP_LIMIT) {error_integrated += error;} if (error_integrated < 0.0) {error_integrated = 0.0;} } void Heater::update() { //Update PWM from setpoint and resistance read(); drive->write((double) (Kp * (error + error_integrated/Ti))); guard->write((double) (Kp * GUARD_PWM_RATIO * (error + error_integrated/Ti))); log_count++; if (log_count >= LOG_LIM) { log_count = 0; output(); } } void Heater::Set_ref(float R) { R_ref = R; } void Heater::Set_D(float D) { drive->write(D); guard->write(D*GUARD_PWM_RATIO); } int Heater::Get_i() const {return curr;} int Heater::Get_v() const {return v;} float Heater::Get_R() const {return R;} void Heater::turn_on () { *drive = 1; *guard = GUARD_PWM_RATIO; } void Heater::turn_off () { *drive = 0; *guard = 0; }