Origin firmware.
Dependencies: PID QEI SB1602E mbed-rtos mbed
Fork of PreHeater by
main.cpp@1:f974481c37b6, 2015-06-13 (annotated)
- Committer:
- kazu_zamasu
- Date:
- Sat Jun 13 04:30:15 2015 +0000
- Revision:
- 1:f974481c37b6
- Parent:
- 0:b1d44d6f9adf
- Child:
- 2:387240c58110
Change Thread
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 | 0:b1d44d6f9adf | 6 | |
kazu_zamasu | 0:b1d44d6f9adf | 7 | #define ROTATE_PER_REVOLUTIONS 24 //QEI 1 rotate by count |
kazu_zamasu | 0:b1d44d6f9adf | 8 | #define THR 560 /PTH pull up register value |
kazu_zamasu | 0:b1d44d6f9adf | 9 | #define THB 3380 //PTH B number |
kazu_zamasu | 0:b1d44d6f9adf | 10 | #define THCR 10000 //25C PTH register |
kazu_zamasu | 0:b1d44d6f9adf | 11 | #define OV_LL 0.0 //PID calcurate output value 0.0 = 0% |
kazu_zamasu | 0:b1d44d6f9adf | 12 | #define OV_HL 1.0 //PID calcurate output value 1.0 = 100% |
kazu_zamasu | 0:b1d44d6f9adf | 13 | #define SV_LL 0.0 //PID setpoint % value for lo limit |
kazu_zamasu | 0:b1d44d6f9adf | 14 | #define SV_HL 100.0 //PID setpoint % value for high limit |
kazu_zamasu | 1:f974481c37b6 | 15 | #define P 1.0 //propotional band |
kazu_zamasu | 1:f974481c37b6 | 16 | #define I 0.2 //Integral |
kazu_zamasu | 1:f974481c37b6 | 17 | #define D 0.1 //Devide |
kazu_zamasu | 1:f974481c37b6 | 18 | #define RATE 0.1 //update time sec |
kazu_zamasu | 1:f974481c37b6 | 19 | #define Bias 0.2 //control output bias |
kazu_zamasu | 0:b1d44d6f9adf | 20 | #define InitialSP 50.0 // PID initial setpoint |
kazu_zamasu | 1:f974481c37b6 | 21 | #define RangeSPL 30.0 //calcurate celcius range |
kazu_zamasu | 1:f974481c37b6 | 22 | #define RangeSPH 120.0 //same above |
kazu_zamasu | 0:b1d44d6f9adf | 23 | |
kazu_zamasu | 0:b1d44d6f9adf | 24 | //Kc, Ti, Td, interval |
kazu_zamasu | 0:b1d44d6f9adf | 25 | PID TIC(P, I, D, RATE); |
kazu_zamasu | 0:b1d44d6f9adf | 26 | |
kazu_zamasu | 1:f974481c37b6 | 27 | //GPIO initilaize |
kazu_zamasu | 0:b1d44d6f9adf | 28 | AnalogIn THAI(dp4); |
kazu_zamasu | 0:b1d44d6f9adf | 29 | PwmOut out(dp1); |
kazu_zamasu | 0:b1d44d6f9adf | 30 | DigitalOut led1(dp14),led2(dp28); |
kazu_zamasu | 0:b1d44d6f9adf | 31 | DigitalIn Run(dp17,PullUp); |
kazu_zamasu | 1:f974481c37b6 | 32 | |
kazu_zamasu | 1:f974481c37b6 | 33 | //Rotary encode pin, pinmode and sppecification instance |
kazu_zamasu | 1:f974481c37b6 | 34 | QEI wheel(dp11, PullUp, dp13, PullUp,NC, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING); |
kazu_zamasu | 1:f974481c37b6 | 35 | |
kazu_zamasu | 0:b1d44d6f9adf | 36 | float temp_sv_input; |
kazu_zamasu | 0:b1d44d6f9adf | 37 | double temp_pv,temp_cal; |
kazu_zamasu | 0:b1d44d6f9adf | 38 | |
kazu_zamasu | 1:f974481c37b6 | 39 | void TempCal_thread(void const *args) { |
kazu_zamasu | 0:b1d44d6f9adf | 40 | while (true) { |
kazu_zamasu | 0:b1d44d6f9adf | 41 | //input for change to 0 to 100% range by 50C to 120C |
kazu_zamasu | 0:b1d44d6f9adf | 42 | temp_sv_input = wheel.getPulses() * 0.5 + RangeSPL; |
kazu_zamasu | 0:b1d44d6f9adf | 43 | if (temp_sv_input <= RangeSPL){ |
kazu_zamasu | 0:b1d44d6f9adf | 44 | temp_sv_input = RangeSPL; |
kazu_zamasu | 1:f974481c37b6 | 45 | } |
kazu_zamasu | 0:b1d44d6f9adf | 46 | else if (temp_sv_input >= RangeSPH){ |
kazu_zamasu | 0:b1d44d6f9adf | 47 | temp_sv_input = RangeSPH; |
kazu_zamasu | 0:b1d44d6f9adf | 48 | } |
kazu_zamasu | 0:b1d44d6f9adf | 49 | temp_cal = THAI.read(); |
kazu_zamasu | 0:b1d44d6f9adf | 50 | //six order polynomial |
kazu_zamasu | 0:b1d44d6f9adf | 51 | 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 | 52 | Thread::wait(500); |
kazu_zamasu | 0:b1d44d6f9adf | 53 | |
kazu_zamasu | 1:f974481c37b6 | 54 | |
kazu_zamasu | 1:f974481c37b6 | 55 | //Insert LCD code |
kazu_zamasu | 1:f974481c37b6 | 56 | /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
kazu_zamasu | 1:f974481c37b6 | 57 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
kazu_zamasu | 1:f974481c37b6 | 58 | */ |
kazu_zamasu | 1:f974481c37b6 | 59 | } |
kazu_zamasu | 1:f974481c37b6 | 60 | } |
kazu_zamasu | 1:f974481c37b6 | 61 | |
kazu_zamasu | 1:f974481c37b6 | 62 | int main(){ |
kazu_zamasu | 1:f974481c37b6 | 63 | Thread thread(TempCal_thread); |
kazu_zamasu | 1:f974481c37b6 | 64 | while (1){ |
kazu_zamasu | 0:b1d44d6f9adf | 65 | //Analog input from 50.0C to 120.0C |
kazu_zamasu | 0:b1d44d6f9adf | 66 | TIC.setInputLimits(SV_LL, SV_HL); |
kazu_zamasu | 0:b1d44d6f9adf | 67 | //Pwm output from 0.0 to 1.0 |
kazu_zamasu | 0:b1d44d6f9adf | 68 | TIC.setOutputLimits(OV_LL, OV_HL); |
kazu_zamasu | 0:b1d44d6f9adf | 69 | //If there's a bias. |
kazu_zamasu | 0:b1d44d6f9adf | 70 | TIC.setBias(Bias); |
kazu_zamasu | 0:b1d44d6f9adf | 71 | TIC.setMode(Run); |
kazu_zamasu | 0:b1d44d6f9adf | 72 | //We want the process variable to be 1.7V |
kazu_zamasu | 0:b1d44d6f9adf | 73 | TIC.setSetPoint(temp_sv_input); |
kazu_zamasu | 0:b1d44d6f9adf | 74 | |
kazu_zamasu | 1:f974481c37b6 | 75 | if (Run == 1){ |
kazu_zamasu | 1:f974481c37b6 | 76 | out = OV_LL; |
kazu_zamasu | 1:f974481c37b6 | 77 | } |
kazu_zamasu | 1:f974481c37b6 | 78 | else if (Run == 0){ |
kazu_zamasu | 0:b1d44d6f9adf | 79 | //Update the process variable. |
kazu_zamasu | 0:b1d44d6f9adf | 80 | TIC.setProcessValue(temp_cal); |
kazu_zamasu | 0:b1d44d6f9adf | 81 | //Set the new output. |
kazu_zamasu | 0:b1d44d6f9adf | 82 | out = TIC.compute(); |
kazu_zamasu | 0:b1d44d6f9adf | 83 | //Wait for another loop calculation. |
kazu_zamasu | 1:f974481c37b6 | 84 | Thread::wait(RATE); |
kazu_zamasu | 1:f974481c37b6 | 85 | } |
kazu_zamasu | 0:b1d44d6f9adf | 86 | |
kazu_zamasu | 1:f974481c37b6 | 87 | } |
kazu_zamasu | 1:f974481c37b6 | 88 | } |