Uan Dung / Mbed OS Final4

Dependencies:   MLX90614

Committer:
Uan
Date:
Tue Jun 30 07:38:14 2020 +0000
Revision:
0:feecd42e3ef8
Test;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Uan 0:feecd42e3ef8 1 // Final funcional para recoger todos los datos analogicos de la PCB. Precisa de un conversor externo i2c a
Uan 0:feecd42e3ef8 2 // analógico para el MLX90614, debido a la baja velocidad del puerto i2c.
Uan 0:feecd42e3ef8 3
Uan 0:feecd42e3ef8 4 #include "mbed.h"
Uan 0:feecd42e3ef8 5 #include "MLX90614.h"
Uan 0:feecd42e3ef8 6
Uan 0:feecd42e3ef8 7 // Asignación de pines para entradas analógicas, separación en dos ADCs
Uan 0:feecd42e3ef8 8 AnalogIn TempS1(PA_5); // ADC1, lecturas de baja y media frecuencia
Uan 0:feecd42e3ef8 9 AnalogIn TempS2(PA_6);
Uan 0:feecd42e3ef8 10 AnalogIn TempS3(PA_7);
Uan 0:feecd42e3ef8 11 AnalogIn TempS4(PB_1);
Uan 0:feecd42e3ef8 12 AnalogIn TempA(PC_2);
Uan 0:feecd42e3ef8 13 AnalogIn Par(A1);
Uan 0:feecd42e3ef8 14 AnalogIn Vel(A2);
Uan 0:feecd42e3ef8 15 AnalogIn Volt(A0);
Uan 0:feecd42e3ef8 16 AnalogIn Corr1(A3); // ADC3, lecturas de alta frecuencia
Uan 0:feecd42e3ef8 17 AnalogIn Corr2(A4);
Uan 0:feecd42e3ef8 18 AnalogIn Corr3(A5);
Uan 0:feecd42e3ef8 19
Uan 0:feecd42e3ef8 20 AnalogIn TempAux1(PA_4);
Uan 0:feecd42e3ef8 21 AnalogIn TempAux2(PF_4);
Uan 0:feecd42e3ef8 22 int MTempAux1;
Uan 0:feecd42e3ef8 23 int MTempAux2;
Uan 0:feecd42e3ef8 24
Uan 0:feecd42e3ef8 25
Uan 0:feecd42e3ef8 26
Uan 0:feecd42e3ef8 27 // Comunicaciones con periféricos
Uan 0:feecd42e3ef8 28
Uan 0:feecd42e3ef8 29 SPI spi(PF_9,PF_8,PF_7); // SPI MOSI, MISO, SCLK
Uan 0:feecd42e3ef8 30 DigitalOut NSST(PF_2);
Uan 0:feecd42e3ef8 31 DigitalOut NSSW(PE_6);
Uan 0:feecd42e3ef8 32 DigitalOut NSSV(PC_8);
Uan 0:feecd42e3ef8 33 DigitalOut NSSC(PE_3);
Uan 0:feecd42e3ef8 34
Uan 0:feecd42e3ef8 35 I2C i2c(D14, D15); // Asignación de pines I2C para el sensor IR de temperatura: I2C_SDA, I2C_SCL
Uan 0:feecd42e3ef8 36 MLX90614 mlx90614(&i2c); // Inicialización del sensor infrarrojo de temperatura
Uan 0:feecd42e3ef8 37 int select; // 0 = object temp, 1 = ambient temp, no funciona con 0
Uan 0:feecd42e3ef8 38
Uan 0:feecd42e3ef8 39
Uan 0:feecd42e3ef8 40 // Declaración de variables para guardar las mediciones
Uan 0:feecd42e3ef8 41 float buff;
Uan 0:feecd42e3ef8 42 int MTempS1;
Uan 0:feecd42e3ef8 43 int MTempS2;
Uan 0:feecd42e3ef8 44 int MTempS3;
Uan 0:feecd42e3ef8 45 int MTempS4;
Uan 0:feecd42e3ef8 46 int MTempA;
Uan 0:feecd42e3ef8 47 int MTempR;
Uan 0:feecd42e3ef8 48 int MPar;
Uan 0:feecd42e3ef8 49 int MVel;
Uan 0:feecd42e3ef8 50 int MVolt;
Uan 0:feecd42e3ef8 51 int MCorr1;
Uan 0:feecd42e3ef8 52 int MCorr2;
Uan 0:feecd42e3ef8 53 int MCorr3;
Uan 0:feecd42e3ef8 54
Uan 0:feecd42e3ef8 55 char C1;
Uan 0:feecd42e3ef8 56 char C2;
Uan 0:feecd42e3ef8 57
Uan 0:feecd42e3ef8 58
Uan 0:feecd42e3ef8 59 EventQueue queue(64 * EVENTS_EVENT_SIZE); // Lista de eventos para distribuir a threads
Uan 0:feecd42e3ef8 60
Uan 0:feecd42e3ef8 61 Serial pc(USBTX,USBRX); // Inicialización del puerto serie al PC
Uan 0:feecd42e3ef8 62
Uan 0:feecd42e3ef8 63 Thread thread1; // Inicialización de multi-threading
Uan 0:feecd42e3ef8 64 Thread thread2;
Uan 0:feecd42e3ef8 65 Thread thread3;
Uan 0:feecd42e3ef8 66
Uan 0:feecd42e3ef8 67 Ticker ISREnvio; // Inicialización de interrupciones
Uan 0:feecd42e3ef8 68 Ticker ISRTemperaturas;
Uan 0:feecd42e3ef8 69 Ticker ISRVI;
Uan 0:feecd42e3ef8 70
Uan 0:feecd42e3ef8 71 void Envio(); // Declaración de subrutinas de interrupciones
Uan 0:feecd42e3ef8 72 void Temperaturas();
Uan 0:feecd42e3ef8 73 void VI();
Uan 0:feecd42e3ef8 74
Uan 0:feecd42e3ef8 75
Uan 0:feecd42e3ef8 76 // ENCODER
Uan 0:feecd42e3ef8 77
Uan 0:feecd42e3ef8 78 InterruptIn encoder(D8);
Uan 0:feecd42e3ef8 79
Uan 0:feecd42e3ef8 80 Timer tiempo;
Uan 0:feecd42e3ef8 81 float aux1;
Uan 0:feecd42e3ef8 82 int aux2;
Uan 0:feecd42e3ef8 83 int cambio;
Uan 0:feecd42e3ef8 84
Uan 0:feecd42e3ef8 85 void subida();
Uan 0:feecd42e3ef8 86
Uan 0:feecd42e3ef8 87
Uan 0:feecd42e3ef8 88 void subida() // Envío de datos por puerto serie al PC
Uan 0:feecd42e3ef8 89 {
Uan 0:feecd42e3ef8 90
Uan 0:feecd42e3ef8 91
Uan 0:feecd42e3ef8 92 if (cambio==0)
Uan 0:feecd42e3ef8 93 {
Uan 0:feecd42e3ef8 94 cambio=1;
Uan 0:feecd42e3ef8 95 tiempo.start();
Uan 0:feecd42e3ef8 96 }
Uan 0:feecd42e3ef8 97
Uan 0:feecd42e3ef8 98 else
Uan 0:feecd42e3ef8 99 {
Uan 0:feecd42e3ef8 100 cambio=0;
Uan 0:feecd42e3ef8 101 tiempo.stop();
Uan 0:feecd42e3ef8 102 aux1 = tiempo.read();
Uan 0:feecd42e3ef8 103 tiempo.reset();
Uan 0:feecd42e3ef8 104 }
Uan 0:feecd42e3ef8 105
Uan 0:feecd42e3ef8 106 }
Uan 0:feecd42e3ef8 107
Uan 0:feecd42e3ef8 108
Uan 0:feecd42e3ef8 109
Uan 0:feecd42e3ef8 110
Uan 0:feecd42e3ef8 111 // FINAL ENCODER
Uan 0:feecd42e3ef8 112
Uan 0:feecd42e3ef8 113
Uan 0:feecd42e3ef8 114
Uan 0:feecd42e3ef8 115 void Envio() // Envío de datos por puerto serie al PC
Uan 0:feecd42e3ef8 116 {
Uan 0:feecd42e3ef8 117
Uan 0:feecd42e3ef8 118 printf("%f %i %i %i %i %i\n", // Cambiar escalado %i %i %i %i %i
Uan 0:feecd42e3ef8 119 aux1*1000000, MTempS4, MVolt, MCorr1, MCorr2, MCorr3);
Uan 0:feecd42e3ef8 120 //
Uan 0:feecd42e3ef8 121 }
Uan 0:feecd42e3ef8 122
Uan 0:feecd42e3ef8 123 void Temperaturas() // Lectura de temperaturas (NTCs estátor y ambiente + IR rotor)
Uan 0:feecd42e3ef8 124 {
Uan 0:feecd42e3ef8 125
Uan 0:feecd42e3ef8 126 //MTempS1=TempS1*4096; // Escalar con el circuito
Uan 0:feecd42e3ef8 127 //MTempS2=TempS2*4096;
Uan 0:feecd42e3ef8 128 //MTempS3=TempS3*4096;
Uan 0:feecd42e3ef8 129 //MTempS4=TempS4*4096;
Uan 0:feecd42e3ef8 130 //MTempA=TempA*4096;
Uan 0:feecd42e3ef8 131 // MTempS1 = 292.4*pow(buff,3) - 382.46*pow(buff,2) + 282.26*buff - 13.152;
Uan 0:feecd42e3ef8 132
Uan 0:feecd42e3ef8 133 buff=TempS1;
Uan 0:feecd42e3ef8 134 MTempS1 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 135 buff=TempS2;
Uan 0:feecd42e3ef8 136 MTempS2 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 137 buff=TempS3;
Uan 0:feecd42e3ef8 138 MTempS3 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 139 buff=TempS4;
Uan 0:feecd42e3ef8 140 MTempS4 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 141 buff=TempA;
Uan 0:feecd42e3ef8 142 MTempA = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 143
Uan 0:feecd42e3ef8 144 buff=TempAux1;
Uan 0:feecd42e3ef8 145 MTempAux1 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 146 buff=TempAux2;
Uan 0:feecd42e3ef8 147 MTempAux2 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 148
Uan 0:feecd42e3ef8 149
Uan 0:feecd42e3ef8 150 //MTempR=mlx90614.read_temp(1)*10; // Lectura del IR
Uan 0:feecd42e3ef8 151
Uan 0:feecd42e3ef8 152 }
Uan 0:feecd42e3ef8 153
Uan 0:feecd42e3ef8 154
Uan 0:feecd42e3ef8 155 void VI() // Lectura de I en 3 fases, V en una fase
Uan 0:feecd42e3ef8 156 {
Uan 0:feecd42e3ef8 157
Uan 0:feecd42e3ef8 158 MCorr1=Corr1*4096; // Escalar con el circuito
Uan 0:feecd42e3ef8 159 MCorr2=Corr2*4096;
Uan 0:feecd42e3ef8 160 MCorr3=Corr3*4096;
Uan 0:feecd42e3ef8 161
Uan 0:feecd42e3ef8 162 buff=TempS4;
Uan 0:feecd42e3ef8 163 MTempS4 = 2924*pow(buff,3) - 3825*pow(buff,2) + 2823*buff - 131;
Uan 0:feecd42e3ef8 164
Uan 0:feecd42e3ef8 165 MVolt=Volt*4096; // Escalar con el circuito
Uan 0:feecd42e3ef8 166
Uan 0:feecd42e3ef8 167 if((tiempo.read()>1)||(aux1>1)) aux1=0;
Uan 0:feecd42e3ef8 168 if(tiempo.read()>1)
Uan 0:feecd42e3ef8 169 {
Uan 0:feecd42e3ef8 170 tiempo.stop();
Uan 0:feecd42e3ef8 171 tiempo.reset();
Uan 0:feecd42e3ef8 172 }
Uan 0:feecd42e3ef8 173
Uan 0:feecd42e3ef8 174
Uan 0:feecd42e3ef8 175 }
Uan 0:feecd42e3ef8 176
Uan 0:feecd42e3ef8 177 int main(void) // Thread 0
Uan 0:feecd42e3ef8 178 {
Uan 0:feecd42e3ef8 179 //MTempR=mlx90614.read_temp(1);
Uan 0:feecd42e3ef8 180 pc.baud(2000000); // Baudrate a 2Mbauds
Uan 0:feecd42e3ef8 181 spi.format(16,3); // 16 bits de información, modo 3 (rising edge, lógica inversa)
Uan 0:feecd42e3ef8 182 spi.frequency(1000000); // 1MHz
Uan 0:feecd42e3ef8 183 printf("Introduzca ganancias:\n");
Uan 0:feecd42e3ef8 184
Uan 0:feecd42e3ef8 185 NSSC=1;
Uan 0:feecd42e3ef8 186 NSST=1;
Uan 0:feecd42e3ef8 187 NSSW=1;
Uan 0:feecd42e3ef8 188 NSSV=1;
Uan 0:feecd42e3ef8 189
Uan 0:feecd42e3ef8 190 encoder.rise(&subida); // attach the address of the flip function to the rising edge
Uan 0:feecd42e3ef8 191 //encoder.fall(&bajada); // attach the address of the flip function to the rising edge
Uan 0:feecd42e3ef8 192
Uan 0:feecd42e3ef8 193
Uan 0:feecd42e3ef8 194 // Asignación de interrupciones y periodos de muestreo (en segundos)
Uan 0:feecd42e3ef8 195
Uan 0:feecd42e3ef8 196 ISREnvio.attach(queue.event(Envio), 0.0004);
Uan 0:feecd42e3ef8 197 //ISRTemperaturas.attach(queue.event(Temperaturas), 0.0005);
Uan 0:feecd42e3ef8 198 ISRVI.attach(queue.event(VI), 0.0004);
Uan 0:feecd42e3ef8 199
Uan 0:feecd42e3ef8 200 thread1.start(callback(&queue, &EventQueue::dispatch_forever)); // Apertura de threads
Uan 0:feecd42e3ef8 201 thread2.start(callback(&queue, &EventQueue::dispatch_forever));
Uan 0:feecd42e3ef8 202 //thread3.start(callback(&queue, &EventQueue::dispatch_forever));
Uan 0:feecd42e3ef8 203
Uan 0:feecd42e3ef8 204 while (1) // Thread 0 en espera indefinida
Uan 0:feecd42e3ef8 205 {
Uan 0:feecd42e3ef8 206 wait(10);
Uan 0:feecd42e3ef8 207 }
Uan 0:feecd42e3ef8 208 }
Uan 0:feecd42e3ef8 209
Uan 0:feecd42e3ef8 210 // NOTA: Se utiliza multithreading en lugar de interrupciones en thread0 ya que el uso de funciones
Uan 0:feecd42e3ef8 211 // bloqueantes (ADC, puerto serie) en una interrupción común puede causar problemas.
Uan 0:feecd42e3ef8 212 // Prueba de que el periodo de muestreo se cumple: Si no se cumpliera el periodo de muestreo más exigente,
Uan 0:feecd42e3ef8 213 // daría un error deoverflow del EventQueue
Uan 0:feecd42e3ef8 214