Heater for threaded program
Dependents: LEX_Threaded_Programming_V3
Heater.cpp
- Committer:
- omatthews
- Date:
- 2019-08-30
- Revision:
- 31:7c6f05326c4d
- Parent:
- 30:055d856f05b5
- Child:
- 33:52ab0641f2e6
File content as of revision 31:7c6f05326c4d:
/*------------------------------------------------------------------------------ Library code file for interface to Heater Date: 16/07/2018 ------------------------------------------------------------------------------*/ #include "mbed.h" #include "MODSERIAL.h" #include "Heater.h" #include "ADS8568_ADC.h" Heater::Heater(const int i_port, const int v_port, FastPWM * drive, FastPWM * guard, ADS8568_ADC * adc, DigitalIn adc_busy, const memspcr_ThermalConfiguration & thermal) :thermal(thermal), i_port(i_port), v_port(v_port), drive(drive), guard(guard), adc(adc), adc_busy(adc_busy) { drive->prescaler(1); guard->prescaler(1); drive->period_ticks(1000); guard->period_ticks(1000); } void Heater::read() { //Reads R and then resets the drive back to its previous value int i = 0; double drive_prev = drive->read(); //Store previous value of drive *drive = 1.0f; //Turn the driver on for the measurement wait_us(thermal.adc_settling_time_us); //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 = error * WIND_UP_LIMIT / abs(error);} error_integrated += error; if (error_integrated < 0.0) { error_integrated = 0.0; } } void Heater::update() { //Update PWM from setpoint and resistance double duty_cycle = (double) thermal.pid_kp * (error + error_integrated/thermal.pid_integral_time); if (duty_cycle > PWM_LIMIT) duty_cycle = PWM_LIMIT; drive->write(duty_cycle); guard->write(duty_cycle * thermal.guard_drive_ratio); } void Heater::Set_ref(float R) { R_ref = R; } void Heater::Set_D(float D) { drive->write(D); guard->write(D*thermal.guard_drive_ratio); } int Heater::Get_D() const { return drive->read(); } int Heater::Get_i() const { return curr; } int Heater::Get_v() const { return v; } float Heater::Get_R() const { return R; } float Heater::Get_R_ref() const { return R_ref; } float Heater::Get_error() const { return error; } float Heater::Get_error_integrated() const { return error_integrated; } void Heater::turn_on () { *drive = 1; *guard = thermal.guard_drive_ratio; } void Heater::turn_off () { *drive = 0; *guard = 0; }