Unidos pela Paes / Mbed 2 deprecated tarefa1

Dependencies:   mbed

Fork of tarefa1 by Pedro Mendes

Files at this revision

API Documentation at this revision

Comitter:
pmcmendes
Date:
Thu Mar 19 12:50:26 2015 +0000
Parent:
3:14310c47674c
Commit message:
para fazer tarefa 2

Changed in this revision

Tarefa1.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Tarefa1.cpp	Thu Mar 12 13:50:57 2015 +0000
+++ b/Tarefa1.cpp	Thu Mar 19 12:50:26 2015 +0000
@@ -6,7 +6,11 @@
 #include "math.h" // Descomente esta linha caso queira usar funções como sin(x)
 
 #define ESCALA_DE_TENSAO 3.3
+
+#define ESCALA_DE_TENSAO_AC 3.3
+#define ESCALA_DE_TENSAO_DC 3.3
 #define TAM_VALORES_MEDIA_AMPLITUDE 10
+#define LIMITE_RECONHECIMENTO_PICO 0.8
 
 Timer t;
 Ticker flipper;
@@ -25,93 +29,101 @@
 }
 
 int compare (const void* a, const void * b) {
-   const float *ia = (const float *) a;
-   const float *ib = (const float *) b;
-   
-   if (*ia < *ib) return 1;
-   if (*ia > *ib) return -1;
-   else return 0;
+  const float *ia = (const float *) a;
+  const float *ib = (const float *) b;
+
+  if ((*ia) < (*ib)) return 1;
+  if ((*ia) > (*ib)) return -1;
+  else return 0;
 }
 
 float calculaMedia(float *vetorValores, int tamVetorValores) {
-   float soma = 0;
-   for (int i = 0; i < tamVetorValores; i++) {
-       soma += vetorValores[i];
-   }
-
-   return (soma / tamVetorValores);
+  float soma = 0;
+  for (int i = 0; i < tamVetorValores; i++) {
+      if (vetorValores[i] < ESCALA_DE_TENSAO) soma += vetorValores[i];
+  }
+  return (soma / tamVetorValores);
 }
 
-double calculaTensaoACSenoidal(float * vetorMedidas, int tamVetorMedidas) {
-   const int tamValores = TAM_VALORES_MEDIA_AMPLITUDE;
-   float valoresMaximos[tamValores];
-   float valoresMinimos[tamValores];
-   float mediaValoresMaximos, mediaValoresMinimos;
+double calculaAmplitude(float * vetorMedidas, int tamVetorMedidas) {
+  const int tamValores = TAM_VALORES_MEDIA_AMPLITUDE;
+  float valoresMaximos[tamValores];
+  float valoresMinimos[tamValores];
+  float mediaValoresMaximos, mediaValoresMinimos;
+  qsort(vetorMedidas, tamVetorMedidas, sizeof(float), compare);
   
-   qsort(vetorMedidas, tamVetorMedidas, sizeof(float), compare);
-
-   for (int i = 0; i < tamValores; i++) {
-       valoresMaximos[i] = vetorMedidas[i];
-       valoresMinimos[i] = vetorMedidas[(tamVetorMedidas - 1) - i];
-   }
-
-   mediaValoresMaximos = calculaMedia(valoresMaximos, tamValores);
-   mediaValoresMinimos = calculaMedia(valoresMinimos, tamValores);
+  for (int i = 0; i < tamValores; i++) {
+      valoresMaximos[i] = vetorMedidas[i];
+      valoresMinimos[i] = vetorMedidas[(tamVetorMedidas - 1) - i];
+  }
 
-   float amplitude = (mediaValoresMaximos - mediaValoresMinimos) * ESCALA_DE_TENSAO;
-   float tensaoEficaz = amplitude / (sqrt((float) 2));
+  mediaValoresMaximos = calculaMedia(valoresMaximos, tamValores);
+  mediaValoresMinimos = calculaMedia(valoresMinimos, tamValores);
 
-   // Para printar valores maximos e minimos
-   printf("Vetor de valores MAX: [");
-   for(int i = 0; i < tamValores; i++) {
-       printf(" %.2f,", valoresMaximos[i]);
-   }
-   printf("]\n\r");
-   printf("Vetor de valores MIN: [");
-   for(int i = 0; i < tamValores; i++) {
-       printf("%.2f, ", valoresMinimos[i]);
-   }
-   printf("]\n\r");
-   printf("Media valores MAX: %.2f\n\r", mediaValoresMaximos);
-   printf("Media valores MIN: %.2f\n\r", mediaValoresMinimos);
-   printf("Amplitude calculada em volts: %.2f\n\r", amplitude);
-   printf("Tensao eficaz de %.2f volts\n\r", tensaoEficaz);
+  float amplitude = (mediaValoresMaximos - mediaValoresMinimos);
+  
 
-   return tensaoEficaz;
+  printf("Media superior: %.2f  Media inferior:  %.2f   Amplitude pico-a-pico: %.2f\n\r", mediaValoresMaximos, mediaValoresMinimos, amplitude);
+  return amplitude;
 }
 
-double calculaTensaoACIntegral(float *vetorMedidas, int tamVetorMedidas) {
+float * filtrarMatrizPorAmplitudeMinima(float * vetorMedidas, int tamVetorMedidas, float limite) {
+    return NULL;
+    }
+
+float calculaTensaoDC(float *vetorMedidas, int tamVetorMedidas) {
+    return calculaMedia(vetorMedidas, tamVetorMedidas);
+}
 
-   return 0;
+float calculaTensaoACSenoidal(float *vetorMedidas, int tamVetorMedidas, float tensaoDC) {
+    float amplitude = calculaAmplitude(vetorMedidas, tamVetorMedidas);
+    float tensaoEficazAC = amplitude/sqrt((float) 2);
+    float tensaoTotal = sqrt(tensaoEficazAC*tensaoEficazAC + tensaoDC*tensaoDC);
+    //printf("Amplitude:%.2f     Tensao Eficaz AC: %.2f     Tensao DC: %.2f \n\r", amplitude, tensaoEficazAC, tensaoDC);
+    return tensaoTotal;
 }
 
+float calculaTensaoACPeriodica(float *vetorMedidas, int tamVetorMedidas) {
+    // detectar picos, tempo de execucao, preciso de periodo e velocidade
+    // v = lambda * f
+    // mesmo assim preciso de ideia de tempo
+    float n = 0;
+    for(int i = 0; i < tamVetorMedidas; i++)
+        n += vetorMedidas[i]*vetorMedidas[i] * 0.0001;
+    return sqrt(n / 0.1);
+        
+}
+
+
 int main()
 { // valor mínimo de ts: ~0.0001 (10 kHz)
     int contador = 0, tamanho=1000; // Tamanho dos vetores de amostras.
     float ts = 0.0001, sinal0[tamanho], sinal1[tamanho], n1= 0, sinalDC;
-
+    wait(1);
     myled = 0; // Acende led
     flipper.attach(&flip, ts); // chama a funcao flip apos ts segundos
     while(contador<tamanho) {
         if(aux2 == 1){
-            sinal0[contador] = ain0; // lê sinais analógicos de dois canais
-            sinal1[contador] = ain1;
+            sinal0[contador] = ain0 * ESCALA_DE_TENSAO; // lê sinais analógicos de dois canais
+            sinal1[contador] = ain1 * ESCALA_DE_TENSAO;
             aux2 = 0;
             n1 += sinal1[contador];
             contador++;
         }
     }
    
-    sinalDC = n1/tamanho * ESCALA_DE_TENSAO;
    
     flipper.detach(); /* para o ticker */
     myled = 1;   
-   
+    printf ("############# MULTIMETRO UPP ##############\n\r");
+
    
-       printf ("A tensao DC e: %f ", sinalDC);
-
-
-   printf ("A tensao AC eh: %f.2", calculaTensaoACSenoidal(sinal0, tamanho));
+    float tensaoDC = calculaTensaoDC(sinal1, tamanho);
+    //float tensaoAC = calculaTensaoACSenoidal(sinal1, tamanho, tensaoDC);
+    float tensaoAC = calculaTensaoACPeriodica(sinal1, tamanho);
+    printf("\n\n\n\n");
+    printf ("A tensao DC e: %.2f \n\r", tensaoDC);
+    printf ("A tensao AC e: %.2f \n\n\n\r", tensaoAC);