Origin firmware.
Dependencies: PID QEI SB1602E mbed-rtos mbed
Fork of PreHeater by
Diff: main.cpp
- Revision:
- 5:bfbc802f4958
- Parent:
- 4:143b93e499a3
- Child:
- 6:704706b288b4
--- a/main.cpp Sun Jun 14 07:04:07 2015 +0000 +++ b/main.cpp Fri Jul 03 11:19:56 2015 +0000 @@ -22,115 +22,133 @@ */ + #include "mbed.h" #include "PID.h" -#include "QEI.h" -#include "rtos.h" #include "math.h" #include "SB1602E.h" - -/* PID constant initialize Kc, Ti, Td, interval */ -#define P 1.0 //propotional band -#define I 0.2 //Integral -#define D 0.1 //Devide -#define RATE 0.1 //update time sec -PID TIC(P, I, D, RATE); - +#include "QEI.h" +#include "rtos.h" //GPIO initilaize AnalogIn THAI(dp4); PwmOut out(dp1); -DigitalOut led1(dp14),led2(dp28); -DigitalIn Run(dp17,PullDown); - -/*Power on first setpoint temperature */ -#define InitialSP 50.0 // PID initial setpoint -float temp_sv_input = InitialSP; - -double temp_pv,temp_cal; -char *init_massage = "Welcome!"; +DigitalOut ledR(dp28),ledG(dp26),ledB(dp14); +InterruptIn RunPB(dp13); +Serial pc(dp16, dp15); // tx, rx -/*Rotary encode pin, pinmode and specification initialize */ -#define ROTATE_PER_REVOLUTIONS 24 //QEI 1 rotate by count -QEI wheel(dp11, PullUp, dp13, PullUp,NC, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING); +/* PID constant initialize Kc, Ti, Td, interval */ +#define P 0.1 //propotional band +#define I 1.5 //Integral +#define D 1.0 //Devide +#define RATE 0.1 //update time sec +#define InitialSP 30.0 // Boot Setpoint initial temeprature +PID TIC(P, I, D, RATE); /*LCD I2C pin initialize */ +char *init_massage = "Hello!"; SB1602E lcd(dp5, dp27, init_massage); // SDA, SCL +/*QEI initialize */ +#define ROTATE_PER_REVOLUTIONS 24 +QEI wheel(dp17, dp18, NC, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING); +//Initial +float temp_sv_input = InitialSP, waittime,OV_LL,ticout,qei,Bias; +bool Run(false); +double temp_pv,temp_cal; +int rtostime; -void TempCal_thread(void const *args) -{ - while (true) { - /*input for change to 0 to 100% range by 30C to 120C */ -#define RangeSPL 30.0 //calcurate celcius range -#define RangeSPH 120.0 //same above +/*PB control*/ +void runmode() { + Run = !Run; +} + +void cal_temp(void const *argument) { + while(1){ + /*input for change to 0 to 100% range by 30C to 120C */ /*Temperature setpoint low high range */ - temp_sv_input = wheel.getPulses() * 0.5 + RangeSPL; +#define RangeSPL 30.0 //Celcius low side temperature + temp_sv_input = wheel.getPulses() / 20.0 + RangeSPL; if (temp_sv_input <= RangeSPL) { temp_sv_input = RangeSPL; +#define RangeSPH 100.0 //Celcius high side temperature } else if (temp_sv_input >= RangeSPH) { temp_sv_input = RangeSPH; } - temp_cal = THAI.read(); - - + /*six order polynomial calculation value Thermister pull up resiter 560R Thermister B value 3380K Thermister Resistance 10K ohm at 25C + This NTC is NCP18XH103F03RB muRata */ + temp_cal = THAI.read() * 3.3; 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; - Thread::wait(500); - /*LCD Display section */ - lcd.printf(0, "Temp SP %.1f\n", temp_sv_input); - lcd.printf(1, "Temp PV %.1f\n", temp_pv); - } + /*LCD Display section */ + lcd.printf(0, "SP %.1f", temp_sv_input); + lcd.printf(0, "PV %.1f\n", temp_pv); + lcd.printf(1, "OUT %.2f", out.read() * 100); + lcd.printf(1, "PB %s\n", Run); + /*Tenperature indicater */ + /* 1.5C high temperature */ + if (Run == true){ + if ((temp_pv - temp_sv_input) >= 1.5) { + ledR = 0; + ledG = 1; + ledB = 1; + /* 1.5C low temperature */ + } else if ((temp_sv_input - temp_pv ) >= 1.5 ){ + ledR = 1; + ledG = 1; + ledB = 0; + } else { + /* control green */ + ledR = 1; + ledG = 0; + ledB = 1; + } + } else { + ledR = 1; + ledG = 1; + ledB = 1; + } +Thread::wait(rtostime * 2); } - +} int main() { - /* call Tmeperature calculate section */ - Thread thread(TempCal_thread); - //LCD contrast set from 00 to 3f 64resolution defult set is 32step + RunPB.mode(PullDown); #define LCDCont 0x32 //LCD contrast set from 00 to 3f 64resolution defult set is 32step lcd.contrast(LCDCont); - - - while (1) { - /*Analog input from 30.0C to 120.0C by 0% to 100% */ + out.period(0.02); + RunPB.rise(&runmode); + Thread thread(cal_temp); + rtostime = RATE * 1000; + while (1) { + /*PID control*/ #define SV_LL 0.0 //PID setpoint % value for lo limit #define SV_HL 100.0 //PID setpoint % value for high limit - /* TIC PID setpoit limit set */ - TIC.setInputLimits(SV_LL, SV_HL); - - /* Output from 0.0 to 1.0*/ + TIC.setInputLimits(SV_LL, SV_HL); #define OV_LL 0.0 //PID calcurate output value 0.0 = 0% -#define OV_HL 1.0 //PID calcurate output value 1.0 = 100% - /* TIC PID control output limit set */ - TIC.setOutputLimits(OV_LL, OV_HL); +#define OV_HL 100.0 //PID calcurate output value 1.0 = 100% + if (Run == true) { + TIC.setOutputLimits(OV_LL, OV_HL); + TIC.setSetPoint(temp_sv_input); + TIC.setProcessValue(temp_pv); + TIC.setBias(Bias); //control output bias + TIC.setMode(1); + out = TIC.compute() /100; + TIC.setInterval(RATE); + }else if (Run == false){ + TIC.setMode(0); + TIC.reset(); + out = 0.0; + } + Thread::wait(rtostime); - /* TIC PID control output bias */ -#define Bias 0.2 //control output bias - TIC.setBias(Bias); - /* TIC PID control mode set 0=Stop 1=Auto*/ - TIC.setMode(Run); - /* TIC PID setpoint temperature read */ - TIC.setSetPoint(temp_sv_input); - - /* TIC PID output control */ - if (Run == 0) { - out = OV_LL; - } else if (Run == 1) { - /* TIC PID read process value */ - TIC.setProcessValue(temp_pv); - //PID calculate output. - out = TIC.compute(); - } - //Wait for another loop calculation. - Thread::wait(RATE); - } + } } \ No newline at end of file