Olá, estou fazendo um programa que irá calcular as harmônicas de uma rede, porém, ele só me retorna valores nulos e nan (not a number) para o valor de TDH.

Alguém pode me ajudar?

PS: o interrupt é porque eu imaginei que o vetor de amostras do sinal não parava o loop.

#include

//Constantes
#define pinoserial A0
#define numeroamostras 160
#define harmonica 7
#define frequencia 60
#define frequenciaamostra 9600
#define tempoamostra (1 / frequenciaamostra)

//Variaveis
float vetoramostra [numeroamostras];
float angulo;
float vetorreal[harmonica + 1];
float vetorimaginario[harmonica + 1];
float vetorharmonica [harmonica + 1];
float valorRMS;
float valorRMSfinal;
float rms1harmonica;
float harmonicatotal;
float ajuste;
float coleta;

unsigned long inicio;
unsigned long fim;

void setup() {

Timer1.initialize(123700);
Timer1.attachInterrupt(teste);
Serial.begin (9600);
ajuste = 1;
}

void teste(){

//INICIO DO CALCULO DAS HARMONICAS
for (int i = 0; i < harmonica; i++) {

//Calculo do angulo
angulo = harmonica * (2 * PI * frequencia) * i * tempoamostra;

//Calcula a contribuicao harmonica
for (int j = 0; j < numeroamostras - 1; j++) {

vetorreal[i] = vetorreal [i] + vetoramostra[j] * cos(angulo);
vetorimaginario[i] = vetorimaginario [i] + vetoramostra [j] * sin(angulo);

// VALOR RMS 1
if (i == 0) {
valorRMS = valorRMS + pow (vetoramostra [i], 2);
}
}

vetorharmonica [i] = 2 * (1 / numeroamostras) * sqrt ((pow (vetorreal [i], 2)) + (pow (vetorimaginario [i], 2))); //calculo do modulo das harmonicas
}
}

void loop() {

// inicio = micros();

//zerando variaveis
valorRMS = 0;
valorRMSfinal = 0;
rms1harmonica = 0;
harmonicatotal = 0;

memset(&vetorreal, 0, sizeof(vetorreal));
memset(&vetorimaginario, 0, sizeof(vetorimaginario));
memset(&vetorharmonica, 0, sizeof(vetorharmonica));

//Coleta de amostras
for (int i = 0; i < numeroamostras-1; i++) {

coleta = analogRead (pinoserial);

vetoramostra [i] = map (coleta, 0, 1023, -30, 30);
}

//fim = micros();
//Serial.print("tempo: ");
//Serial.println(fim-inicio);

//Calcula do modulo das harmonicas

vetorharmonica [0] = (vetorharmonica[0] / 2); //calculo do valor CC

//Conclusao do calculo do valor RMS

valorRMSfinal = sqrt (valorRMS / numeroamostras);

//Calculo de THD

rms1harmonica = (vetorharmonica[1] / (sqrt(2)));

harmonicatotal = sqrt (pow (valorRMSfinal, 2) / (pow(rms1harmonica, 2) - 1));

Serial.print(harmonicatotal);
}

Exibições: 606

Responder esta

Respostas a este tópico

Boa noite LV,

recomendação: Não post sketch na área de texto do tópico,

e leia o tópico:

http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

Rui

Recomendação:

Nunca faça cálculos com ponto flutuante ou qualquer coisa demorada dentro de uma interrupção.

A interrupção precisa ser o mais breve possível.

Sete flags, anote registradores nela. Faça os cálculos no programa principal.

Vai ver o problema todo está aih.

Você esta analisando a frequência da rede elétrica, não é ? Como esta capturando a tensão ?

Esse programa é para Arduino ? Qual modelo esta usando ?

Olá José!

Eu estou usando uma placa Arduino Mega 2560.

Pretendo usar um sensor ACS712, porém, atualmente eu montei um circuito condicionador de sinal com AmpOP para condicionar o sinal entre 0,5 e 4,5 volts e poder variar a frequência.

Sugiro que recorte o seu programa em pequenas partes.

E vai testando cada uma. 

Faça comentários para cada linha de programa, descrevendo o que cada linha faz. 

Assim ficará mais fácil para descobrir o problema. 

Por exemplo >

#define frequenciaamostra 9600  

void setup() {

Timer1.initialize(123700);
Timer1.attachInterrupt(teste);
Serial.begin (9600); 
ajuste = 1; 
}

Porque esta usando o valor de 9600 para a frequencia de amostragem ?

Porque esta usando o valor 123700 para inicializar o Timer 1 ?

ola tu tem como repassar esse programa para mim fazer um trabalho da faculdade?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço