PIDHeater82

Dependencies:   PID mbed millis ttmath

Fork of PIDHeater by FRDM-K64F Code Share

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?

UserRevisionLine numberNew 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