MAX485 medio dúplex Atmega problema de comunicación

5

Quiero que dos atmega32s se comuniquen en un rango de 1000 pies, por lo que decidí usar un cable serial para ello. Sé que rs232 no es una buena manera de comunicarse en este amplio rango, por lo que decidí usar RS485, que es un par equilibrado. Para esto quiero usar chips MAX485 como estos.

AhoraescribítodoelcódigoparausarloylohicefuncionarparaunacomunicaciónporcableconunabateríaquealimentamisATmegas(yloschipsMAX485)(nopuedoproducirelcódigoaquí,yaqueesparaunacompañíadondesolosoyuninterno,perocomofuncionaenbreve,elcódigonoeselproblema).Loqueelprogramabásicamentehaceesqueunaatmegaenvía"Paresh" en serie, la otra atmega lo recibe, hace un strcmp si de hecho se recibe como "Paresh" que envía "Mathur". Si la primera atmega recibe "Mathur", nuevamente envía paresh y el ciclo continúa.

Todo esto funciona bien para el modo serial, cable corto y con una batería de 6V. Pero tan pronto como cambio a un cable CAT-5 obtengo pérdida de paquetes. Imprimí lo que se recibe en una pantalla LCD y después de algunos ciclos (y, a veces, incluso durante la primera transferencia) se reciben extrañas cadenas. Los problemas son:

  1. Funciona para cables cortos, pero no para cables CAT-5 de 30 pies
  2. Funciona con una batería de 6V pero no con una batería de 12 voltios o un adaptador de 12V.
  3. Funciona para cables seriales normales de hasta 10 pies, pero no más que eso.

Las cosas que he intentado son:

  1. Se agregaron capacitores para atenuar cualquier ondulación en el suministro. (470uf caps).
  2. Mayores retrasos entre el cambio de los modos de transmisión a recepción (_delay_ms (3);).
  3. se agregaron límites al suministro a los módulos.
  4. Agregar resistencia de terminal de 120ohm a ambos módulos.

¿Qué debo hacer? Por favor, no sugiera ninguna alternativa a la cosa, me haría daño al pirata informático. ¿Por qué no puedo usar una comunicación RS485 exactamente para el propósito para el que fue diseñada, es decir, la comunicación de larga distancia en serie?

Actualización 1: usé resistencia de terminal de 120ohm. Actualización 2: estoy en una velocidad de transmisión de 9600.

    
pregunta Rick_2047

3 respuestas

4

En mi [in] experiencia, el 99% de los errores de comunicación en serie se deben a discrepancias de sincronización; el otro * 99% se debe al cableado de la hoopla.

  
  • Funciona para cables cortos, pero no para cables CAT-5 de 30 pies
  •   
  • Funciona para cables seriales normales de hasta 10 pies, pero no más que eso.
  •   

El cable CAT-5 es un par trenzado (también, todo lo que he usado también está blindado, pero al parecer esto no es común); Asumo que el "cable serial normal" es dos cables sueltos. A medida que el cableado se alarga, sus agradables tiempos de subida digitales se extienden, reduciendo efectivamente la ventana disponible para muestrear los datos entrantes. Par trenzado ayuda a esto un poco. Lo que esto significa realmente es que su reloj UART debe precalificarse con mayor precisión a la velocidad en baudios que se está utilizando. Los relojes del sistema para comunicaciones perfectas de USART deben ser múltiplos de 1.8432MHz. Comunicaciones de corto alcance puede tolerar algunos errores de porcentaje , pero a medida que la ventana de muestreo se reduce, debe ser más precisa. ¿Cuál es tu error de prescaler (int) y baudios?

prescaler = (int)(F_CPU / (USART_baudrate * 16) - 1)
actual_baudrate = F_CPU / (prescaler * 16)
baud_error = 100% * (1 - actual_baudrate / USART_baudrate)
  
  • Funciona con una batería de 6V pero no con una batería de 12 voltios o un adaptador de 12V.
  •   

¡Esto suena a pescado! Este puede ser un problema completamente diferente, tal vez causando que su widget se reinicie debido a un suministro sucio o una regulación deficiente. Hay problemas de estabilidad con los reguladores lineales LDO y las diferentes cargas capacitivas; puede haber problemas de disipación de un suministro de 12V; Si uno no está usando un regulador LDO, entonces una batería de 6V realmente le dará de 4.5V a 5V, y no estará bien regulada. Los problemas de la fuente de alimentación son propios de una clase y deben corregirse antes de que los periféricos puedan ser depurados de manera efectiva.

Aparte de esto, siempre existe el problema con la interferencia ambiental, o EMI . RS-485 está hecho para esto, pero debe usarse con par trenzado [ cable blindado,] como el cable CAT-5 que ha usado.

** (¿Qué, mi matemática es incorrecta? ¿Sabes quién soy !?))

    
respondido por el tyblu
3

Una cosa que no has mencionado es el uso de resistencias de terminación. RS485 necesita resistencias de terminación en cada punto del bus, generalmente de 120 ohmios.

Consulte este documento publicado por Maxim en el cableado RS485.

    
respondido por el W5VO
2

Actualmente estoy trabajando en un sistema de seguridad Maglock Door, y estoy usando estos mismos chips para transmitir datos desde el lector RFID a un Arduino a unos 200 pies de distancia. Yo también he tenido todo tipo de problemas con estos molestos, pero increíbles :), chips. No estoy seguro de estar operando al 100% a prueba de tontos todavía, pero aquí hay algunas cosas que he descubierto:

• Hay una compensación entre la tasa de transferencia y la susceptibilidad a EMI. El MAX485 tiene una alta tasa de transferencia, pero está muy influenciado por EMI. Prueba el MAX483. El mismo chip con una velocidad de transferencia más lenta, pero muy poco EMI.

• En algunos casos, como con una larga distancia de cable, he encontrado que funciona mejor sin ninguna resistencia de terminación ... no me preguntes por qué. :)

• Asegúrese de que los pines DE y RE estén conectados a tierra o a + 5V. No se requiere que estén conectados dependiendo de si estás en modo de transmisión o recepción, pero podría jurar que he tenido mejores resultados cuando ninguno de ellos queda flotando.

    
respondido por el tybro0103

Lea otras preguntas en las etiquetas