Origin firmware.

Dependencies:   PID QEI SB1602E mbed-rtos mbed

Fork of PreHeater by Kazu Zamasu

Committer:
kazu_zamasu
Date:
Sat Jun 13 06:34:11 2015 +0000
Revision:
2:387240c58110
Parent:
1:f974481c37b6
Child:
3:9af1bd67c5f8
???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kazu_zamasu 0:b1d44d6f9adf 1 #include "mbed.h"
kazu_zamasu 0:b1d44d6f9adf 2 #include "PID.h"
kazu_zamasu 0:b1d44d6f9adf 3 #include "QEI.h"
kazu_zamasu 0:b1d44d6f9adf 4 #include "rtos.h"
kazu_zamasu 0:b1d44d6f9adf 5 #include "math.h"
kazu_zamasu 2:387240c58110 6 #include "SB1602E.h"
kazu_zamasu 0:b1d44d6f9adf 7
kazu_zamasu 0:b1d44d6f9adf 8 #define ROTATE_PER_REVOLUTIONS 24 //QEI 1 rotate by count
kazu_zamasu 0:b1d44d6f9adf 9 #define THR 560 /PTH pull up register value
kazu_zamasu 0:b1d44d6f9adf 10 #define THB 3380 //PTH B number
kazu_zamasu 0:b1d44d6f9adf 11 #define THCR 10000 //25C PTH register
kazu_zamasu 0:b1d44d6f9adf 12 #define OV_LL 0.0 //PID calcurate output value 0.0 = 0%
kazu_zamasu 0:b1d44d6f9adf 13 #define OV_HL 1.0 //PID calcurate output value 1.0 = 100%
kazu_zamasu 0:b1d44d6f9adf 14 #define SV_LL 0.0 //PID setpoint % value for lo limit
kazu_zamasu 0:b1d44d6f9adf 15 #define SV_HL 100.0 //PID setpoint % value for high limit
kazu_zamasu 1:f974481c37b6 16 #define P 1.0 //propotional band
kazu_zamasu 1:f974481c37b6 17 #define I 0.2 //Integral
kazu_zamasu 1:f974481c37b6 18 #define D 0.1 //Devide
kazu_zamasu 1:f974481c37b6 19 #define RATE 0.1 //update time sec
kazu_zamasu 1:f974481c37b6 20 #define Bias 0.2 //control output bias
kazu_zamasu 0:b1d44d6f9adf 21 #define InitialSP 50.0 // PID initial setpoint
kazu_zamasu 1:f974481c37b6 22 #define RangeSPL 30.0 //calcurate celcius range
kazu_zamasu 1:f974481c37b6 23 #define RangeSPH 120.0 //same above
kazu_zamasu 0:b1d44d6f9adf 24
kazu_zamasu 0:b1d44d6f9adf 25 //Kc, Ti, Td, interval
kazu_zamasu 0:b1d44d6f9adf 26 PID TIC(P, I, D, RATE);
kazu_zamasu 0:b1d44d6f9adf 27
kazu_zamasu 1:f974481c37b6 28 //GPIO initilaize
kazu_zamasu 0:b1d44d6f9adf 29 AnalogIn THAI(dp4);
kazu_zamasu 0:b1d44d6f9adf 30 PwmOut out(dp1);
kazu_zamasu 0:b1d44d6f9adf 31 DigitalOut led1(dp14),led2(dp28);
kazu_zamasu 0:b1d44d6f9adf 32 DigitalIn Run(dp17,PullUp);
kazu_zamasu 1:f974481c37b6 33
kazu_zamasu 2:387240c58110 34 float temp_sv_input;
kazu_zamasu 2:387240c58110 35 double temp_pv,temp_cal;
kazu_zamasu 2:387240c58110 36 char *init_massage = "Welcome!";
kazu_zamasu 2:387240c58110 37
kazu_zamasu 2:387240c58110 38 //init_massage = 'Hello';
kazu_zamasu 1:f974481c37b6 39 //Rotary encode pin, pinmode and sppecification instance
kazu_zamasu 1:f974481c37b6 40 QEI wheel(dp11, PullUp, dp13, PullUp,NC, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING);
kazu_zamasu 2:387240c58110 41 //LCD I2C pin asign
kazu_zamasu 2:387240c58110 42 SB1602E lcd(dp5, dp27, init_massage); // SDA, SCL
kazu_zamasu 1:f974481c37b6 43
kazu_zamasu 2:387240c58110 44
kazu_zamasu 0:b1d44d6f9adf 45
kazu_zamasu 1:f974481c37b6 46 void TempCal_thread(void const *args) {
kazu_zamasu 0:b1d44d6f9adf 47 while (true) {
kazu_zamasu 0:b1d44d6f9adf 48 //input for change to 0 to 100% range by 50C to 120C
kazu_zamasu 0:b1d44d6f9adf 49 temp_sv_input = wheel.getPulses() * 0.5 + RangeSPL;
kazu_zamasu 0:b1d44d6f9adf 50 if (temp_sv_input <= RangeSPL){
kazu_zamasu 0:b1d44d6f9adf 51 temp_sv_input = RangeSPL;
kazu_zamasu 1:f974481c37b6 52 }
kazu_zamasu 0:b1d44d6f9adf 53 else if (temp_sv_input >= RangeSPH){
kazu_zamasu 0:b1d44d6f9adf 54 temp_sv_input = RangeSPH;
kazu_zamasu 0:b1d44d6f9adf 55 }
kazu_zamasu 0:b1d44d6f9adf 56 temp_cal = THAI.read();
kazu_zamasu 0:b1d44d6f9adf 57 //six order polynomial
kazu_zamasu 0:b1d44d6f9adf 58 temp_pv =-0.7964*pow(temp_cal,6.0) - 2.5431*pow(temp_cal,5.0) +63.605*pow(temp_cal,4.0) - 274.1*pow(temp_cal,3.0) + 522.57*pow(temp_cal,2.0) - 539.26*temp_cal + 405.76;
kazu_zamasu 1:f974481c37b6 59 Thread::wait(500);
kazu_zamasu 0:b1d44d6f9adf 60
kazu_zamasu 1:f974481c37b6 61
kazu_zamasu 1:f974481c37b6 62 //Insert LCD code
kazu_zamasu 2:387240c58110 63 lcd.printf(0, "Temp SP %.1f\n", temp_sv_input);
kazu_zamasu 2:387240c58110 64 lcd.printf(1, "Temp PV %.1f\n", temp_pv);
kazu_zamasu 1:f974481c37b6 65 }
kazu_zamasu 1:f974481c37b6 66 }
kazu_zamasu 1:f974481c37b6 67
kazu_zamasu 1:f974481c37b6 68 int main(){
kazu_zamasu 1:f974481c37b6 69 Thread thread(TempCal_thread);
kazu_zamasu 1:f974481c37b6 70 while (1){
kazu_zamasu 0:b1d44d6f9adf 71 //Analog input from 50.0C to 120.0C
kazu_zamasu 0:b1d44d6f9adf 72 TIC.setInputLimits(SV_LL, SV_HL);
kazu_zamasu 0:b1d44d6f9adf 73 //Pwm output from 0.0 to 1.0
kazu_zamasu 0:b1d44d6f9adf 74 TIC.setOutputLimits(OV_LL, OV_HL);
kazu_zamasu 0:b1d44d6f9adf 75 //If there's a bias.
kazu_zamasu 0:b1d44d6f9adf 76 TIC.setBias(Bias);
kazu_zamasu 0:b1d44d6f9adf 77 TIC.setMode(Run);
kazu_zamasu 0:b1d44d6f9adf 78 //We want the process variable to be 1.7V
kazu_zamasu 0:b1d44d6f9adf 79 TIC.setSetPoint(temp_sv_input);
kazu_zamasu 0:b1d44d6f9adf 80
kazu_zamasu 1:f974481c37b6 81 if (Run == 1){
kazu_zamasu 1:f974481c37b6 82 out = OV_LL;
kazu_zamasu 1:f974481c37b6 83 }
kazu_zamasu 1:f974481c37b6 84 else if (Run == 0){
kazu_zamasu 0:b1d44d6f9adf 85 //Update the process variable.
kazu_zamasu 0:b1d44d6f9adf 86 TIC.setProcessValue(temp_cal);
kazu_zamasu 0:b1d44d6f9adf 87 //Set the new output.
kazu_zamasu 0:b1d44d6f9adf 88 out = TIC.compute();
kazu_zamasu 2:387240c58110 89 }
kazu_zamasu 0:b1d44d6f9adf 90 //Wait for another loop calculation.
kazu_zamasu 1:f974481c37b6 91 Thread::wait(RATE);
kazu_zamasu 1:f974481c37b6 92 }
kazu_zamasu 1:f974481c37b6 93 }