Tengo un sensor que estoy tratando de leer a través de I2C, pero tengo algunos problemas con las resistencias pull-up y el voltaje al que se configurarían.
Mi computadora host es Arduino Nano Every , mientras que mi sensor es el magnetómetro HMC5883L .
A continuación se muestra un diagrama de bloques que muestra mi esquema de cableado.
Investigué un poco sobre el procesador de Nano Every . Los pines I2C están conectados al ATMEGA4809 y se alimenta a +5V. Así, las líneas I2C están referenciadas a un voltaje de 5 voltios. El módulo HMC5883L ya tiene resistencias pull-up para 5 V y 3,3 V, pero si quisiera agregar mis propias resistencias pull-up externas, tendría que hacer referencia a 5 V como se muestra en mi diagrama de bloques, ¿correcto? Si decido referenciarlo a 3,3 voltios (y conectar 3,3 voltios del Nano al pin correspondiente del sensor) dado que el microcontrolador está funcionando a 5 voltios, ¿a qué voltaje debo conectar las resistencias pull-up?
simular este circuito : esquema creado con CircuitLab
Así, las líneas I2C están referenciadas a un voltaje de 5 voltios
No. Están referenciados a un GND.
conectando 3.3 voltios del Nano al pin correspondiente en el sensor
¡No hagas esto! Los 3,3 V del sensor son una salida .
El módulo HMC5883L ya tiene resistencias pull-up para 5V y 3.3V
Si bien son resistencias pull-up, también forman parte del cambiador de nivel integrado, que permite que el sensor de 3,3 V funcione con un bus I2C de 5 V.
si quisiera agregar mis propias resistencias pull-up externas, entonces tendría que hacer referencia a 5V como se muestra en mi diagrama de bloques, ¿correcto?
No hay razón alguna para agregar nada externamente. Sin embargo, si desea hacerlo, entonces sí, puede agregar resistencias pull-up a 5 V, pero luego debe eliminar R3, R4 de la placa del sensor o asegurarse de que sus resistencias adicionales en paralelo con ellos no bajen de un mínimo resistencia permitida (es decir, su pull-up combinado no es demasiado fuerte). Por ejemplo, las resistencias adicionales de 10k darán como resultado un pull-up de 5k, lo que debería estar bien para un bus de 400kHz.
Si decido referenciarlo a 3.3 voltios
Nuevamente, no hay razón para esto, ya que el lado del sensor del cambiador de nivel ya está subido a 3.3V. El lado MCU de las palancas de cambio se eleva a 5V. Si ha utilizado cualquier MCU de 3,3 V, podría haber eliminado las 4 resistencias (R1-R4) y dos MOSFET, cortocircuitar las líneas SDA y SCL para el paso y, finalmente, agregar resistencias pull-up externas a 3,3 V. Pero dado que está utilizando Nano, su MCU es incompatible con el bus I2C de 3.3V.
ACTUALIZAR:
¿Lo que conecte a VIN dependerá del nivel lógico I2C de la MCU?
SÍ para tableros Adafruit, NO en general. Las placas de Adafruit están diseñadas para funcionar con 5 V (VIN), utilizando un regulador interno para bajar a 3,3 V, como usted mismo mencionó. Por lo tanto, la placa funciona con 5 V, sin embargo, el chip del sensor funciona con 3,3 V.
Ahora, el VIN_min para el chip HMC5883L es 2,16 V, para LSM9DS1 es 1,9 V. Teóricamente, puede alimentar las placas a partir de estos voltajes + caída de voltaje en LDO. No significa que tengas que hacerlo. Si desea un comportamiento estable y predecible, le recomiendo alimentar las placas con 5 V siempre que sea posible. Pero sigue leyendo...
Por lo tanto, 5V de Nano a VIN y mis pull-ups.
Tu error es pensar que el VIN tiene algo que ver con los pull-ups. El voltaje del bus I2C (donde se deben conectar los pull-ups) a menudo se denomina VDDIO en los esquemas. Muchos chips tienen un pin de entrada separado para VDDIO (por ejemplo, pin 13 de HMC5883L, pines 1 y 3 de LSM9DS1). Da la casualidad de que Adafruit conectó esos pines a VDD de LDO en sus placas.
Dado que conectaron VDDIO al regulador interno de 3.3V, no pudieron permitirle aplicar un voltaje más alto a los pines I2C del sensor. Entonces agregaron cambiadores de nivel a sus tableros, con pull-ups a 3.3V en el lado del sensor y pull-ups a VIN en el lado del conector. Esto, a su vez, fijó el voltaje del bus I2C externo al VIN. Entonces, en este caso, el VIN define el voltaje del bus , pero solo porque los ingenieros de Adafruit cablearon las placas de esta manera.
Para resumir:
La gente de Adafruit ha pensado en esto para usted. Si va al sitio de Adafruit al que se vinculó para el HMC5883L, le dicen esto sobre las líneas SDA y SCL para I2C:
Entonces, mi interpretación de esto es que puede usar resistencias pullup externas a 5V.
El Atmega, por otro lado, tiene alta digital definida como tal por la hoja de datos:
Con una fuente de 5 V, 0,7*VDD son 3,5 V. Por lo tanto, sus 3,3 V no se registrarán como un alto voltaje, lo que hará que el I2C no funcione. Por lo tanto, deberá usar 5V para el pullup I2C.
El controlador tiene un voltaje IO de 5V. Puede funcionar con un bus I2C 3V3, pero es mejor que te limites a 5V. Simplemente use los pullups internos de 5V I2C de la placa del sensor.
BestQualityVacío
Arce
BestQualityVacío