Origin firmware.

Dependencies:   PID QEI SB1602E mbed-rtos mbed

Fork of PreHeater by Kazu Zamasu

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