Rev0
Dependencies: PID QEI-Intruptinmode-set SB1602E mbed
Fork of PreHeater-Rev2 by
プリヒータ基板のファームウェアです。 Rev2基板用ですので、温度センサーなどが変更になっています。
This is Pre Heater device firmware. This firmware is Rev2 PCB design.
Revision 3:e4253d33ff0c, committed 2015-07-29
- Comitter:
- Hapi_Tech
- Date:
- Wed Jul 29 12:08:17 2015 +0000
- Parent:
- 2:6315824f8a29
- Commit message:
- Rev3
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 6315824f8a29 -r e4253d33ff0c main.cpp --- a/main.cpp Wed Jul 29 04:40:07 2015 +0000 +++ b/main.cpp Wed Jul 29 12:08:17 2015 +0000 @@ -43,6 +43,7 @@ #define D 0.0 //Devide #define RATE 0.1 //update time sec #define InitialSP 45.0 // Boot Setpoint initial temeprature +#define Bias 0.0 //PID output bias PID TIC(P, I, D, RATE); /*LCD I2C pin initialize */ @@ -53,11 +54,12 @@ QEI wheel(dp11, dp13, NC, PullUp, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING); //Initial -float temp_sv_input, waittime,OV_LL,ticout,qei,Bias; +float temp_sv_input; bool Run(false); double temp_pv,temp_cal; -#define EncoderDiv 20.0 //Celcius coefficient encoder 25Pulse to 1℃ +/*PID SP encorder calcurate temperature */ +#define EncoderDiv 20.0 //Divide encoder 1Pulse per 1℃ ex. 1/20=0.05 enc 1click 0.05C #define RangeSPL 30.0 //Celcius low side temperature #define RangeSPH 100.0 //Celcius high side temperature int encPulseCnt = ( (InitialSP - RangeSPL) * EncoderDiv ); @@ -75,8 +77,7 @@ static bool old_RunPB=0; bool tmp_RunPB=0; tmp_RunPB = RunPB; - if( (old_RunPB != tmp_RunPB) && (tmp_RunPB == 1) ) - { + if( (old_RunPB != tmp_RunPB) && (tmp_RunPB == 1) ) { runmode(); } old_RunPB = tmp_RunPB; @@ -84,38 +85,18 @@ void cal_temp() { - /*input for change to 0 to 100% range by 30C to 100C */ - /*Temperature setpoint low high range */ - + /*SP temperature high low limit*/ encPulseCnt = encPulseCnt + (encPulses - end_getPulses_old); - if( encPulseCnt < 0 ) //Lower Limit - { + if( encPulseCnt < 0 ) { //Lower Limit encPulseCnt = 0; } - if( encPulseCnt > ( (RangeSPH-RangeSPL) * EncoderDiv) ) //Upper Limit - { + if( encPulseCnt > ( (RangeSPH-RangeSPL) * EncoderDiv) ) { //Upper Limit encPulseCnt = (RangeSPH-RangeSPL) * EncoderDiv; } - temp_sv_input = encPulseCnt / EncoderDiv + RangeSPL; //calc encoder Pulse to SetPoint - /*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; - /*LCD Display section */ lcd.printf(0,0, "SP %.1f", temp_sv_input); - - //lcd.printf(1, "OUT %.2f", out.read() * 100); - //lcd.printf(1, "PB %s\n", Run); - - /*Tenperature indicater */ - /* 1.5C high temperature */ } @@ -125,13 +106,13 @@ RunPB.mode(PullDown); #define LCDCont 0x32 //LCD contrast set from 00 to 3f 64resolution defult set is 32step lcd.contrast(LCDCont); + /* PWM setting.*/ out.period(0.02); cal_temp(); while (1) { encPulses = wheel.getPulses(); - if(end_getPulses_old != encPulses) - { + if(end_getPulses_old != encPulses) { cal_temp(); } end_getPulses_old = encPulses; @@ -140,7 +121,7 @@ temp_cal = THAI.read() * 3300; temp_pv = -0.00000000007*pow(temp_cal,3.0)-0.000002*pow(temp_cal,2.0)-0.091*temp_cal+201.5; lcd.printf(0,1, "PV %.1f\n", temp_pv); - + /*Tenperature indicater */ if (Run == true) { if ((temp_pv - temp_sv_input) >= 1.5) { ledR = 0; @@ -162,20 +143,31 @@ ledG = 1; ledB = 1; } - printf("\033[1;1H"); - printf("OUT %.6f", out.read() * 100); - printf("\033[1;20H"); - printf("PB %d\n", Run); - printf("\033[2;1H"); - printf("PV %.6f\n", temp_pv); - printf("\033[2;20H"); - printf("SP %.6f", temp_sv_input); - printf("\033[3;1H"); - printf("PV %.6f\n", THAI.read()); + /*UART debug dispray*/ + printf("\033[1;1H"); + printf("OUT %.6f", out.read() * 100); + printf("\033[1;20H"); + printf("Run %d\n", Run); + printf("\033[2;1H"); + printf("PVTemp %.6f\n", temp_pv); + printf("\033[2;20H"); + printf("SPTemp %.6f", temp_sv_input); + printf("\033[3;1H"); + printf("PVread %.6f\n", THAI.read()); + printf("\033[3;20H"); + printf("PVTemp %.6f\n",encPulses ); + /*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.setInputLimits(SV_LL, SV_HL); + + /* Notice!!! PV_LL and PV_HH if incorrect value, PID output by dead lock. + PV_LL= Temperature sensor low side value + PV_HH= Temperature sensoe high side value*/ +#define PV_LL -50.0 //PID PV low side Temp +#define PV_HH 150.0 //PID PV high side Temp + TIC.setInputLimits(PV_LL, PV_HH); + + /*OV_LL OV_HH PID calcurate output range. + If you use low power supply, you can limit output power. OV_HH is maximum 100%=65W at 24V */ #define OV_LL 0.0 //PID calcurate output value 0.0 = 0% #define OV_HL 100.0 //PID calcurate output value 1.0 = 100% if (Run == true) {