|
| 1 | +// Ajustes de funciones |
| 2 | +//-------------------------------------------------------------------------- |
| 3 | +const int NUM_MUESTRAS = 500; // Número de muestras (ajustable) |
| 4 | +const int TIEMPO_LECTURA = 100; // Duración de la lectura en milisegundos |
| 5 | +const int esperaUs = 100; // Espera entre cada medicion en microsegundos |
| 6 | + |
| 7 | +float factorSensor = 30.0; // Factor del sensor (ajustable) |
| 8 | +float valorMinLecturaRMS = 0.25; // Valor mas bajo que se puede registrar. Para eliminar ruido. |
| 9 | +float factorAmplificador = 10; // Ajusta el valor según la amplificación del ccircuito de entrada |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | +// Funcion para calcular la corriente RMS |
| 14 | +// ----- Similar a la utilizada en: https://naylampmechatronics.com/blog/51_tutorial-sensor-de-corriente-ac-no-invasivo-sct-013.html |
| 15 | +//-------------------------------------------------------------------------- |
| 16 | + |
| 17 | + |
| 18 | +// Funcion 1: Toma una serie de lecturas mediante un ADC y devuelve el voltaje RMS. Tambien asigna el offset a la direccion de memoria indicada. |
| 19 | +//================================================================== |
| 20 | +float medirValorRMS(int pinSensor, float * voltajes, float &offset){ |
| 21 | + long tiempoInicial = millis(); |
| 22 | + |
| 23 | + // Paso 1: Leer y guardar voltajes durante un tiempo específico |
| 24 | + int i = 0; |
| 25 | + while (millis() - tiempoInicial < TIEMPO_LECTURA && i < NUM_MUESTRAS) { |
| 26 | + voltajes[i] = analogRead(pinSensor) * (3.4 / 4096.0); // Conversión a voltaje |
| 27 | + i++; |
| 28 | + ets_delay_us(esperaUs); |
| 29 | + } |
| 30 | + |
| 31 | + // Paso 2: Calcular el offset (promedio de los voltajes leídos) |
| 32 | + offset = 0; |
| 33 | + for (int j = 0; j < i; j++) { |
| 34 | + offset += voltajes[j]; |
| 35 | + } |
| 36 | + offset /= i; // Offset promedio |
| 37 | + |
| 38 | + // Paso 3: Calcular el RMS sin el offset |
| 39 | + float sumatoriaCuadrados = 0; |
| 40 | + for (int j = 0; j < i; j++) { |
| 41 | + float voltajeCorregido = voltajes[j] - offset; |
| 42 | + float corriente = voltajeCorregido * factorSensor; // Convertir voltaje a corriente |
| 43 | + sumatoriaCuadrados += sq(corriente); |
| 44 | + } |
| 45 | + float valorRMS = sqrt(sumatoriaCuadrados / i); // Calcular RMS |
| 46 | + |
| 47 | + if(valorRMS<valorMinLecturaRMS) return 0; // Filtro de valores muy bajos |
| 48 | + return valorRMS; |
| 49 | +} |
| 50 | + |
| 51 | +// Funcion 2: Utiliza la funcion 1 para adaptar el valor RMS a un valor de corriente equivalente segun el sensor |
| 52 | +//================================================================== |
| 53 | +float calcularCorrienteRMS(float &valorRMS, float &offset) { |
| 54 | + return valorRMS * (factorSensor/factorAmplificador); // convierte el valor de voltaje RMS medido a la corriente equivalente segun sensor |
| 55 | +} |
| 56 | + |
| 57 | + |
| 58 | +// Funcion 3: Calcula la frecuencia segun los datos. |
| 59 | +//================================================================== |
| 60 | +float calcularFrecuencia(float * voltajes, float offset, float period){ |
| 61 | + // ... por hacer |
| 62 | +} |
| 63 | + |
| 64 | + |
| 65 | + |
0 commit comments