Origin firmware.
Dependencies: PID QEI SB1602E mbed-rtos mbed
Fork of PreHeater by
main.cpp@0:b1d44d6f9adf, 2015-06-13 (annotated)
- Committer:
- kazu_zamasu
- Date:
- Sat Jun 13 00:05:45 2015 +0000
- Revision:
- 0:b1d44d6f9adf
- Child:
- 1:f974481c37b6
?????
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 | 0:b1d44d6f9adf | 15 | #define P 1.0 |
kazu_zamasu | 0:b1d44d6f9adf | 16 | #define I 0.2 |
kazu_zamasu | 0:b1d44d6f9adf | 17 | #define D 0.1 |
kazu_zamasu | 0:b1d44d6f9adf | 18 | #define RATE 0.1 |
kazu_zamasu | 0:b1d44d6f9adf | 19 | #define Bias 0.2 |
kazu_zamasu | 0:b1d44d6f9adf | 20 | #define InitialSP 50.0 // PID initial setpoint |
kazu_zamasu | 0:b1d44d6f9adf | 21 | #define RangeSPL 30.0 |
kazu_zamasu | 0:b1d44d6f9adf | 22 | #define RangeSPH 120.0 |
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 | 0:b1d44d6f9adf | 27 | AnalogIn THAI(dp4); |
kazu_zamasu | 0:b1d44d6f9adf | 28 | PwmOut out(dp1); |
kazu_zamasu | 0:b1d44d6f9adf | 29 | DigitalOut led1(dp14),led2(dp28); |
kazu_zamasu | 0:b1d44d6f9adf | 30 | DigitalIn Run(dp17,PullUp); |
kazu_zamasu | 0:b1d44d6f9adf | 31 | QEI wheel(dp11, PullUp, dp13,PullUp, NC, ROTATE_PER_REVOLUTIONS, QEI::X2_ENCODING); |
kazu_zamasu | 0:b1d44d6f9adf | 32 | float temp_sv_input; |
kazu_zamasu | 0:b1d44d6f9adf | 33 | double temp_pv,temp_cal; |
kazu_zamasu | 0:b1d44d6f9adf | 34 | |
kazu_zamasu | 0:b1d44d6f9adf | 35 | void LCD_thread(void const *args) { |
kazu_zamasu | 0:b1d44d6f9adf | 36 | while (true) { |
kazu_zamasu | 0:b1d44d6f9adf | 37 | led2 = !led2; |
kazu_zamasu | 0:b1d44d6f9adf | 38 | Thread::wait(1000); |
kazu_zamasu | 0:b1d44d6f9adf | 39 | } |
kazu_zamasu | 0:b1d44d6f9adf | 40 | } |
kazu_zamasu | 0:b1d44d6f9adf | 41 | |
kazu_zamasu | 0:b1d44d6f9adf | 42 | |
kazu_zamasu | 0:b1d44d6f9adf | 43 | int main(){ |
kazu_zamasu | 0:b1d44d6f9adf | 44 | //input for change to 0 to 100% range by 50C to 120C |
kazu_zamasu | 0:b1d44d6f9adf | 45 | temp_sv_input = wheel.getPulses() * 0.5 + RangeSPL; |
kazu_zamasu | 0:b1d44d6f9adf | 46 | |
kazu_zamasu | 0:b1d44d6f9adf | 47 | if (temp_sv_input <= RangeSPL){ |
kazu_zamasu | 0:b1d44d6f9adf | 48 | temp_sv_input = RangeSPL; |
kazu_zamasu | 0:b1d44d6f9adf | 49 | } |
kazu_zamasu | 0:b1d44d6f9adf | 50 | else if (temp_sv_input >= RangeSPH){ |
kazu_zamasu | 0:b1d44d6f9adf | 51 | temp_sv_input = RangeSPH; |
kazu_zamasu | 0:b1d44d6f9adf | 52 | } |
kazu_zamasu | 0:b1d44d6f9adf | 53 | |
kazu_zamasu | 0:b1d44d6f9adf | 54 | |
kazu_zamasu | 0:b1d44d6f9adf | 55 | temp_cal = THAI.read(); |
kazu_zamasu | 0:b1d44d6f9adf | 56 | //six order polynomial |
kazu_zamasu | 0:b1d44d6f9adf | 57 | 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 | 0:b1d44d6f9adf | 58 | |
kazu_zamasu | 0:b1d44d6f9adf | 59 | //Analog input from 50.0C to 120.0C |
kazu_zamasu | 0:b1d44d6f9adf | 60 | TIC.setInputLimits(SV_LL, SV_HL); |
kazu_zamasu | 0:b1d44d6f9adf | 61 | //Pwm output from 0.0 to 1.0 |
kazu_zamasu | 0:b1d44d6f9adf | 62 | TIC.setOutputLimits(OV_LL, OV_HL); |
kazu_zamasu | 0:b1d44d6f9adf | 63 | //If there's a bias. |
kazu_zamasu | 0:b1d44d6f9adf | 64 | TIC.setBias(Bias); |
kazu_zamasu | 0:b1d44d6f9adf | 65 | TIC.setMode(Run); |
kazu_zamasu | 0:b1d44d6f9adf | 66 | //We want the process variable to be 1.7V |
kazu_zamasu | 0:b1d44d6f9adf | 67 | TIC.setSetPoint(temp_sv_input); |
kazu_zamasu | 0:b1d44d6f9adf | 68 | |
kazu_zamasu | 0:b1d44d6f9adf | 69 | while(Run == 1){ |
kazu_zamasu | 0:b1d44d6f9adf | 70 | //Update the process variable. |
kazu_zamasu | 0:b1d44d6f9adf | 71 | TIC.setProcessValue(temp_cal); |
kazu_zamasu | 0:b1d44d6f9adf | 72 | //Set the new output. |
kazu_zamasu | 0:b1d44d6f9adf | 73 | out = TIC.compute(); |
kazu_zamasu | 0:b1d44d6f9adf | 74 | //Wait for another loop calculation. |
kazu_zamasu | 0:b1d44d6f9adf | 75 | wait(RATE); |
kazu_zamasu | 0:b1d44d6f9adf | 76 | |
kazu_zamasu | 0:b1d44d6f9adf | 77 | Thread thread(LCD_thread); |
kazu_zamasu | 0:b1d44d6f9adf | 78 | |
kazu_zamasu | 0:b1d44d6f9adf | 79 | /* while (true) { |
kazu_zamasu | 0:b1d44d6f9adf | 80 | led1 = !led1; |
kazu_zamasu | 0:b1d44d6f9adf | 81 | Thread::wait(500); |
kazu_zamasu | 0:b1d44d6f9adf | 82 | } */ |
kazu_zamasu | 0:b1d44d6f9adf | 83 | |
kazu_zamasu | 0:b1d44d6f9adf | 84 | out = OV_LL; |
kazu_zamasu | 0:b1d44d6f9adf | 85 | } |
kazu_zamasu | 0:b1d44d6f9adf | 86 | |
kazu_zamasu | 0:b1d44d6f9adf | 87 | } |