Unidos pela Paes / Mbed 2 deprecated tarefa1

Dependencies:   mbed

Fork of tarefa1 by Pedro Mendes

Tarefa1.cpp

Committer:
pmcmendes
Date:
2015-03-12
Revision:
3:14310c47674c
Parent:
2:7476f7336e9a
Child:
4:ee911115dcb6

File content as of revision 3:14310c47674c:

// Mede dois sinais
#include <stdio.h>

#include <stdlib.h>
#include "mbed.h"
#include "math.h" // Descomente esta linha caso queira usar funções como sin(x)

#define ESCALA_DE_TENSAO 3.3
#define TAM_VALORES_MEDIA_AMPLITUDE 10

Timer t;
Ticker flipper;
AnalogIn ain0(PTB0);
AnalogIn ain1(PTB1);
DigitalOut myled(LED1);
int aux2 = 0; // Variavel auxiliar, para indicar quando realizar uma amostragem

typedef struct {
    float valorMedido;
    float tempo;
} Medida;

void flip() {
    aux2 = !aux2;
}

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;
}

float calculaMedia(float *vetorValores, int tamVetorValores) {
   float soma = 0;
   for (int i = 0; i < tamVetorValores; i++) {
       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;
  
   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);

   float amplitude = (mediaValoresMaximos - mediaValoresMinimos) * ESCALA_DE_TENSAO;
   float tensaoEficaz = amplitude / (sqrt((float) 2));

   // 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);

   return tensaoEficaz;
}

double calculaTensaoACIntegral(float *vetorMedidas, int tamVetorMedidas) {

   return 0;
}

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;

    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;
            aux2 = 0;
            n1 += sinal1[contador];
            contador++;
        }
    }
   
    sinalDC = n1/tamanho * ESCALA_DE_TENSAO;
   
    flipper.detach(); /* para o ticker */
    myled = 1;   
   
   
       printf ("A tensao DC e: %f ", sinalDC);


   printf ("A tensao AC eh: %f.2", calculaTensaoACSenoidal(sinal0, tamanho));

       

// Apaga led quando termina
// Coloque aqui o seu programa para tratamento dos dados.
}