Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of tarefa1 by
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. }