ADC_ZX47.ino
86 lines
| 2.3 KiB
| text/x-arduino
|
ArduinoLexer
/ ADC_ZX47 / ADC_ZX47.ino
|
r2 | #include <math.h> | |
|
r3 | #define pinADC 26 | |
|
r7 | float find_maximun(float *p); | |
|
r1 | int analogValue=0; | |
float Vout=0; | |||
|
r4 | float Plinea=62.5,Vpk=0;// Valor entre 1 y 500 kW, las unidades son kW | |
|
r5 | float Plcal=0,dif=0,difPlow=0; | |
|
r4 | bool serialData=1;//Un valor de 1 indica que se debe ingresar por monitor serial | |
|
r7 | float VoutRef=1,Pmax; | |
|
r3 | int numSamples=20; | |
int total=0; | |||
|
r8 | int contador=0,SIZE=40; | |
float *p, Parray[40]; | |||
|
r1 | void setup() { | |
Serial.begin(115200); | |||
|
r3 | analogSetAttenuation(ADC_11db); | |
|
r2 | if(serialData){ | |
|
r4 | Serial.println("Ingrese la potencia en la linea:"); | |
while (!Serial.available()); // Wait for input | |||
String potLinChar = Serial.readStringUntil('\n'); | |||
Plinea=atof(potLinChar.c_str()); | |||
|
r2 | } | |
|
r4 | Vpk=sqrt(10*Plinea)/5; | |
VoutRef=ecuacionLineal(Vpk); | |||
|
r2 | Serial.print("Voltaje de salida de referencia: "); | |
|
r5 | Serial.print(VoutRef); | |
Serial.print("Voltaje pkpk:"); Serial.print(" "); Serial.println(Vpk); | |||
|
r1 | } | |
void loop() { | |||
|
r3 | total=0; | |
//analogValue = analogRead(pinADC); | |||
|
r5 | /* | |
|
r3 | for (int i = 0; i < numSamples; i++) { | |
total += analogRead(pinADC); | |||
|
r5 | }*/ | |
//int averageValue = total / numSamples; | |||
int averageValue=analogRead(pinADC); | |||
|
r3 | Vout = 0.8291*averageValue+90.27;//Ajuste realizado para el ADC | |
|
r4 | //Serial.println(Vout); | |
Plcal=5*pow((Vout+101),2)/(2*175.19*175.19);//Calculamos la potencia en la línea | |||
|
r8 | //dif=abs(Plinea-Plcal)*100/Plinea;//Hallamos la diferencia porcentual | |
if (Plcal>3){//valores por debajo de este umbral serán leidos como tierra | |||
Parray[contador]=Plcal; | |||
contador =contador+1; | |||
} | |||
//cuando llenamos los valores hacemos la | |||
if (contador==SIZE){ | |||
p=&Parray[0]; | |||
Pmax=find_maximun(p); | |||
contador=0; | |||
dif=abs(Plinea-Pmax)*100/Plinea; | |||
difPlow=abs(Plinea-Pmax); | |||
if(dif>10 && difPlow>7) Serial.println(Pmax); | |||
} | |||
/* | |||
if(dif>10 && Vout>120 ){ | |||
|
r7 | Parray[contador]=Plcal; | |
contador =contador+1; | |||
|
r8 | if(contador==SIZE){ | |
|
r7 | p=&Parray[0]; | |
Pmax=find_maximun(p); | |||
contador=0; | |||
|
r8 | difPlow=abs(Plinea-Pmax); | |
if (difPlow>8) { | |||
Serial.print("Potencia anomala en el transmisor: "); | |||
Serial.println(Pmax); | |||
} | |||
|
r7 | } | |
|
r8 | } */ | |
|
r1 | } | |
|
r4 | float ecuacionLineal(float Vpk){ | |
float m=175.19,b=-101; | |||
return Vout=m*Vpk+b; | |||
|
r2 | } | |
|
r7 | float find_maximun(float *p){ | |
float maxi=*p; | |||
float *q; | |||
q=p; | |||
for(int i=0;i<SIZE;i++){ | |||
if(maxi<*(p+i)) { | |||
maxi=*(p+i); | |||
} | |||
} | |||
return maxi; | |||
} |