Versao com funcionalidades de cálculo de período e defasagem.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
virgilio
Date:
Sun Apr 19 01:08:28 2015 +0000
Commit message:
Versao 2.06

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Apr 19 01:08:28 2015 +0000
@@ -0,0 +1,190 @@
+// Mede dois sinais
+#include "mbed.h"
+#include "math.h" // Descomente esta linha caso queira usar funções como sin(x)
+
+#include "signal.h"
+
+
+Ticker flipper;
+AnalogIn ain0(PTB0);
+AnalogIn ain1(PTB1);
+DigitalOut myled(LED1);
+int aux2 = 0; // Variavel auxiliar, para indicar quando realizar uma amostragem
+
+int i =0;
+float soma_canal0 = 0, soma_canal1, soma_quadrados_canal0, soma_quadrados_canal1 =0;
+
+float media_dc_canal0, media_dc_canal1, media_ac_canal0, media_ac_canal1;
+
+float tensao_maxima = 3.3;
+
+void flip() {
+ aux2 = !aux2;
+}
+// Classe Signal ------------------------
+class Signal {
+    public:
+    float signal_array[1000];
+    char signal_type;
+    void generate(char signal_tyoe, float amplitude, float ordinary_frequency); 
+    // q for quadrate, s for senoidal, t for triangular
+    void erase();
+    float soma();
+    float eficaz();
+    float amplitude();
+    float period(float dc_value);
+    };
+   
+void Signal::generate(char signal_tyoe, float amplitude, float ordinary_frequency){
+    int count;
+    float angular_frequency = 2*3.1415*ordinary_frequency;
+        
+    for(count = 0; count <1000; count++){
+        if (signal_tyoe == 's') {
+            angular_frequency = count;
+            signal_array[count] = amplitude*cos(angular_frequency);
+                
+            }  
+        }    
+    }
+    
+void Signal::erase(){
+    int count;
+        
+    for(count = 0; count <=1000; count++){
+            signal_array[count] = 0;
+        }  
+    }    
+    
+float Signal::soma(){
+    int count;
+    float soma = 0;
+        
+    for(count = 0; count <1000; count++){
+            soma += signal_array[count];
+        }  
+    return soma;
+    }   
+    
+float Signal::eficaz(){
+    int count;
+    float soma_quadrados = 0;
+        
+    for(count = 0; count <1000; count++){
+            soma_quadrados += signal_array[count]*signal_array[count];
+        }  
+
+    return sqrt(soma_quadrados);
+    } 
+    
+float Signal::amplitude(){
+    int count;
+    float amplitude = signal_array[0];
+    
+    for(count = 1; count <1000; count++){
+        if (amplitude < signal_array[count])  
+            amplitude = signal_array[count];
+        }  
+
+    return amplitude;
+    } 
+
+float Signal::period(float dc_value){
+    int count;
+    int position, pre_position;
+    int crossings = 0;
+    float period = 0;
+    if (signal_array[0] > dc_value) {
+            pre_position = 1; //acima da linha dc
+        }
+    else{
+            pre_position = 0; //abaixo da linha dc      
+        }
+   
+    for(count = 1; count <1000; count++){
+        if (signal_array[count] > dc_value) {
+             position = 1; //acima da linha dc
+            }
+        else{
+             position = 0; //abaixo da linha dc      
+            }   
+               
+        if (position != pre_position){
+            period += (count - period);
+            crossings += 1;
+            pre_position = position;
+        }  
+    }
+    return (period/crossings)*2;
+    } 
+// Classe Signal - END   
+
+// ---------------MAIN------------------------------
+
+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];
+
+    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;
+            contador++;
+        }
+    }
+
+    flipper.detach(); /* para o ticker */
+    myled = 1; 
+    // Apaga led quando termina
+    
+    // Coloque aqui o seu programa para tratamento dos dados.
+ 
+    printf("\n MULTIMETRO DIGITAL versao 1.06 \n\r");
+    //gera sinais artificiais para teste
+    // deixe comentado se quiser utilizar a amostragem normal
+
+    Signal canal0;
+    Signal canal1;
+
+    canal0.generate('s', 1, 1000);
+    // gera sinal s - senoidal, amplitude = 1 e frequencia = 1kHz
+    
+    canal1.generate('s', 1, 2000);
+    // gera sinal s - senoidal, amplitude = 1 e frequencia = 2kHz
+    
+
+    printf("\n Terminada a aquisicao \n \r");
+         
+//         printf("%.2f  ",sinal0[i]);
+//         soma_canal0 += sinal0[i];
+//         soma_quadrados_canal0 += sinal0[i]*sinal0[i];
+
+    //printf("Soma Canal 0 %.2f ",soma_canal0);   
+    //printf("Soma dos quadrados canal 0 %.2f ",soma_quadrados_canal0);     
+    
+    media_dc_canal0 = canal0.soma()*ts/0.1;
+    media_dc_canal1 = canal1.soma()*ts/0.1;
+    media_ac_canal0 = canal0.eficaz()*sqrt(ts/0.1);
+    media_ac_canal1 = canal1.eficaz()*sqrt(ts/0.1);    
+        
+        
+    printf("Tensao DC Canal 0: %4.2f \n\r",tensao_maxima*media_dc_canal0);   
+    printf("Tensao eficaz AC canal 0: %4.2f \n\r",tensao_maxima*media_ac_canal0);          
+    printf("Tensao DC Canal 1: %4.2f \n\r",tensao_maxima*media_dc_canal1);   
+    printf("Tensao eficaz AC canal 1: %4.2f \n\r",tensao_maxima*media_ac_canal1);          
+
+// Calculo do delta t sendo Canal 0 como referencia
+
+
+
+
+
+} 
+//fim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Apr 19 01:08:28 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/487b796308b0
\ No newline at end of file