Unidos pela Paes / Mbed 2 deprecated tarefa1

Dependencies:   mbed

Fork of tarefa1 by Pedro Mendes

Tarefa1.cpp

Committer:
pmcmendes
Date:
2015-03-19
Revision:
4:ee911115dcb6
Parent:
3:14310c47674c

File content as of revision 4:ee911115dcb6:

// 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 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;
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++) {
      if (vetorValores[i] < ESCALA_DE_TENSAO) soma += vetorValores[i];
  }
  return (soma / tamVetorValores);
}

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

  printf("Media superior: %.2f  Media inferior:  %.2f   Amplitude pico-a-pico: %.2f\n\r", mediaValoresMaximos, mediaValoresMinimos, amplitude);
  return amplitude;
}

float * filtrarMatrizPorAmplitudeMinima(float * vetorMedidas, int tamVetorMedidas, float limite) {
    return NULL;
    }

float calculaTensaoDC(float *vetorMedidas, int tamVetorMedidas) {
    return calculaMedia(vetorMedidas, tamVetorMedidas);
}

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 * ESCALA_DE_TENSAO; // lê sinais analógicos de dois canais
            sinal1[contador] = ain1 * ESCALA_DE_TENSAO;
            aux2 = 0;
            n1 += sinal1[contador];
            contador++;
        }
    }
   
   
    flipper.detach(); /* para o ticker */
    myled = 1;   
    printf ("############# MULTIMETRO UPP ##############\n\r");

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

       

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