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);
}
Tags:
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por