Ruido del cambio de ventiladores cercanos que interrumpe el bus I2C

1

Tengo un RPi que controla un sistema solar que usa sensores de temperatura en el bus I2C, los sensores están lejos del RPi (20 m). El problema es que tengo torres de refrigeración y compresores de refrigeración que tienen altas corrientes de conmutación. Al principio probé el I2C y no funcionó con la frecuencia predeterminada. Así que reduje la frecuencia con la que funcionó por un tiempo. Sin embargo, cada vez que algunos de los fanáticos comienzan a funcionar, pierdo algunas lecturas durante un par de segundos y los sensores comienzan a actuar de forma extraña.

Creo que es un problema de ruido, especialmente porque mi fuente de alimentación de 230 VCA proviene de la misma fuente de alimentación de 3 ~ ph de los ventiladores.

¿Cuál sería la mejor manera de proteger las señales en el bus I2C? Ahora uso cable CAT5 para cablear los sensores. Quería usar CAT7, pero luego leí que esto en realidad lo empeoraría ya que CAT7 tiene una capacidad más alta, lo que es peor para el autobús en distancias más largas.

Más información:

Actualmente estoy usando 10kHz ya que el valor predeterminado de 100kHz no funcionó. Sin embargo, en una configuración similar (pero sin los ventiladores cercanos) me salí con 100kHz y más de 20m sin extensores ni nada. El sistema ha estado funcionando sin problemas durante más de 2 años. Por eso creo que es un problema de ruido.

    
pregunta big_mu5

4 respuestas

4

IIC va a ser problemático. Usted está enviando una señal de reloj a los dispositivos remotos y esa señal de reloj (cuando llega) devuelve datos al maestro y el maestro lee los datos volviéndolos a sincronizar, pero el reloj que usa el maestro ahora se parece poco al reloj. Se retrasó el reloj en el sensor y los datos que regresan se retrasan aún más. Esto tiene que significar correr tan lento como puedas.

Dado que tiene problemas de interferencia, le sugeriría que coloque los cables coaxiales del reloj y de los datos (al menos inténtelo para ver si ayuda), no ayudará a que los datos estén más alineados con el reloj en el maestro, pero podría detenga la interferencia dándole un tiempo difícil.

Tuve que enviar el bus SPI a un dispositivo remoto a 10 m: los datos se enviaban solo desde el maestro, por lo que tanto el reloj como los datos estaban correctamente alineados (longitud del cable a la misma distancia). Estaba usando un reloj de 2 MHz, pero decidí que el único La forma en que funcionaría de manera confiable fue con controladores y receptores diferenciales tanto en el reloj como en los datos. Por supuesto, funcionó y podría haberme salido con la suya, pero estoy seguro de que el cable normal no blindado y los datos y el reloj de una sola terminación no funcionarán de manera confiable.

    
respondido por el Andy aka
4

Según esta fuente que es una pregunta frecuente sobre el protocolo de bus I2C.

Esto sugiere que las longitudes típicas son de 3-4 metros, y con el reloj de serie que funciona tan lento como 500Hz en aplicaciones de 100 metros se sabe que funcionan.

Le sugiero que reduzca significativamente la velocidad de reloj de los 100Khz estándar a algo así como 8-10Khz o algo así y haga algunas pruebas.

Además, ¿qué resistencia al arranque del bus I2C tiene? Con una distancia tan larga, la capacitancia del bus debe ser muy alta, por lo que las resistencias deben ser bastante bajas, tal vez de 1,8 a 2K Ohm (como se muestra en la sección de Preguntas más frecuentes en realidad).

EDITAR:

¿Puedo sugerir alejarse de los sensores de cables? Puede armar un pequeño paquete muy simple que puede actuar como nodos de sensores inalámbricos. Entonces puedes colocarlos a 80m de distancia si realmente quisieras. Y puede tener muchos de ellos sin preocuparse demasiado por la instalación de cables en todas partes. Dependiendo de su nivel de habilidad / conocimiento de sistemas integrados, es posible que desee algo simple como un Synapse como los que se venden en Sparkfun que admiten todo tipo de redes de malla fresco también si lo desea. De lo contrario, puedes investigar otros diseños más detallados ...

    
respondido por el KyranF
2

Ir difrencial en el I2C echa un vistazo a LVDS. En la práctica, es bastante fácil, todo lo que necesita es un IC en cada lado y está listo.

    
respondido por el Gilad
0

Recomendaría cambiar a un bus diferente y luego colocar microcontroladores pequeños junto a cada sensor para conectar con el bus I2C. I2C realmente no está diseñado para trabajar a esa distancia, especialmente porque es un bus de drenaje abierto. RS232 (puerto serial estándar, asegúrese de usar un cambiador de nivel para obtener los niveles reales de +/- 12 voltios) y RS485 / RS422 (señalización diferencial, semidúplex o dúplex completo, nuevamente asegúrese de obtener el chip de controlador correcto) será mejor capaz de hacer frente a la interferencia a largo plazo. Además, sería posible amortiguar las lecturas en el sensor para que pueda pedir una nueva transmisión si algo se pierde.

La tecnología inalámbrica es otra opción, pero eso conlleva otra lata de gusanos: interferencia de RF, multitrayecto, desvanecimiento, reflexiones, pérdidas de trayectoria, etc. A veces puede ser peligroso hacer que la RF funcione correctamente cuando hay mucha maquinaria y / o grandes objetos metálicos donde intentas comunicarte. Y todavía necesitará un microcontrolador con el sensor para actuar como un puente.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas