Autor Tema: Luchando contra el ruido POR SOFTWARE  (Leído 80535 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #105 en: 28 de Diciembre de 2014, 10:18:34 »
como hago filtro básico por software para un voltimetro filtro básico por software sumando variables y tomando mediciones me tilde y no se me ocurre , en c por favor

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4583
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #106 en: 28 de Diciembre de 2014, 17:24:24 »
Código: C#
  1. //Haz un promedio de las mediciones tomadas ...
  2.  

 :mrgreen: :mrgreen: :mrgreen: :mrgreen:
El papel lo aguanta todo

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #107 en: 28 de Diciembre de 2014, 18:24:48 »
como seria un ejemplo de como armo el programa y como hago la lectura del adc

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7332
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #108 en: 28 de Diciembre de 2014, 19:04:15 »
como seria un ejemplo de como armo el programa y como hago la lectura del adc

Y depende :3 si lo haces con interrupciones, en cada interrupcion sumas el valor del ADC en una variable y luego de una x cantidad de variables dividis. Y ese es tu valor.

Si no lo haces con interrupciones, Hacelo con delays y toma datos a un intervalo regular de tiempo, acordate que mientras estes en un delay no vas a poder hacer nada.

Lo mejor es que tomes una cantidad de datos que sea potencia de 2, asi con simples rotaciones lo dividis (4,8,16) , pero intenta que sea a intervalo regulares de tiempo.

Un ejemplo... si mostras tus datos en un LCD cada 0.5 segundo,  entonces podes tomar datos cada 62.5mS y cuando llegue al 8vo dato ( dividis por 8 y mostras en el LCD )

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #109 en: 29 de Diciembre de 2014, 07:42:00 »
asea que seria
variable 1
delay
variable2
delay
variable3
delay
variable4
1+2+3+4=variable5
variable5=read_adc

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #110 en: 29 de Diciembre de 2014, 12:34:39 »
 while (true)
   {
   set_adc_channel(0);
   delay_us(20);
   for(var1=0;var1<8;var1++)
   {
      volt = read_adc();
      delay_us(20);
   }
   
  var2=var2+volt;
  var1=var1+1;
   valor=volt/8;
   valor=volt*50/1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor );
   delay_ms(500);
  asi seria el código para el resultado de variables para un voltimetro , me parece que le estoy pifiando

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7332
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #111 en: 29 de Diciembre de 2014, 13:46:44 »
while (true)
   {
   set_adc_channel(0);
   delay_us(20);
   for(var1=0;var1<8;var1++)
   {
      volt = read_adc();
      delay_us(20);
   }
  
  var2=var2+volt;
  var1=var1+1;
   valor=volt/8;
   valor=volt*50/1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor );
   delay_ms(500);

Si le estas errando xD, algunas cosas, si no fueras a cambiar el canal del A/D y siempre usas el canal 0 sacaria el:

   set_adc_channel(0);
   delay_us(20);

afuera del while. Tambien la variable volt deberia ser de 16bits y la variable valor un float...

Citar
while (true)
   {
   for(var1=0;var1<8;var1++)
   {
      volt += read_adc();
      delay_us(62);
   }
 
   valor = volt / 8; // No se como lo tomara el compilador si es mejor asi o rotarlo 3 posiciones, es decir valor = volt >> 3
   valor = valor * 50 / 1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor );

Modifique asi no hay no aparece el ultimo delay, para eso hice que la sumatoria de todos los delays de la toma de datos te de 500mS, asi en ningun momento deja de tomar datos (500ms/8 = 62.5mS). Sino estarias tomando datos por un momento y luego nada. Espero que se entienda lo que quise decir. De todas formas cada 500mS aproximadamente el LCD se va a actualizar.

Puse en negrita lo que cambie, o las lineas que cambiaron.
« Última modificación: 29 de Diciembre de 2014, 13:49:41 por KILLERJC »

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #112 en: 29 de Diciembre de 2014, 16:05:23 »
se me dispara empezando a contar asendente y no para

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #113 en: 29 de Diciembre de 2014, 16:27:58 »
todo el programa es asi


void main(){
int var1=0;
 float valor=0,volt,valor2,amper;

//Se habilita el A/D y se declara el PORT a usar

 setup_adc_ports(an0_an1_an3);
setup_adc(adc_clock_div_32  );           

 

 
//Se inicia la LCD
   lcd_init();
   lcd_gotoxy(3,1);
   lcd_putc("iniciando");
   delay_ms(2000);
   lcd_gotoxy(7,2);
   lcd_putc("LPK");
   

   delay_ms(500);
   lcd_putc("\f");
   lcd_gotoxy(2,1);
   lcd_putc("Volt     Amper");
      delay_ms(1000);


   
  while (true){
  set_adc_channel(0); 
   delay_us(20);
  {
   for(var1=0;var1<8;var1++)
   {
      volt= read_adc();
      delay_us(62);
   }
 
   valor = volt / 8;
   valor = valor * 50 / 1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor);
 
   
   set_adc_channel(3); 
   delay_us(20);
   amper = read_adc();
   delay_us(500);
   valor2=amper*18/1023;
   lcd_gotoxy(11,2);
   printf(lcd_putc,"%04.3f",valor2);
   delay_ms(200);
 
   }
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7332
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #114 en: 29 de Diciembre de 2014, 19:23:49 »
A mi gusto son muchos delays pero cambiarlo implicaria uso de timers y interrupciones asi que mejor lo dejamos asi xD o es tema para otro dia.

No cambiaste:

Código: [Seleccionar]
volt= read_adc();  
por ( fijate el += )  
Código: [Seleccionar]
volt += read_adc();o que es lo mismo que poner
Código: [Seleccionar]
volt = volt + read_adc();
se me dispara empezando a contar asendente y no para

No me doy cuenta donde estas contando ascendente, el for deberia terminar si o si.
« Última modificación: 29 de Diciembre de 2014, 19:27:11 por KILLERJC »

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #115 en: 29 de Diciembre de 2014, 20:56:47 »
Cuando lo simulo en el proteus los volt suben y no paran

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7332
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #116 en: 29 de Diciembre de 2014, 21:04:31 »
Si perdon, antes de entrar al for pone

Citar
volt = 0;

Asi resetea el valor. Cuando comienza a tomar las demas medidas.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #117 en: 30 de Diciembre de 2014, 07:32:30 »
#include <16f873a.h>
#device adc=10
#fuses NOWDT,BROWNOUT,XT,NOLVP,PUT
#use delay (clock=4m)
#define use_portb_lcd true
#include <lcd.c>


void main(){
int var1=0;
 float valor=0,volt=0,valor2,amper;

//Se habilita el A/D y se declara el PORT a usar

 setup_adc_ports(an0_an1_an3);
setup_adc(adc_clock_div_32  );           

 

 
//Se inicia la LCD
   lcd_init();
   lcd_gotoxy(3,1);
   lcd_putc("iniciando");
   delay_ms(2000);
   lcd_gotoxy(7,2);
   lcd_putc("LPK");
   

   delay_ms(500);
   lcd_putc("\f");
   lcd_gotoxy(2,1);
   lcd_putc("Volt     Amper");
      delay_ms(1000);


   
  while (true){
  set_adc_channel(0); 
   delay_us(20);
  {
   for(var1=0;var1<8;var1++)
   {
      volt=volt+ read_adc();
      delay_us(62);
   
 
   valor = volt / 8;
   
   valor = valor * 50 / 1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor);
   }
   
   set_adc_channel(3); 
   delay_us(20);
   amper = read_adc();
   delay_us(500);
   valor2=amper*18/1023;
   lcd_gotoxy(11,2);
   printf(lcd_putc,"%04.3f",valor2);
   delay_ms(200);
 
   }
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7332
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #118 en: 30 de Diciembre de 2014, 11:16:26 »
Código: [Seleccionar]
#include <16f873a.h>
#device adc=10
#fuses NOWDT,BROWNOUT,XT,NOLVP,PUT
#use delay (clock=4m)
#define use_portb_lcd true
#include <lcd.c>


void main(){
int var1=0;
float valor=0,volt=0,valor2,amper;

//Se habilita el A/D y se declara el PORT a usar

 setup_adc_ports(an0_an1_an3);
setup_adc(adc_clock_div_32  );            

//Se inicia la LCD
   lcd_init();
   lcd_gotoxy(3,1);
   lcd_putc("iniciando");
   delay_ms(2000);
   lcd_gotoxy(7,2);
   lcd_putc("LPK");
  

   delay_ms(500);
   lcd_putc("\f");
   lcd_gotoxy(2,1);
   lcd_putc("Volt     Amper");
      delay_ms(1000);


  
  while (true){
  set_adc_channel(0);  
   delay_us(20);
   volt = 0;     // ACA es donde decia
   for(var1=0;var1<8;var1++)
   {
      volt=volt+ read_adc();
      delay_us(62);
   }
 
   valor = volt / 8;
   valor = valor * 50 / 1023;
   lcd_gotoxy(2,2);
   printf(lcd_putc,"%04.2f",valor);
  
  
   set_adc_channel(3);  
   delay_us(20);
   amper = read_adc();
   delay_us(500);
   valor2=amper*18/1023;
   lcd_gotoxy(11,2);
   printf(lcd_putc,"%04.3f",valor2);
   delay_ms(200);
  
   }
}

Asi cada ves que comienza a hacer le promedio de las medidas comienza de 0 y no del valor que habia dejado antes ( del ultimo promedio ) que era el problema que tenias vos.
« Última modificación: 30 de Diciembre de 2014, 11:18:47 por KILLERJC »

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 70
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #119 en: 30 de Diciembre de 2014, 11:33:45 »
si funciona bastante bien ahora como puedo hacer que se vea mejor en. el lcd se ven los últimos dígitos muy movedizos se puede hacer que se vea como el tester bien quietos