PTC5611 final

Dependencies:   mbed

Committer:
Marcelocostanzo
Date:
Thu Jun 25 19:20:55 2020 +0000
Revision:
0:e38258c0b70d
PTC5611 Final;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marcelocostanzo 0:e38258c0b70d 1 #include "mbed.h"
Marcelocostanzo 0:e38258c0b70d 2 #include "string.h"
Marcelocostanzo 0:e38258c0b70d 3
Marcelocostanzo 0:e38258c0b70d 4 PwmOut pwm(A1);
Marcelocostanzo 0:e38258c0b70d 5
Marcelocostanzo 0:e38258c0b70d 6 AnalogIn sensor(A0);
Marcelocostanzo 0:e38258c0b70d 7
Marcelocostanzo 0:e38258c0b70d 8 DigitalOut led(LED1);
Marcelocostanzo 0:e38258c0b70d 9
Marcelocostanzo 0:e38258c0b70d 10 DigitalIn sw(USER_BUTTON);
Marcelocostanzo 0:e38258c0b70d 11
Marcelocostanzo 0:e38258c0b70d 12 //Serial pc(USBTX, USBRX);
Marcelocostanzo 0:e38258c0b70d 13 Serial pc(PC_10, PC_11);
Marcelocostanzo 0:e38258c0b70d 14
Marcelocostanzo 0:e38258c0b70d 15 Timer t1;
Marcelocostanzo 0:e38258c0b70d 16
Marcelocostanzo 0:e38258c0b70d 17
Marcelocostanzo 0:e38258c0b70d 18 double ERROR_MEASURE,
Marcelocostanzo 0:e38258c0b70d 19 KP = 0.00902, //000.9702f, //0.0159f,
Marcelocostanzo 0:e38258c0b70d 20 KI = 0.000133, //000.0013986f, //156.1257f,
Marcelocostanzo 0:e38258c0b70d 21 PROPORTIONAL,
Marcelocostanzo 0:e38258c0b70d 22 INTEGRAL,
Marcelocostanzo 0:e38258c0b70d 23 LAST_INTEGRAL,
Marcelocostanzo 0:e38258c0b70d 24 PI,
Marcelocostanzo 0:e38258c0b70d 25 TS = 0.5;
Marcelocostanzo 0:e38258c0b70d 26
Marcelocostanzo 0:e38258c0b70d 27 float TEMPERATURE_C = 0;
Marcelocostanzo 0:e38258c0b70d 28
Marcelocostanzo 0:e38258c0b70d 29 float SETPOINT = 210.0f;
Marcelocostanzo 0:e38258c0b70d 30
Marcelocostanzo 0:e38258c0b70d 31
Marcelocostanzo 0:e38258c0b70d 32 void pi_control(void);
Marcelocostanzo 0:e38258c0b70d 33 void calc_celsius(void);
Marcelocostanzo 0:e38258c0b70d 34 void le_k(void);
Marcelocostanzo 0:e38258c0b70d 35
Marcelocostanzo 0:e38258c0b70d 36 int main()
Marcelocostanzo 0:e38258c0b70d 37 {
Marcelocostanzo 0:e38258c0b70d 38
Marcelocostanzo 0:e38258c0b70d 39 pc.baud(115200);
Marcelocostanzo 0:e38258c0b70d 40 pc.attach(&le_k);
Marcelocostanzo 0:e38258c0b70d 41
Marcelocostanzo 0:e38258c0b70d 42 pwm.period_us(1000); //1KHz
Marcelocostanzo 0:e38258c0b70d 43 int MS=0;
Marcelocostanzo 0:e38258c0b70d 44
Marcelocostanzo 0:e38258c0b70d 45 pwm.write(0.1f);
Marcelocostanzo 0:e38258c0b70d 46 int play = 0;
Marcelocostanzo 0:e38258c0b70d 47 while(play == 0)
Marcelocostanzo 0:e38258c0b70d 48 {
Marcelocostanzo 0:e38258c0b70d 49 calc_celsius();
Marcelocostanzo 0:e38258c0b70d 50 pc.printf("Temp %.2f\r",TEMPERATURE_C);
Marcelocostanzo 0:e38258c0b70d 51 if((sw == 0) && (play == 0))
Marcelocostanzo 0:e38258c0b70d 52 {
Marcelocostanzo 0:e38258c0b70d 53 wait_ms(300);
Marcelocostanzo 0:e38258c0b70d 54 if((sw == 0) && (play == 0))
Marcelocostanzo 0:e38258c0b70d 55 {
Marcelocostanzo 0:e38258c0b70d 56 play = 1;
Marcelocostanzo 0:e38258c0b70d 57 wait_ms(1000);
Marcelocostanzo 0:e38258c0b70d 58 }
Marcelocostanzo 0:e38258c0b70d 59 }
Marcelocostanzo 0:e38258c0b70d 60 }
Marcelocostanzo 0:e38258c0b70d 61
Marcelocostanzo 0:e38258c0b70d 62 while(1)
Marcelocostanzo 0:e38258c0b70d 63 {
Marcelocostanzo 0:e38258c0b70d 64 //t1.stop();
Marcelocostanzo 0:e38258c0b70d 65 //pc.printf("%i\r",t1.read_us());
Marcelocostanzo 0:e38258c0b70d 66 //t1.reset();
Marcelocostanzo 0:e38258c0b70d 67 //t1.start();
Marcelocostanzo 0:e38258c0b70d 68 calc_celsius();
Marcelocostanzo 0:e38258c0b70d 69 pi_control();
Marcelocostanzo 0:e38258c0b70d 70 pc.printf("Temp: %.2f %i\r",TEMPERATURE_C, MS);
Marcelocostanzo 0:e38258c0b70d 71 MS +=500;
Marcelocostanzo 0:e38258c0b70d 72 //pc.printf("PI: %f\r",PI);
Marcelocostanzo 0:e38258c0b70d 73 }
Marcelocostanzo 0:e38258c0b70d 74
Marcelocostanzo 0:e38258c0b70d 75 }
Marcelocostanzo 0:e38258c0b70d 76
Marcelocostanzo 0:e38258c0b70d 77 void pi_control()
Marcelocostanzo 0:e38258c0b70d 78 {
Marcelocostanzo 0:e38258c0b70d 79 ERROR_MEASURE = SETPOINT - TEMPERATURE_C; //calcula o erro
Marcelocostanzo 0:e38258c0b70d 80
Marcelocostanzo 0:e38258c0b70d 81 PROPORTIONAL = ERROR_MEASURE * KP; //calcula a parcela proporcional
Marcelocostanzo 0:e38258c0b70d 82
Marcelocostanzo 0:e38258c0b70d 83 INTEGRAL = LAST_INTEGRAL + (ERROR_MEASURE * KI * TS); //calcula a parcela integradora
Marcelocostanzo 0:e38258c0b70d 84
Marcelocostanzo 0:e38258c0b70d 85 //if(integral > 1.0f) integral = 1.0f;//anti wind up
Marcelocostanzo 0:e38258c0b70d 86 //if(integral < -1.0f) integral = -1.0f;
Marcelocostanzo 0:e38258c0b70d 87
Marcelocostanzo 0:e38258c0b70d 88 PI = PROPORTIONAL + INTEGRAL ; //soma as parcelas
Marcelocostanzo 0:e38258c0b70d 89
Marcelocostanzo 0:e38258c0b70d 90 //if(PID > 1.0f) PID = 1.0f; //nao deixa os valores ultrapasssarem o range do pwm de 0.0 a 1.0 (equivale a 0 - 100%)
Marcelocostanzo 0:e38258c0b70d 91 //if(PID < 0.0f) PID = 0.0f;
Marcelocostanzo 0:e38258c0b70d 92
Marcelocostanzo 0:e38258c0b70d 93 pwm = PI; //escreve a saida de pwm
Marcelocostanzo 0:e38258c0b70d 94
Marcelocostanzo 0:e38258c0b70d 95 LAST_INTEGRAL = INTEGRAL;
Marcelocostanzo 0:e38258c0b70d 96 }
Marcelocostanzo 0:e38258c0b70d 97
Marcelocostanzo 0:e38258c0b70d 98 void calc_celsius()
Marcelocostanzo 0:e38258c0b70d 99 {
Marcelocostanzo 0:e38258c0b70d 100 float average = 0;
Marcelocostanzo 0:e38258c0b70d 101 for(int i = 0; i < ((TS * 1000.0) - 6); i++) //-6 pois é o tempo de ciclo do programa, assim compensando para nao interferir em Ts
Marcelocostanzo 0:e38258c0b70d 102 {
Marcelocostanzo 0:e38258c0b70d 103 average += sensor.read();
Marcelocostanzo 0:e38258c0b70d 104 wait_ms(1);
Marcelocostanzo 0:e38258c0b70d 105 }
Marcelocostanzo 0:e38258c0b70d 106
Marcelocostanzo 0:e38258c0b70d 107 float adc_sensor = (average / ((TS * 1000.0) - 6)) * 4096.0f; //-6 pois é o tempo de ciclo do programa, assim compensando para nao interferir em Ts
Marcelocostanzo 0:e38258c0b70d 108 average = 0.0f;
Marcelocostanzo 0:e38258c0b70d 109
Marcelocostanzo 0:e38258c0b70d 110 float R_sensor = 10000.0f * adc_sensor / (4095.0f - adc_sensor);
Marcelocostanzo 0:e38258c0b70d 111 float div = R_sensor/100000.0f;
Marcelocostanzo 0:e38258c0b70d 112 float x_log = log(div);
Marcelocostanzo 0:e38258c0b70d 113 float log_1_b = x_log * 0.000253165f;
Marcelocostanzo 0:e38258c0b70d 114 float k2 = log_1_b + 0.003354016f;
Marcelocostanzo 0:e38258c0b70d 115 float tk = 1.0f / k2;
Marcelocostanzo 0:e38258c0b70d 116
Marcelocostanzo 0:e38258c0b70d 117 TEMPERATURE_C = tk - 273.15f;
Marcelocostanzo 0:e38258c0b70d 118 }
Marcelocostanzo 0:e38258c0b70d 119
Marcelocostanzo 0:e38258c0b70d 120
Marcelocostanzo 0:e38258c0b70d 121
Marcelocostanzo 0:e38258c0b70d 122
Marcelocostanzo 0:e38258c0b70d 123 void le_k()
Marcelocostanzo 0:e38258c0b70d 124 {
Marcelocostanzo 0:e38258c0b70d 125 char c[20];
Marcelocostanzo 0:e38258c0b70d 126 memset(c,NULL,20);
Marcelocostanzo 0:e38258c0b70d 127
Marcelocostanzo 0:e38258c0b70d 128 int i = 0;
Marcelocostanzo 0:e38258c0b70d 129
Marcelocostanzo 0:e38258c0b70d 130 while(c[i-1] != '\r')
Marcelocostanzo 0:e38258c0b70d 131 {
Marcelocostanzo 0:e38258c0b70d 132 c[i] = pc.getc();
Marcelocostanzo 0:e38258c0b70d 133 i++;
Marcelocostanzo 0:e38258c0b70d 134 }
Marcelocostanzo 0:e38258c0b70d 135
Marcelocostanzo 0:e38258c0b70d 136 char valor[8];
Marcelocostanzo 0:e38258c0b70d 137
Marcelocostanzo 0:e38258c0b70d 138 valor[0] = c[1];
Marcelocostanzo 0:e38258c0b70d 139 valor[1] = c[2];
Marcelocostanzo 0:e38258c0b70d 140 valor[2] = c[3];
Marcelocostanzo 0:e38258c0b70d 141 valor[3] = c[4];
Marcelocostanzo 0:e38258c0b70d 142 valor[4] = c[5];
Marcelocostanzo 0:e38258c0b70d 143 valor[5] = c[6];
Marcelocostanzo 0:e38258c0b70d 144 valor[6] = c[7];
Marcelocostanzo 0:e38258c0b70d 145 valor[7] = c[8];
Marcelocostanzo 0:e38258c0b70d 146
Marcelocostanzo 0:e38258c0b70d 147 //pc.printf(valor);
Marcelocostanzo 0:e38258c0b70d 148
Marcelocostanzo 0:e38258c0b70d 149 if(c[0] == 'P') //ajusta Kp
Marcelocostanzo 0:e38258c0b70d 150 {
Marcelocostanzo 0:e38258c0b70d 151 KP = atof(valor);
Marcelocostanzo 0:e38258c0b70d 152 pc.printf("\n\nkp = %f\n\r\n",KP);
Marcelocostanzo 0:e38258c0b70d 153 }
Marcelocostanzo 0:e38258c0b70d 154
Marcelocostanzo 0:e38258c0b70d 155 if(c[0] == 'I') //ajusta Ki
Marcelocostanzo 0:e38258c0b70d 156 {
Marcelocostanzo 0:e38258c0b70d 157 KI = atof(valor);
Marcelocostanzo 0:e38258c0b70d 158 pc.printf("\n\nki = %f\n\r\n",KI);
Marcelocostanzo 0:e38258c0b70d 159 }
Marcelocostanzo 0:e38258c0b70d 160
Marcelocostanzo 0:e38258c0b70d 161 if(c[0] == 'T') //ajusta Kd
Marcelocostanzo 0:e38258c0b70d 162 {
Marcelocostanzo 0:e38258c0b70d 163 TS = atof(valor);
Marcelocostanzo 0:e38258c0b70d 164 pc.printf("\n\nTs = %f\n\r\n",TS);
Marcelocostanzo 0:e38258c0b70d 165 }
Marcelocostanzo 0:e38258c0b70d 166
Marcelocostanzo 0:e38258c0b70d 167 if(c[0] == 'S') //ajusta o SETPOINT
Marcelocostanzo 0:e38258c0b70d 168 {
Marcelocostanzo 0:e38258c0b70d 169 SETPOINT = atof(valor);
Marcelocostanzo 0:e38258c0b70d 170 pc.printf("\n\nSetpoint = %f\n\r\n",SETPOINT);
Marcelocostanzo 0:e38258c0b70d 171 }
Marcelocostanzo 0:e38258c0b70d 172
Marcelocostanzo 0:e38258c0b70d 173 wait_ms(2000);
Marcelocostanzo 0:e38258c0b70d 174 }
Marcelocostanzo 0:e38258c0b70d 175