
PIDHeater82
Dependencies: PID mbed millis ttmath
Fork of PIDHeater by
PIDHeater.cpp@1:b852d582ad0e, 2016-01-27 (annotated)
- Committer:
- unix_guru
- Date:
- Wed Jan 27 21:32:34 2016 +0000
- Revision:
- 1:b852d582ad0e
- Parent:
- 0:8b77aea74642
Minor updated to comply with Brett Beauregard's Arduino PID library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
unix_guru | 0:8b77aea74642 | 1 | #include "PIDHeater.h" |
unix_guru | 0:8b77aea74642 | 2 | |
unix_guru | 0:8b77aea74642 | 3 | PID controller(DEFAULT_Kp , DEFAULT_Ki , DEFAULT_Kd , 0.1); // Initialize PID controller -- Kc, Ti, Td, interval |
unix_guru | 0:8b77aea74642 | 4 | |
unix_guru | 0:8b77aea74642 | 5 | |
unix_guru | 0:8b77aea74642 | 6 | PIDHeater::PIDHeater(PinName sensorPin, PinName pwmoutPin): thermistor(sensorPin), driver(pwmoutPin) { |
unix_guru | 0:8b77aea74642 | 7 | |
unix_guru | 0:8b77aea74642 | 8 | heaterOn = false; |
unix_guru | 0:8b77aea74642 | 9 | controller.setInputLimits(0, 250); // MIN/MAX Temperature values |
unix_guru | 0:8b77aea74642 | 10 | controller.setOutputLimits(0.0, 1.0); // Pwm output from 0.0 to 1.0 |
unix_guru | 0:8b77aea74642 | 11 | // controller.setMode(AUTO); |
unix_guru | 0:8b77aea74642 | 12 | controller.setSetPoint(22); // Set initial Temperature to 22 degrees celcius |
unix_guru | 0:8b77aea74642 | 13 | } |
unix_guru | 0:8b77aea74642 | 14 | |
unix_guru | 0:8b77aea74642 | 15 | void PIDHeater::configureRange(float minTemperature, float maxTemperature) { |
unix_guru | 0:8b77aea74642 | 16 | if (minTemperature < maxTemperature) { |
unix_guru | 0:8b77aea74642 | 17 | minTemp = minTemperature; |
unix_guru | 0:8b77aea74642 | 18 | maxTemp = maxTemperature; |
unix_guru | 0:8b77aea74642 | 19 | controller.setInputLimits(minTemperature, maxTemperature); // MIN/MAX Temperature values |
unix_guru | 0:8b77aea74642 | 20 | } |
unix_guru | 0:8b77aea74642 | 21 | } |
unix_guru | 0:8b77aea74642 | 22 | |
unix_guru | 0:8b77aea74642 | 23 | float PIDHeater::getTemperature() { |
unix_guru | 0:8b77aea74642 | 24 | #define THERMISTORNOMINAL 100000 // 100k |
unix_guru | 0:8b77aea74642 | 25 | // temp. for nominal resistance (almost always 25 C) |
unix_guru | 0:8b77aea74642 | 26 | #define TEMPERATURENOMINAL 25 |
unix_guru | 0:8b77aea74642 | 27 | // The beta coefficient of the thermistor (usually 3000-4000) |
unix_guru | 0:8b77aea74642 | 28 | #define BCOEFFICIENT 3950 |
unix_guru | 0:8b77aea74642 | 29 | // the value of the 'other' resistor |
unix_guru | 0:8b77aea74642 | 30 | #define SERIESRESISTOR 4700 |
unix_guru | 0:8b77aea74642 | 31 | |
unix_guru | 0:8b77aea74642 | 32 | // This is the workhorse routine that calculates the temperature |
unix_guru | 0:8b77aea74642 | 33 | // using the Steinhart-Hart equation for thermistors |
unix_guru | 0:8b77aea74642 | 34 | // https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation |
unix_guru | 0:8b77aea74642 | 35 | |
unix_guru | 0:8b77aea74642 | 36 | float temperature, resistance; |
unix_guru | 0:8b77aea74642 | 37 | float steinhart; |
unix_guru | 0:8b77aea74642 | 38 | int a; |
unix_guru | 0:8b77aea74642 | 39 | |
unix_guru | 0:8b77aea74642 | 40 | a = thermistor.read_u16(); // Read 16bit Analog value |
unix_guru | 0:8b77aea74642 | 41 | // pc.printf("Raw Analog Value for Thermistor = %d\r\n",a); |
unix_guru | 0:8b77aea74642 | 42 | |
unix_guru | 0:8b77aea74642 | 43 | /* Calculate the resistance of the thermistor from analog votage read. */ |
unix_guru | 0:8b77aea74642 | 44 | resistance = (float) SERIESRESISTOR / ((65536.0 / a) - 1); |
unix_guru | 0:8b77aea74642 | 45 | // pc.printf("Resistance for Thermistor = %f\r\n",resistance); |
unix_guru | 0:8b77aea74642 | 46 | |
unix_guru | 0:8b77aea74642 | 47 | steinhart = resistance / THERMISTORNOMINAL; // (R/Ro) |
unix_guru | 0:8b77aea74642 | 48 | steinhart = log(steinhart); // ln(R/Ro) |
unix_guru | 0:8b77aea74642 | 49 | steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) |
unix_guru | 0:8b77aea74642 | 50 | steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) |
unix_guru | 0:8b77aea74642 | 51 | steinhart = 1.0 / steinhart; // Invert |
unix_guru | 0:8b77aea74642 | 52 | temperature = steinhart - 273.15; // convert to C |
unix_guru | 0:8b77aea74642 | 53 | |
unix_guru | 0:8b77aea74642 | 54 | return temperature; |
unix_guru | 0:8b77aea74642 | 55 | |
unix_guru | 0:8b77aea74642 | 56 | } |
unix_guru | 0:8b77aea74642 | 57 | |
unix_guru | 0:8b77aea74642 | 58 | bool PIDHeater::isHeaterOn() { |
unix_guru | 0:8b77aea74642 | 59 | return heaterOn; |
unix_guru | 0:8b77aea74642 | 60 | } |
unix_guru | 0:8b77aea74642 | 61 | |
unix_guru | 0:8b77aea74642 | 62 | void PIDHeater::run() { |
unix_guru | 0:8b77aea74642 | 63 | getTemperature(); |
unix_guru | 1:b852d582ad0e | 64 | driver = controller.compute(); |
unix_guru | 0:8b77aea74642 | 65 | } |
unix_guru | 0:8b77aea74642 | 66 | |
unix_guru | 0:8b77aea74642 | 67 | |
unix_guru | 0:8b77aea74642 | 68 | void PIDHeater::setTemperature(float temp) { |
unix_guru | 0:8b77aea74642 | 69 | if (temp >= minTemp && temp <= maxTemp) { |
unix_guru | 0:8b77aea74642 | 70 | desiredTemp = temp; |
unix_guru | 0:8b77aea74642 | 71 | controller.setSetPoint(desiredTemp); // Set desired temperature in celcius |
unix_guru | 0:8b77aea74642 | 72 | } |
unix_guru | 0:8b77aea74642 | 73 | } |
unix_guru | 0:8b77aea74642 | 74 | |
unix_guru | 0:8b77aea74642 | 75 |