Go Down

Topic: Armónicos en señales digitales (Read 2337 times) previous topic - next topic

Elmeti

BUenasss, expongo un poco el problema que me sucede, esto me viene pasando hara mas de un mes y no daba con la falla porque ya sabemos como son de puñeteros los armónicos...
Soy un poco principiante en el tema Arduino y me he embarcado en un proyecto de automatizacion de unas persianas, este tiene 3 modos de funcionamiento mediante un conmutador de 3 posiciónes:

1- Modo manual- Este tiene dos pulsadores arriba y abajo, no tiene más función que la de subir y bajar las persianas mientras tienes el dedo pulsado

2-Modo invierno- Este modo sube la persiana automáticamente cuando detecta la suficiente luz que capta mediante una LDR que lleva una señal analógica a la entrada A0 del Arduino y baja cuando no hay suficiente cantidad de luz, en este modo no hace ni caso a los pulsadores.

3-Modo verano- Este modo es parecido al anterior pero al contrario, cuando hay mucha luz la persiana baja, y cuando hay poca esta sube, este modo tampoco hace caso a los pulsadores.

Bien, ya explicado lo que parece que hace falta saber para entrar al detalle os comento:

Resulta que probando en modo manual, solo y exclusivamente cuando el motor se ponia en marcha el programa hacia incoherencias, y no siempre, solo a veces, lo primero que pensé era que: (aunque en modo manual no tuviese que hacer caso a la señal analógica) esta señal analógica estaba envenenada de ruido y por algún motivo extraño me hacia esas locuras el programa, pues bien, apantalle el cable analogico y lo puse a masa, la potencia en mayor medida la encofre en una caja metalica y la fuente de alimentación del arduino también, blinde la caja del arduino por si acaso y esto seguia dando problemas.... Cuando ya por fin me di cuenta de lo que pasaba(o eso espero xD ) al poner el monitor serial de Arduino vi que la señal analógica se leia correctamente, variaba un pelin al entrar en juego los relés pero puedo vivier con esa variación jaja.

Lo que me mosqueó es que metí las variables de los conmutadores de verano e invierno que como podréis ver en el programa están dentro de unos "WHILE", y resulta que de vez en cuando , claro esta, cuando se pone en marcha el dichoso motor, el programa se hace una pasadita por el while del conmutador de invierno o el de verano, pasada que NO tiene que hacer, ya que esos conmutadores debieran estar en valor 0

De toda esta charla viene mi veredicto, parece ser que este motor induce un ruido terrible, tan terrible que es capaz de cambiar una señal digital de 0 a 1.

Y ahora es cuando os pido opinión después de toda esta chapa que os estoy dando :D , como apaciguo ese ruido que me llega a la señal analógica, el motor esta a metro y medio de distancia, y el cable del motor comparte menos de 15 cm de recorrido al lado de el de señal analógica, ¿como es esto posible?, que soluciones se os ocurren?. Por favor no me hagáis apantallar mas cables D: algún condensador en la entrada de la señal digital para que depure el ruido?

Sea lo que sea se agradece cualquier ayuda antes de volverme loco :D:D:D

Saludos y gracias de antemano




Code: [Select]
int pulsadorbajada=0;
int pulsadorsubida=0;
int conmutadorinvierno=0;
int conmutadorverano=0;
int conmutadormanual=0;
int K1subida=9;
int K2bajada=8;
int luxes;
int memoria1=0;//ESTA MEMORIA HACE QUE SOLO SE LEA UNA VEZ LA ORDEN DE MARCHA DE LAS PERSIANAS EN MODO INVIERNO

// LOS RELES FUNCIONAN CON LÓGICA INVERSA

void setup() {
pinMode(K1subida, OUTPUT); //DECLARAMOS RELE K1
pinMode(K2bajada, OUTPUT); //DECLARAMOS RELE K2
pinMode(4, INPUT); // DECLARAMOS LA ENTRADA DEL PULSADOR DE SUBIDA
pinMode(2, INPUT); // DECLARAMOS EL CONMUTADOR EN POSICIÓN INVIERNO
pinMode(3, INPUT); // DECLARAMOS LA ENTRADA DEL PULSADOR DE BAJADA
pinMode(5, INPUT); // DECLARAMOS EL CONMUTADOR EN POSICIÓN VERANO
}


void loop() {
luxes=analogRead(0);
conmutadorinvierno=digitalRead(2);
conmutadorverano=digitalRead(5);
if ((conmutadorinvierno==LOW)&&(conmutadorverano==LOW)){
  conmutadormanual=HIGH;}
  else{
    conmutadormanual=LOW;
  }
// CONMUTADORES DEFINIDOS A PARTIR DE AQUI: POSICIÓN VERANO, INVIERNO Y MANUAL
pulsadorbajada=digitalRead(3);
pulsadorsubida=digitalRead(4);



//WHILE DE CONMUTADOR EN MODO MANUAL (COMPLETADO)



while(conmutadormanual==HIGH)
{
  if ((pulsadorbajada==HIGH)&&(pulsadorsubida==LOW)){
  digitalWrite(K2bajada, LOW);
  digitalWrite(K1subida, HIGH);}
  else if ((pulsadorbajada==LOW)&&(pulsadorsubida==HIGH)){
    digitalWrite(K1subida, LOW);
  digitalWrite(K2bajada, HIGH);}
  else if ((pulsadorbajada==LOW)&&(pulsadorsubida==LOW)){//
    digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);}


  //  DEFINICION DE CONMUTADORES: POSICIÓN VERANO, INVIERNO Y MANUAL Y PULSADORES DE SUBIDA Y BAJADA, YA QUE AL ENTRAR EN ESTE BUCLE UNICAMENTE SE EJECUTA ESTE WHILE
  conmutadorinvierno=digitalRead(2);
conmutadorverano=digitalRead(5);
pulsadorbajada=digitalRead(3);
pulsadorsubida=digitalRead(4);
if ((conmutadorinvierno==LOW)&&(conmutadorverano==LOW)){
  conmutadormanual=HIGH;}
  else{
    conmutadormanual=LOW;
  }
  if(conmutadormanual==LOW){            //HACE QUE AL SALIR DEL BLOQUE WHILE LOS RELÉS SE APAGUEN
   digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);}
  }




  //WHILE DE CONMUTADOR EN MODO INVIERNO (CASI COMPLETO)



while(conmutadorinvierno==HIGH)
{
  if ((memoria1==0)&&(luxes>=700)){
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, LOW);
  delay(10000);
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, HIGH);
  memoria1=1;
  }
  else if ((memoria1==1)&&(luxes<=300)){
    digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, LOW);
  delay(10000);
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, HIGH);
   memoria1=0;}
  else if ((K1subida==LOW)&&(K2bajada==LOW)){//
    digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);}


  //  DEFINICION DE CONMUTADORES: POSICIÓN VERANO, INVIERNO Y PULSADORES DE SUBIDA Y BAJADA, YA QUE AL ENTRAR EN ESTE BUCLE UNICAMENTE SE EJECUTA ESTE WHILE
  luxes=analogRead(0);
  conmutadorinvierno=digitalRead(2);
  if(conmutadorinvierno==LOW){            //HACE QUE AL SALIR DEL BLOQUE WHILE LOS RELÉS SE APAGUEN
   digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);
  memoria1=0;}
  }


 //WHILE DE CONMUTADOR EN MODO VERANO (CASI COMPLETO)

while(conmutadorverano==HIGH)
{
  if ((memoria1==0)&&(luxes<=300)){
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, LOW);
  delay(10000);
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, HIGH);
  memoria1=1;
  }
  else if ((memoria1==1)&&(luxes>=700)){
    digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, LOW);
  delay(10000);
  digitalWrite(K2bajada, HIGH);
  digitalWrite(K1subida, HIGH);
   memoria1=0;}
  else if ((K1subida==LOW)&&(K2bajada==LOW)){//
    digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);}


  //  DEFINICION DE CONMUTADORES: POSICIÓN VERANO, INVIERNO Y PULSADORES DE SUBIDA Y BAJADA, YA QUE AL ENTRAR EN ESTE BUCLE UNICAMENTE SE EJECUTA ESTE WHILE
  luxes=analogRead(0);
  conmutadorverano=digitalRead(5);
  if(conmutadorverano==LOW){            //HACE QUE AL SALIR DEL BLOQUE WHILE LOS RELÉS SE APAGUEN
   digitalWrite(K1subida, HIGH);
  digitalWrite(K2bajada, HIGH);
  memoria1=0;}
  }
}

surbyte

Mas que codigo, sería bueno tener un esquema de como esta todo conectado.

El motor tiene diodo en antiparalelo? O como lo comandas?

Motor de DC o AC?

Esta pregunta es continuación de una consulta similar con el código INVIERNO/VERANO o me parece?

Elmeti

- El motor es de CA monofásico 230V o eso parece si no tiene algún tipo de rectificador dentro, porque se alimenta con monofásica, de todos modos pongo las instrucciónes del motor abajo por si hay duda.

- El motor lo comando mediante un modulo relé de 4 unidades (estos azules típicos), estos ya llevan diodo de protección y opto acopladores integrados creo recordar.
Ahora si , la caja de los relés y el procesador arduino estan en la misma caja , eso lo estoy mejorando para separarlos en distintas cajas y asi evitar inducciones indeseadas por amasijos de cables.

- Voy a intentar hacer un plano sencillo de todo el cableado para que os hagáis una idea.

- La pregunta del código es distinta, es un problema de armónicos, (o eso parece) que es distinta al problema que tenia anteriormente :( , arreglas una cosa y salen 3 mas malas.

Gracias por la ayuda y saludos ;)

surbyte

Veamos alguna característica del motor o algún posible fallo del mismo que este provocando ese ruido eléctrico.
Tenemos en el foro un articulo en el que hemos estado comentando experiencias de problemas similares.
Luego si lo encuentro (aunque yo lo inicié) te lo comparto para que veas soluciones posibles.

1. Jaula metálica para el arduino.
2. Núcleo de ferrite para el cable de alimentación de la fuente con la que alimentas Arduino que bloqueará el ruido electrico.
3. Filtros RFI por la misma razón.
4. Usa relé de estado solido con disparo por cruce por cero para el accionamiento del motor.
Esto hará que el accionamiento no produzca ruido electrico.
5. Considerar revisar el motor de CA por si se comporta mal, o tenga un capacitor en fuga.

Estas soluciones o combinación de ellas han mitigado en general las causas del reinicio o mal comportamiento del Arduino.

Claro que no mencioné los cables apantallados porque no querías escucharlo, jaja

DJuan

Quizás te pase lo mismo que me pasaba a mí, si no has leído mi post, prueba a poner un condensador en cada uno de los pulsadores.

Elmeti

Probare con algunas de las cosas que me habeis dicho, para empezar estoy poniendo los cables de entradas digitales apantallados, reorganizando en cajas metálicas todos los circuitos de potencia y tal.

El arduino ya lo habia forrado con una cubierta metálica y el nucleo de ferrita se lo puse a las entradas digitales pero nada, mas de lo mismo, en cuanto termine la reforma que estoy haciendo pruebo esas soluciones jeje.

Ah, por cierto, el apantallamiento de los cables y las masas de las cajas metálicas donde deben ir conectados? a masa? a tierra de CA supongo que no no? esque soy nuevo en esto de los ruidos jaja me estoy llevando una de tortas xD...

Saludos y gracias por todo ;)

Adjunto el pdf del motor que estoy usando a ver si ahora se digna a subirse que antes me dio error

surbyte

#6
Dec 31, 2017, 07:03 pm Last Edit: Dec 31, 2017, 07:04 pm by surbyte
Como minimo los cables con malla deben ir a la carcaza metálica y ésta debería tener cable a tierra.
No compartas tierra con otros elementos (motores u equipos), hablo de tierra propia.

Elmeti

Entonces, seria conectar la malla del apantallamiento a la caja metálica y ya esta?

Al principio esta malla la  había conectado a tierra, la misma tierra que tiene mi vivienda, conecte esta tierra al enchufe, puse la tierra del motor y también la malla conectada a tierra, entonces... estaria mal esa conexión? No debería conectar el apantallamiento junto a todas las tierras?

Gracias y saludos

Elmeti

Quizás te pase lo mismo que me pasaba a mí, si no has leído mi post, prueba a poner un condensador en cada uno de los pulsadores.
Por cierto DJuan he estado leyendo tu post y la verdad es que suena a horrores a lo que me pasa a mi jaja, tu solución fue poner condensadores en las entradas digitales? de que valor si fue asi? que tension? y que capacidad?

Gracias por todo y saludos

DJuan

Lo puse en paralelo al pulsador, osea, negativo del condensador al pin correspondiente y masa pasando por una resistencia, y el positivo a 3,3v, el condensador es de 0,22μF 10v, con eso me ha sido suficiente. Si no te aclaras con la conexión del condensador, cuando pueda envío foto.

DJuan

#10
Jan 03, 2018, 06:29 pm Last Edit: Jan 03, 2018, 06:35 pm by DJuan
Te dejo una imagen a ver si te sirve:

surbyte

Y porque ese capacitor no se carga y termina dando el estado HIGH a su tiempo t=R*C?

Tu dices Djuan que ese punto en el Pin7 no sube de potencial desde 0 a 5V en un tiempo RC?

Elmeti

Muchisimas gracias, en cuanto termine la reforma del sistema pruebo lo del condensador Djuan, tiene buena pinta y ya se me había pasado por la cabeza pero ni idea de que capacidad ni tensión tenia que tener jaja.

Gracias y saludos ;)

surbyte

A mi me parece raro como esta conectado.

jafox007

Cuando el condensador esta totalmente cargado no circula corriente, abre el circuito.

Go Up