Rev0

Dependencies:   PID QEI-Intruptinmode-set SB1602E mbed

Fork of PreHeater-Rev2 by Kazu Zamasu

プリヒータ基板のファームウェアです。 Rev2基板用ですので、温度センサーなどが変更になっています。

This is Pre Heater device firmware. This firmware is Rev2 PCB design.

Committer:
Hapi_Tech
Date:
Wed Jul 29 04:40:07 2015 +0000
Revision:
2:6315824f8a29
Parent:
1:1440321bc326
Child:
3:e4253d33ff0c
Rev1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kazu_zamasu 0:b2cea429ec0b 1 /*The MIT License (MIT)
kazu_zamasu 0:b2cea429ec0b 2
kazu_zamasu 0:b2cea429ec0b 3 Copyright (c) <2015> <Kazumichi Aoki>
kazu_zamasu 0:b2cea429ec0b 4
kazu_zamasu 0:b2cea429ec0b 5 Permission is hereby granted, free of charge, to any person obtaining a copy
kazu_zamasu 0:b2cea429ec0b 6 of this software and associated documentation files (the "Software"), to deal
kazu_zamasu 0:b2cea429ec0b 7 in the Software without restriction, including without limitation the rights
kazu_zamasu 0:b2cea429ec0b 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kazu_zamasu 0:b2cea429ec0b 9 copies of the Software, and to permit persons to whom the Software is
kazu_zamasu 0:b2cea429ec0b 10 furnished to do so, subject to the following conditions:
kazu_zamasu 0:b2cea429ec0b 11
kazu_zamasu 0:b2cea429ec0b 12 The above copyright notice and this permission notice shall be included in
kazu_zamasu 0:b2cea429ec0b 13 all copies or substantial portions of the Software.
kazu_zamasu 0:b2cea429ec0b 14
kazu_zamasu 0:b2cea429ec0b 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kazu_zamasu 0:b2cea429ec0b 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kazu_zamasu 0:b2cea429ec0b 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kazu_zamasu 0:b2cea429ec0b 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kazu_zamasu 0:b2cea429ec0b 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kazu_zamasu 0:b2cea429ec0b 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
kazu_zamasu 0:b2cea429ec0b 21 THE SOFTWARE.
kazu_zamasu 0:b2cea429ec0b 22 */
kazu_zamasu 0:b2cea429ec0b 23
kazu_zamasu 0:b2cea429ec0b 24
kazu_zamasu 0:b2cea429ec0b 25
kazu_zamasu 0:b2cea429ec0b 26 #include "mbed.h"
kazu_zamasu 0:b2cea429ec0b 27 #include "PID.h"
kazu_zamasu 0:b2cea429ec0b 28 #include "math.h"
kazu_zamasu 0:b2cea429ec0b 29 #include "SB1602E.h"
kazu_zamasu 0:b2cea429ec0b 30 #include "QEI.h"
Hapi_Tech 2:6315824f8a29 31
kazu_zamasu 0:b2cea429ec0b 32 //GPIO initilaize
Hapi_Tech 2:6315824f8a29 33 AnalogIn THAI(dp4);
Hapi_Tech 2:6315824f8a29 34 PwmOut out(dp18);
Hapi_Tech 2:6315824f8a29 35 DigitalOut ledR(dp17),ledG(dp25),ledB(dp26);
Hapi_Tech 2:6315824f8a29 36 DigitalIn RunPB(dp10);
Hapi_Tech 2:6315824f8a29 37 Serial pc(dp16, dp15); // tx, rx
Hapi_Tech 2:6315824f8a29 38 Ticker Timer_ticker;
kazu_zamasu 0:b2cea429ec0b 39
kazu_zamasu 0:b2cea429ec0b 40 /* PID constant initialize Kc, Ti, Td, interval */
Hapi_Tech 2:6315824f8a29 41 #define P 5.0 //propotional band
Hapi_Tech 2:6315824f8a29 42 #define I 2.0 //Integral
Hapi_Tech 2:6315824f8a29 43 #define D 0.0 //Devide
kazu_zamasu 0:b2cea429ec0b 44 #define RATE 0.1 //update time sec
Hapi_Tech 2:6315824f8a29 45 #define InitialSP 45.0 // Boot Setpoint initial temeprature
kazu_zamasu 0:b2cea429ec0b 46 PID TIC(P, I, D, RATE);
kazu_zamasu 0:b2cea429ec0b 47
kazu_zamasu 0:b2cea429ec0b 48 /*LCD I2C pin initialize */
kazu_zamasu 0:b2cea429ec0b 49 char *init_massage = "Hello!";
kazu_zamasu 0:b2cea429ec0b 50 SB1602E lcd(dp5, dp27, init_massage); // SDA, SCL
kazu_zamasu 0:b2cea429ec0b 51 /*QEI initialize */
kazu_zamasu 0:b2cea429ec0b 52 #define ROTATE_PER_REVOLUTIONS 24
Hapi_Tech 1:1440321bc326 53 QEI wheel(dp11, dp13, NC, PullUp, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING);
kazu_zamasu 0:b2cea429ec0b 54
kazu_zamasu 0:b2cea429ec0b 55 //Initial
Hapi_Tech 1:1440321bc326 56 float temp_sv_input, waittime,OV_LL,ticout,qei,Bias;
kazu_zamasu 0:b2cea429ec0b 57 bool Run(false);
kazu_zamasu 0:b2cea429ec0b 58 double temp_pv,temp_cal;
Hapi_Tech 2:6315824f8a29 59
Hapi_Tech 2:6315824f8a29 60 #define EncoderDiv 20.0 //Celcius coefficient encoder 25Pulse to 1℃
Hapi_Tech 2:6315824f8a29 61 #define RangeSPL 30.0 //Celcius low side temperature
Hapi_Tech 2:6315824f8a29 62 #define RangeSPH 100.0 //Celcius high side temperature
Hapi_Tech 2:6315824f8a29 63 int encPulseCnt = ( (InitialSP - RangeSPL) * EncoderDiv );
Hapi_Tech 1:1440321bc326 64 int encPulses = 0;
Hapi_Tech 1:1440321bc326 65 int end_getPulses_old = 0;
kazu_zamasu 0:b2cea429ec0b 66
kazu_zamasu 0:b2cea429ec0b 67 /*PB control*/
kazu_zamasu 0:b2cea429ec0b 68 void runmode()
kazu_zamasu 0:b2cea429ec0b 69 {
kazu_zamasu 0:b2cea429ec0b 70 Run = !Run;
kazu_zamasu 0:b2cea429ec0b 71 }
kazu_zamasu 0:b2cea429ec0b 72
Hapi_Tech 2:6315824f8a29 73 void TimerCall_10ms()
Hapi_Tech 2:6315824f8a29 74 {
Hapi_Tech 2:6315824f8a29 75 static bool old_RunPB=0;
Hapi_Tech 2:6315824f8a29 76 bool tmp_RunPB=0;
Hapi_Tech 2:6315824f8a29 77 tmp_RunPB = RunPB;
Hapi_Tech 2:6315824f8a29 78 if( (old_RunPB != tmp_RunPB) && (tmp_RunPB == 1) )
Hapi_Tech 2:6315824f8a29 79 {
Hapi_Tech 2:6315824f8a29 80 runmode();
Hapi_Tech 2:6315824f8a29 81 }
Hapi_Tech 2:6315824f8a29 82 old_RunPB = tmp_RunPB;
Hapi_Tech 2:6315824f8a29 83 }
Hapi_Tech 2:6315824f8a29 84
Hapi_Tech 2:6315824f8a29 85 void cal_temp()
kazu_zamasu 0:b2cea429ec0b 86 {
Hapi_Tech 2:6315824f8a29 87 /*input for change to 0 to 100% range by 30C to 100C */
Hapi_Tech 2:6315824f8a29 88 /*Temperature setpoint low high range */
Hapi_Tech 2:6315824f8a29 89
Hapi_Tech 2:6315824f8a29 90 encPulseCnt = encPulseCnt + (encPulses - end_getPulses_old);
Hapi_Tech 2:6315824f8a29 91 if( encPulseCnt < 0 ) //Lower Limit
Hapi_Tech 2:6315824f8a29 92 {
Hapi_Tech 2:6315824f8a29 93 encPulseCnt = 0;
Hapi_Tech 2:6315824f8a29 94 }
Hapi_Tech 2:6315824f8a29 95 if( encPulseCnt > ( (RangeSPH-RangeSPL) * EncoderDiv) ) //Upper Limit
Hapi_Tech 2:6315824f8a29 96 {
Hapi_Tech 2:6315824f8a29 97 encPulseCnt = (RangeSPH-RangeSPL) * EncoderDiv;
Hapi_Tech 2:6315824f8a29 98 }
Hapi_Tech 2:6315824f8a29 99
Hapi_Tech 2:6315824f8a29 100 temp_sv_input = encPulseCnt / EncoderDiv + RangeSPL; //calc encoder Pulse to SetPoint
Hapi_Tech 1:1440321bc326 101
Hapi_Tech 2:6315824f8a29 102 /*six order polynomial calculation value
Hapi_Tech 2:6315824f8a29 103 Thermister pull up resiter 560R
Hapi_Tech 2:6315824f8a29 104 Thermister B value 3380K
Hapi_Tech 2:6315824f8a29 105 Thermister Resistance 10K ohm at 25C
Hapi_Tech 2:6315824f8a29 106 This NTC is NCP18XH103F03RB muRata
Hapi_Tech 2:6315824f8a29 107 */
Hapi_Tech 2:6315824f8a29 108 //temp_cal = THAI.read() * 3.3;
Hapi_Tech 2:6315824f8a29 109 //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;
Hapi_Tech 2:6315824f8a29 110
Hapi_Tech 2:6315824f8a29 111 /*LCD Display section */
Hapi_Tech 2:6315824f8a29 112 lcd.printf(0,0, "SP %.1f", temp_sv_input);
Hapi_Tech 2:6315824f8a29 113
Hapi_Tech 2:6315824f8a29 114 //lcd.printf(1, "OUT %.2f", out.read() * 100);
Hapi_Tech 2:6315824f8a29 115 //lcd.printf(1, "PB %s\n", Run);
Hapi_Tech 2:6315824f8a29 116
Hapi_Tech 2:6315824f8a29 117 /*Tenperature indicater */
Hapi_Tech 2:6315824f8a29 118 /* 1.5C high temperature */
Hapi_Tech 2:6315824f8a29 119 }
Hapi_Tech 2:6315824f8a29 120
Hapi_Tech 2:6315824f8a29 121
Hapi_Tech 2:6315824f8a29 122 int main()
Hapi_Tech 2:6315824f8a29 123 {
Hapi_Tech 2:6315824f8a29 124 Timer_ticker.attach_us(&TimerCall_10ms, 10000);
Hapi_Tech 2:6315824f8a29 125 RunPB.mode(PullDown);
Hapi_Tech 2:6315824f8a29 126 #define LCDCont 0x32 //LCD contrast set from 00 to 3f 64resolution defult set is 32step
Hapi_Tech 2:6315824f8a29 127 lcd.contrast(LCDCont);
Hapi_Tech 2:6315824f8a29 128 out.period(0.02);
Hapi_Tech 2:6315824f8a29 129 cal_temp();
Hapi_Tech 2:6315824f8a29 130
Hapi_Tech 2:6315824f8a29 131 while (1) {
Hapi_Tech 1:1440321bc326 132 encPulses = wheel.getPulses();
Hapi_Tech 2:6315824f8a29 133 if(end_getPulses_old != encPulses)
Hapi_Tech 1:1440321bc326 134 {
Hapi_Tech 2:6315824f8a29 135 cal_temp();
kazu_zamasu 0:b2cea429ec0b 136 }
Hapi_Tech 1:1440321bc326 137 end_getPulses_old = encPulses;
Hapi_Tech 1:1440321bc326 138
Hapi_Tech 1:1440321bc326 139 /*LM26LVCISDX-115 Factory Preset Temperature Switch and Temperature Sensor Gain3 115C trip sensor calculation value.*/
Hapi_Tech 1:1440321bc326 140 temp_cal = THAI.read() * 3300;
Hapi_Tech 1:1440321bc326 141 temp_pv = -0.00000000007*pow(temp_cal,3.0)-0.000002*pow(temp_cal,2.0)-0.091*temp_cal+201.5;
Hapi_Tech 2:6315824f8a29 142 lcd.printf(0,1, "PV %.1f\n", temp_pv);
kazu_zamasu 0:b2cea429ec0b 143
kazu_zamasu 0:b2cea429ec0b 144 if (Run == true) {
kazu_zamasu 0:b2cea429ec0b 145 if ((temp_pv - temp_sv_input) >= 1.5) {
kazu_zamasu 0:b2cea429ec0b 146 ledR = 0;
kazu_zamasu 0:b2cea429ec0b 147 ledG = 1;
kazu_zamasu 0:b2cea429ec0b 148 ledB = 1;
kazu_zamasu 0:b2cea429ec0b 149 /* 1.5C low temperature */
kazu_zamasu 0:b2cea429ec0b 150 } else if ((temp_sv_input - temp_pv ) >= 1.5 ) {
kazu_zamasu 0:b2cea429ec0b 151 ledR = 1;
kazu_zamasu 0:b2cea429ec0b 152 ledG = 1;
kazu_zamasu 0:b2cea429ec0b 153 ledB = 0;
kazu_zamasu 0:b2cea429ec0b 154 } else {
kazu_zamasu 0:b2cea429ec0b 155 /* control green */
kazu_zamasu 0:b2cea429ec0b 156 ledR = 1;
kazu_zamasu 0:b2cea429ec0b 157 ledG = 0;
kazu_zamasu 0:b2cea429ec0b 158 ledB = 1;
kazu_zamasu 0:b2cea429ec0b 159 }
kazu_zamasu 0:b2cea429ec0b 160 } else {
kazu_zamasu 0:b2cea429ec0b 161 ledR = 1;
kazu_zamasu 0:b2cea429ec0b 162 ledG = 1;
kazu_zamasu 0:b2cea429ec0b 163 ledB = 1;
kazu_zamasu 0:b2cea429ec0b 164 }
Hapi_Tech 2:6315824f8a29 165 printf("\033[1;1H");
Hapi_Tech 2:6315824f8a29 166 printf("OUT %.6f", out.read() * 100);
Hapi_Tech 2:6315824f8a29 167 printf("\033[1;20H");
Hapi_Tech 2:6315824f8a29 168 printf("PB %d\n", Run);
Hapi_Tech 2:6315824f8a29 169 printf("\033[2;1H");
Hapi_Tech 2:6315824f8a29 170 printf("PV %.6f\n", temp_pv);
Hapi_Tech 2:6315824f8a29 171 printf("\033[2;20H");
Hapi_Tech 2:6315824f8a29 172 printf("SP %.6f", temp_sv_input);
Hapi_Tech 2:6315824f8a29 173 printf("\033[3;1H");
Hapi_Tech 2:6315824f8a29 174 printf("PV %.6f\n", THAI.read());
kazu_zamasu 0:b2cea429ec0b 175 /*PID control*/
kazu_zamasu 0:b2cea429ec0b 176 #define SV_LL 0.0 //PID setpoint % value for lo limit
kazu_zamasu 0:b2cea429ec0b 177 #define SV_HL 100.0 //PID setpoint % value for high limit
kazu_zamasu 0:b2cea429ec0b 178 TIC.setInputLimits(SV_LL, SV_HL);
kazu_zamasu 0:b2cea429ec0b 179 #define OV_LL 0.0 //PID calcurate output value 0.0 = 0%
kazu_zamasu 0:b2cea429ec0b 180 #define OV_HL 100.0 //PID calcurate output value 1.0 = 100%
kazu_zamasu 0:b2cea429ec0b 181 if (Run == true) {
kazu_zamasu 0:b2cea429ec0b 182 TIC.setOutputLimits(OV_LL, OV_HL);
kazu_zamasu 0:b2cea429ec0b 183 TIC.setSetPoint(temp_sv_input);
kazu_zamasu 0:b2cea429ec0b 184 TIC.setProcessValue(temp_pv);
kazu_zamasu 0:b2cea429ec0b 185 TIC.setBias(Bias); //control output bias
kazu_zamasu 0:b2cea429ec0b 186 TIC.setMode(1);
kazu_zamasu 0:b2cea429ec0b 187 out = TIC.compute() /100;
kazu_zamasu 0:b2cea429ec0b 188 TIC.setInterval(RATE);
kazu_zamasu 0:b2cea429ec0b 189 } else if (Run == false) {
kazu_zamasu 0:b2cea429ec0b 190 TIC.setMode(0);
kazu_zamasu 0:b2cea429ec0b 191 TIC.reset();
kazu_zamasu 0:b2cea429ec0b 192 out = 0.0;
kazu_zamasu 0:b2cea429ec0b 193 }
kazu_zamasu 0:b2cea429ec0b 194 }
kazu_zamasu 0:b2cea429ec0b 195 }