Origin firmware.
Dependencies: PID QEI SB1602E mbed-rtos mbed
Fork of PreHeater by
main.cpp@2:387240c58110, 2015-06-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |