Ruido del motor que interfiere con I2C

Construí un robot usando Arduino Due con todos los sensores funcionando a 5V sobre I2C. Hay un cambiador de nivel en ambas líneas I2C. Los motores se controlan mediante un controlador de motor VNH5019 de Polulu (que toma entrada PWM). La velocidad y dirección del motor cambia rápidamente en esta aplicación en particular.

Cuando los motores no están funcionando, todo está bien y las lecturas están bien. Al hacer funcionar todo el robot en el suelo, con los motores, funciona bien durante unos 30 segundos a un minuto antes de que el bus I2C deje de responder por completo. Todos los dispositivos comienzan a expirar en el bus I2C y, como resultado, el robot comienza a comportarse de manera catastrófica. El Arduino tiene que ser reiniciado. Después de un reinicio, tiende a llevar menos tiempo volverse loco.

Hice funcionar los motores con las ruedas levantadas del suelo y obtuve un tiempo de funcionamiento significativamente mejor, por lo que sospecho que tiene algo que ver con la corriente que consumen los motores. Los motores están separados del arduino y la PCB personalizada que uso para enrutar las señales I2C por dos capas de placas de metal (presumiblemente esto proporciona algo de protección). He instalado condensadores cerámicos de 0,1 uF en los terminales del motor y un condensador de 220 uF en la fuente de alimentación del Arduino.

También coloqué pull-ups adicionales antes y después del cambio de nivel, pero nada de esto parece detener el problema.

Actualmente estoy completamente perdido en cuanto a qué más podría hacer para detener el ruido del motor.

Editar: algunos esquemas (por lo que vale)circuito de potencia

Este circuito envía señales a los motores y proporciona energía a los controladores de motor. Vin y GND no están realmente conectados al Arduino. Hay vertidos de cobre para GND y 12V en las dos capas de la PCB para soportar la corriente.

Circuito sensor

Este circuito conecta el bus I2C de Arduino a los distintos componentes. Hay un cambiador de nivel de voltaje de 3V3 a 5V (LS1 y LS2). Los transistores no están en uso.

¿Podría publicar algunos materiales gráficos, como dibujar un esquema con la herramienta en el foro o publicar imágenes? Incluya información sobre cómo se agrupan o conectan las diferentes cosas. Si todo es correcto, debería funcionar bien, pero puede haber un pequeño error en alguna parte. Además, 100 nF a través de un motor que mueve un robot no va a hacer mucho en absoluto, se puede almacenar muy poca energía para marcar la diferencia.
¿Incluso si es un motor pequeño de 12 V con una corriente de bloqueo de 2 A?
Será un problema de tierra/0V empeorado por un enrutamiento potencialmente deficiente del bus IIC. El condensador del motor es una pista falsa: si está utilizando PWM para controlar el motor, existe la posibilidad de destruir el controlador al aumentar la capacitancia.
Si tiene un osciloscopio, ¿puede publicar capturas de pantalla del bus I2C en ambos extremos cuando se ejecuta en el suelo?
@Andyaka El enrutamiento del bus I2C y la potencia del motor son manejados por PCB separados. 0V del controlador y los motores solo se conecta en el terminal de la batería. El motor se controla a través de un controlador de motor adecuado que utiliza PWM como entrada. El arduino y todos los sensores todavía están encendidos y los sensores en serie continúan funcionando. Por lo general, es solo uno de los buses i2c que deja de responder por completo.
@Techydude lo siento, estoy haciendo esto como un proyecto en la escuela secundaria y no tenemos un osciloscopio.
@DrCoconut Incluso sin gráficos de osciloscopio, algunas personas aquí podrán hacer algunas conjeturas razonables, pero es mucho más difícil sin gráficos reales para continuar. Solo un "Esto, esto y esto y todo está conectado así" es mucha menos información que la misma oración que daría con cualquier tipo de esquema o dibujo. No podemos ver los bucles de tierra o la retroalimentación de ruido que puede haber pasado por alto si no hay nada que mirar.
"Funciona bien durante alrededor de 30 segundos a un minuto antes de que el bus I2C deje de responder por completo. Todos los dispositivos comienzan a agotarse en el bus I2C y, como resultado, el robot comienza a comportarse de manera catastróficamente incorrecta. El Arduino debe reiniciarse. Después de un reinicio , tiende a llevar menos tiempo volverse loco". ¿Qué tipo de refrigeración tienes de los interruptores? ¿Qué tan cerca están esos interruptores de un maestro I2C?
A mi me esta pasando un problema muy similar en este momento. ¿Encontraste solución a la tuya?

Respuestas (1)

Los problemas de EMI son frecuentes en dicho diseño y no existe una medicina común para eso. Una cosa que debe hacerse es la separación de tierra: solo conéctelos cerca de la fuente de alimentación. Otro: el mejor filtrado posible en el suministro de accionamiento del motor. Cada malla con alta corriente, incluido el circuito de activación de la puerta, debe ser lo más corta posible. Tal vez las resistencias en las puertas ayuden. Coloque el anillo de ferrita en el cable del motor cerca del conductor. Use búferes para i2c. ¡Buena suerte!