Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:feecd42e3ef8, 2020-06-30 (annotated)
- Committer:
- Uan
- Date:
- Tue Jun 30 07:38:14 2020 +0000
- Revision:
- 0:feecd42e3ef8
Test;
Who changed what in which revision?
| User | Revision | Line number | New 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 |