I2C (Inter IC Bus) es un bus de datos universal desarrollado por Philips
Dos líneas de comunicación: línea de reloj en serie SCL (Serial Clock), línea de datos en serie SDA (Serial Data)
Síncrono, semidúplex, de un solo extremo, multidispositivo
Responder con datos
Admite el montaje de múltiples dispositivos en el bus (un maestro y múltiples esclavos, múltiples maestros y múltiples esclavos)
Un maestro, varios esclavos: el microcontrolador actúa como host y domina el funcionamiento del bus I2C. Todos los módulos externos montados en el bus I2C son esclavos. Los esclavos solo pueden controlar el bus I2C después de haber sido nombrados por el host y no pueden tocarlo. sin permiso. bus I2C para evitar conflictos.
Multimaestro y multiesclavo: cualquier módulo del bus puede saltar activamente y actuar como maestro. Cuando ocurre un conflicto de bus, el protocolo I2C realizará un arbitraje. La parte que gana el arbitraje obtiene el control del bus y la parte perdedora se convierte automáticamente en esclava.
1.2 Circuito de hardware
El SCL de todos los dispositivos I2C está conectado entre sí y el SDA está conectado entre sí.
Tanto SCL como SDA del dispositivo deben configurarse en modo de salida de drenaje abierto.
Agregue una resistencia pull-up a cada uno de SCL y SDA; el valor de resistencia generalmente es de aproximadamente 4,7 KΩ
Un maestro y varios esclavos: la CPU es una microcomputadora de un solo chip. Como maestro del bus, incluye control total de la línea SCL. El maestro tiene control total de la línea SCL en cualquier momento. Además, en el estado inactivo, el host puede iniciar activamente el control de SDA. Solo cuando el esclavo envía datos y el esclavo responde, el host transferirá el control de SDA al esclavo.
El IC controlado es un esclavo montado en el bus I2C, que puede ser un sensor de actitud, OLED, memoria, módulo de reloj, etc. La potencia del esclavo es relativamente pequeña. Para la línea de reloj SCL, solo puede leer pasivamente en cualquier momento. El esclavo no puede controlar la línea SCL. Para la línea de datos SDA, el esclavo no puede iniciar activamente el control de SDA. Sólo después de que el maestro envía un comando para leer el esclavo, o cuando el esclavo responde, el esclavo puede obtener brevemente el control del SDA.
Figura 2: SCL a la izquierda y SDA a la derecha. Todos los datos se pueden ingresar a través de un búfer de datos o un disparador Schmitt.
Debido a que la entrada no tiene ningún efecto en el circuito, cualquier dispositivo puede tener entrada en cualquier momento.
La salida adopta una configuración de salida de drenaje abierto. Cuando la salida es baja, el interruptor está encendido y el pin está conectado directamente a tierra, lo cual es una fuerte caída cuando la salida es alta, el interruptor está apagado y el pin; no está conectado a nada y está en un estado flotante, por lo que todos los dispositivos solo pueden generar un nivel bajo pero no un nivel alto. Para evitar la flotación causada por un nivel alto, SCL y SDA necesitan tener una resistencia pull-up externa. el bus, a través de una resistencia tirado a un nivel alto, por lo que es un pull-up débil. De esta manera, en primer lugar, elimina por completo el fenómeno del cortocircuito de alimentación y garantiza la seguridad del circuito; en segundo lugar, evita el cambio frecuente de modos de pin; En el modo de drenaje abierto, generar un nivel alto equivale a desconectar el pin, por lo que puede generar un nivel alto directamente antes de ingresar. En tercer lugar, este modo tiene un fenómeno de "Y cableado". Siempre que uno o más dispositivos emitan un nivel bajo, el bus estará en un nivel bajo. Solo cuando todos los dispositivos emitan un nivel alto, el bus estará en un nivel alto. . Por lo tanto, I2C puede aprovechar este fenómeno para realizar sincronización de reloj y arbitraje de bus en modo multimaestro. Entonces, aunque SCL aquí puede usar salida push-pull en un modo maestro y múltiples esclavos, todavía usa el modo de salida de drenaje abierto más extracción.
1.3 Unidad básica de temporización I2C
1.3.1 Condiciones iniciales y condiciones finales
condición inicial: Durante el nivel alto de SCL, SDA cambia del nivel alto al nivel bajo
Condición de terminación: Durante el nivel alto de SCL, SDA cambia del nivel bajo al nivel alto
bajo condiciones iniciales : Cuando el bus I2C está en estado inactivo, tanto SCL como SDA están en un estado de alto nivel, es decir, ningún dispositivo toca SCL y SDA y SDA son llevados a un nivel alto mediante resistencias pull-up externas, y el bus está. en un estado tranquilo. Estado de alto nivel. Cuando el host necesita enviar y recibir datos, primero debe romper el silencio del bus y generar una condición inicial, es decir, SCL está en un nivel alto sin tocarlo, y luego bajar SDA para generar un flanco descendente. Cuando el esclavo captura el nivel alto de SCL y la señal de flanco descendente de SDA, se reiniciará y esperará la llamada del maestro. Después del flanco descendente de SDA, el host necesita bajar SCL nuevamente. Por un lado, ocupa el bus y, por otro lado, también es para facilitar el empalme de la unidad básica. Posteriormente se garantizará que, excepto para las condiciones de inicio y parada, el SCL de cada unidad secuencial comience con un nivel bajo y termine con un nivel bajo.
En el estado de condición de terminación : SCL se suelta primero y rebota a un nivel alto, luego SDA se suelta y rebota a un nivel alto, generando un flanco ascendente, que desencadena la condición de terminación. Después de la condición de terminación simultánea, tanto SCL como SDA están altos y regresan al estado de calma inicial. El inicio y la parada son generados por el host y el esclavo no puede generar inicio y parada. Por lo tanto, cuando el autobús está inactivo, el esclavo siempre debe soltar las manos y no puede saltar y tocar el autobús.
1.3.2 Enviar un byte
enviar un byte: Durante el nivel bajo de SCL, el host coloca los bits de datos en la línea SDA en secuencia (el bit alto primero) y luego libera SCL. El esclavo leerá los bits de datos durante el nivel alto de SCL, por lo que no se permite SDA. para tener datos durante el nivel alto de SCL. Cuando los datos cambien, realice un ciclo del proceso anterior 8 veces para enviar un byte.
El host de bajo nivel coloca datos y el esclavo de alto nivel los lee. Después de la condición de inicio, el host también debe enviar el primer byte. Cuando SCL está bajo, si el host quiere enviar 0, baja el SDA; si quiere enviar 1, lo suelta y el SDA rebota al nivel alto; Durante el nivel bajo de SCL, se permite que el nivel de SDA cambie. Después de colocar los datos, el host libera la línea de reloj y SCL rebota al nivel alto. Durante el nivel alto, es el momento en que el esclavo lee SDA, por lo que durante el nivel alto, no se permite que SDA cambie. Después de que SCL esté en un nivel alto, el esclavo necesita leer SDA lo más rápido posible. Generalmente, el esclavo ha completado la lectura en el flanco ascendente de SCL. Debido a que el reloj está controlado por el maestro, el esclavo no sabe cuándo ocurre el flanco descendente, por lo que el esclavo leerá los datos en el flanco ascendente de SCL. Después de que el host suelta SCL por un período de tiempo, puede continuar bajando SCL y transmitir el siguiente bit. El anfitrión también necesita colocar datos en SDA lo antes posible después de la caída de SCL. Pero el host tiene control sobre el reloj, por lo que solo necesita colocar datos en SDA en cualquier momento cuando el nivel bajo es bajo. Después de que se publican los datos, el host libera SCL nuevamente, SCL está alto y el esclavo lee este bit. Repita este proceso: el host reduce SCL, coloca los datos en SDA, el host libera SCL y el esclavo lee los datos de SDA. Bajo la sincronización de SCL, el maestro transmite y el esclavo recibe en secuencia. Después de 8 ciclos, se envían datos de 8 bits, que son un byte. Dado que el bit de orden superior es el primero, el primer bit es el bit B7 más alto de un byte y el bit B0 más bajo se envía al final.
1.3.3 Recibir un byte
recibir un byte: Durante el nivel bajo de SCL, el esclavo coloca los bits de datos en la línea SDA en secuencia (el bit alto primero) y luego libera SCL. El host leerá los bits de datos durante el nivel alto de SCL, por lo que no se permite SDA. para tener datos durante el nivel alto de SCL Cuando los datos cambian, realice un ciclo del proceso anterior 8 veces para recibir un byte (el host debe liberar SDA antes de recibir).
El esclavo de bajo nivel coloca datos, el host de alto nivel lee datos Línea SDA: el maestro necesita liberar SDA antes de recibir. En este momento, el esclavo obtiene el control de SDA. Si el esclavo necesita enviar 0, baja SDA. Si el esclavo necesita enviar 1, lo suelta y SDA. rebota a un nivel alto. El nivel bajo convierte datos, el nivel alto lee datos. La línea continua representa el nivel controlado por el maestro y la línea de puntos representa el nivel controlado por el esclavo. El host controla SCL durante todo el proceso, y el host SDA debe liberarse antes de recibirlo y entregárselo al esclavo para su control. Debido a que el reloj SCL está controlado por el host, la conversión de datos del esclavo se realiza básicamente en el flanco descendente de SCL, y el host puede leer en cualquier momento cuando SCL está alto.
1.3.4 Enviar respuesta y recibir respuesta
Enviar respuesta: Después de recibir un byte, el host envía un bit de datos en el siguiente reloj. El dato 0 indica respuesta y el dato 1 indica falta de respuesta.
recibir respuesta: Después de que el host envía un byte, recibe un bit de datos en el siguiente reloj para determinar si el esclavo responde. Los datos 0 indican respuesta y los datos 1 indican que no hay respuesta (el host debe liberar SDA antes de recibir).
Es decir, después de llamar al momento de enviar un byte, debe ir seguido del momento de llamar a la respuesta de recepción, que se utiliza para determinar si el esclavo ha recibido los datos que se le acaban de proporcionar. Si el esclavo lo recibe, entonces en el bit de respuesta, cuando el maestro libera SDA, el esclavo debe bajar inmediatamente el SDA y luego, durante el nivel alto de SCL, el host lee el bit de respuesta. Si el bit de respuesta es 0, significa que efectivamente el esclavo lo ha recibido. Al recibir un byte, debe llamar al envío de respuesta. El propósito de enviar una respuesta es decirle al esclavo si desea continuar enviando. Si la máquina esclava recibe una respuesta de la máquina maestra después de enviar un dato, la máquina esclava continuará enviando. Si la máquina esclava no recibe una respuesta de la máquina maestra, la máquina esclava pensará que tiene un dato. Se ha enviado, pero la máquina maestra me ignora. Quizás el host no lo quiera. En este momento, el esclavo liberará obedientemente el SDA y entregará el control del SDA para evitar interferencias con las operaciones posteriores del host.
1.4 sincronización I2C
1.4.1 Especificar dirección para escribir
Especificar dirección para escribir
Para el dispositivo especificado (Dirección esclava), escriba los datos especificados (Datos) en la dirección especificada (Dirección de registro) (es decir, la dirección de registro del dispositivo especificado)
proceso: (1) Condiciones iniciales (2) Momento de envío de un byte: 0xD0 (dirección esclava (7 bits) + escritura (1 bit) -0) (1101 0000) (3) Recibir respuesta: RA = 0 (recibir la respuesta del esclavo) (4) Dirección especificada: 0x19 (0001 1001) (5) Recibir respuesta: RA = 0 (recibir la respuesta del esclavo) (6) Escriba los datos especificados: 0xAA (1010 1010) (7) Recibir respuesta: RA = 0 (8) Bit de parada P (condición de terminación)
Después de la condición de inicio, debe ser el momento para enviar un byte. El contenido del byte debe ser la dirección del esclavo + bits de lectura y escritura. La dirección del esclavo es de 7 bits y los bits de lectura y escritura son de 1 bit, que es exactamente. 8 bits. Enviar la dirección del esclavo es para determinar el objeto de comunicación, y enviar el bit de lectura y escritura es para confirmar si se escribe o lee a continuación. Ahora el host envía un dato. El contenido del byte se convierte a hexadecimal. El bit de orden superior es 0xD0. La siguiente unidad es el bit de respuesta (RA) del esclavo receptor. El bit de escritura termina y SCL baja. Después de eso, el host necesita liberar SDA, seguido por el bit de reconocimiento RA.
El nivel alto después de que finaliza el bit de respuesta RA se genera cuando el esclavo libera SDA. El esclavo entrega el control de SDA. Debido a que el esclavo quiere intercambiar datos lo antes posible en el nivel bajo de SCL, el flanco ascendente de SDA y. El borde descendente de SCL ocurrió casi simultáneamente.
Una vez completada la respuesta, si continúa enviando un byte, el segundo byte se puede enviar al interior del dispositivo designado. El dispositivo esclavo puede definir el uso del segundo byte propio y posteriores. Generalmente, el segundo byte puede ser una dirección de registro o una palabra de control de instrucción, etc., y el tercer byte es el contenido que el host desea escribir en la dirección de registro (segundo byte).
P es el bit de parada.
El propósito de esta trama de datos es: para el dispositivo que especifica la dirección de esclavo 1101000, escribir el dato 0xAA en su registro interno en la dirección 0x19. 0 significa: el host realizará una operación de escritura en el tiempo posterior; 1 significa: el host realizará una operación de lectura en la secuencia de tiempo posterior;
1.4.2 Lectura de la dirección actual
dirección actual leída
Para el dispositivo especificado (Dirección esclava), lea los datos del esclavo (Datos) en la dirección indicada por el puntero de dirección actual.
proceso: (1) Condiciones iniciales (2) Momento de envío de un byte: 0xD1 (dirección esclava (7 bits) + lectura (1 bit) -1) (1101 0001) (3) Recibir respuesta: RA = 0 (recibir la respuesta del esclavo) (4) Leer datos del esclavo: 0x0F (0000 1111) (7) Enviar respuesta: SA = 0 (8) Bit de parada P (condición de terminación)
El bit de lectura y escritura es 1, lo que indica que se realizará la siguiente operación de lectura. Después de que el esclavo responda (RA = 0), se invertirá la dirección de transmisión de datos. El maestro quiere entregar el control de SDA al esclavo y el maestro llama al momento de recibir un byte para realizar la operación de recepción.
En el segundo byte, el esclavo obtiene permiso del maestro y puede escribir en SCL durante el nivel bajo de SCL. El maestro lee SDA durante el nivel alto de SCL. Finalmente, el maestro lee en secuencia durante el nivel alto de SCL. 8 bits, se recibe un byte de datos enviado por el esclavo, que es 0x0F. ¿Pero qué registro del esclavo es 0x0F? En el tiempo de lectura, el protocolo I2C estipula que cuando el host se dirige, una vez que el indicador de lectura y escritura se establece en 1. El siguiente byte cambiará inmediatamente al tiempo de lectura. Por lo tanto, el host comenzará a recibir antes de que tenga tiempo de especificar qué registro desea leer, por lo que no hay ningún enlace para especificar la dirección aquí. En la máquina esclava, todos los registros se asignan a un área lineal y habrá una variable de puntero separada que indica uno de los registros. Este puntero se enciende de forma predeterminada, generalmente apunta a la dirección 0 y cada vez que se escribe un byte. Después de leer un byte, el puntero se incrementará automáticamente una vez y se moverá a la siguiente posición. Luego, al llamar al tiempo de lectura de la dirección actual, si el host no especifica qué dirección leer, el esclavo regresará al registro señalado por el. valor actual.
1.4.3 Leer en la dirección especificada
Especificar dirección para leer
Para el dispositivo especificado (Dirección esclava), en la dirección especificada (Dirección de registro), lea los datos del esclavo (Datos)
Comience primero, luego repita inicio, luego pare proceso: (1) Condiciones iniciales (2) Momento de envío de un byte: 0xD0 (dirección esclava (7 bits) + escritura (1 bit) -0) (1101 0000) (3) Recibir respuesta: RA = 0 (recibir la respuesta del esclavo) (4) Dirección especificada: 0x19 (0001 1001) (5) Recibir respuesta: RA = 0 (recibir la respuesta del esclavo) (6) Repita la condición inicial. (7) Momento de envío de un byte: 0xD1 (dirección esclava (7 bits) + lectura (1 bit) -1) (1101 0001) (8) Recibir respuesta: RA = 0 (9) Leer datos del esclavo: 0xAA (1010 1010) (10) Enviar respuesta: SA = 0 (11) Bit de parada P (condición de terminación)
La primera parte es escribir en la dirección especificada, pero solo se especifica la dirección y no hay tiempo para escribir. La segunda parte es leer la dirección actual, porque la dirección se acaba de especificar, por lo que se lee la dirección actual; llamado de nuevo.
La dirección del esclavo especificada es 1101000, el indicador de lectura y escritura es 0 y se realiza la operación de escritura. Después de que el esclavo responde, se escribe otro byte (el segundo byte) para especificar la dirección 0x19 en el esclavo. Puntero de dirección, es decir, después de que el esclavo recibe los datos, su puntero de registro apunta a la posición 0x19.
Sr es una condición de inicio repetida, que equivale a iniciar un nuevo tiempo. Debido a que el indicador de lectura y escritura especificado solo puede seguir el primer byte de la condición de inicio, si desea cambiar la dirección de lectura y escritura, solo puede tenerlo. otra condición de inicio.
Luego, después de la condición de inicio, vuelva a direccionar y especifique el bit de indicador de lectura y escritura. En este momento, el bit de indicador de lectura y escritura es 1, lo que indica que se debe leer. Luego, el host recibe un byte, que son los datos. 0xAA en la dirección 0x19.
2. MPU6050
2.1 Introducción a MPU6050
MPU6050 es un sensor de actitud de 6 ejes que puede medir los parámetros de aceleración y velocidad angular de los ejes X, Y y Z del propio chip. A través de la fusión de datos, se puede obtener más a menudo el ángulo de actitud (ángulo de Euler). Equilibrando vehículos, aviones, etc. que necesitan detectarse por sí mismos en la escena del gesto.
Acelerómetro de 3 ejes (Accelerometer): mide la aceleración de los ejes X, Y y Z
Sensor giroscópico de 3 ejes (Giroscopio): mide la velocidad angular de los ejes X, Y y Z
Tomando como ejemplo el fuselaje de un avión, el ángulo de Euler es el ángulo entre el fuselaje del avión y los tres ejes iniciales.
aviónLa nariz del avión se inclina hacia abajo o hacia arriba., el ángulo entre este eje se llamaPaso;
aviónEl fuselaje gira hacia la izquierda o hacia la derecha., el ángulo entre este eje se llamaRollo;
aviónMantenga el fuselaje nivelado,Girar el morro del avión hacia la izquierda o hacia la derecha., el ángulo entre este eje se llamaGuiñada。
El ángulo de Euler representa la actitud del avión en este momento, ya sea que esté inclinado hacia arriba o hacia abajo, hacia la izquierda o hacia la derecha.
Los algoritmos de fusión de datos comunes generalmente incluyen filtrado complementario, filtrado de Kalman, etc., y cálculo de actitud en navegación inercial.
Acelerómetro : La línea de puntos en el medio es el eje de inducción. En el medio hay un pequeño control deslizante con cierta masa que puede deslizarse hacia la izquierda y hacia la derecha. Hay un resorte a la izquierda y a la derecha contra él. Cuando el control deslizante se mueve, hará que el potenciómetro se mueva. Este potenciómetro es una resistencia divisoria de voltaje. Al medir la salida de voltaje del potenciómetro, puede obtener el valor de aceleración del control deslizante pequeño. Este acelerómetro es en realidad un dinamómetro de resorte. Según la segunda ley de Newton, F = ma. Si quieres medir la aceleración a, puedes encontrar un objeto con masa unitaria y medir la fuerza F. Eso es todo. Hay un acelerómetro en cada uno de los ejes X, Y y Z. Los acelerómetros tienen estabilidad estática pero no dinámica.
Sensor giroscópico : En el medio hay una rueda giratoria con una determinada masa. Cuando la rueda giratoria gira a alta velocidad, de acuerdo con el principio de conservación del momento angular, la rueda giratoria tiende a mantener su momento angular original. dirección del eje de rotación sin cambios. Cuando gira la dirección del objeto externo, la dirección del eje de rotación interno no girará, lo que producirá una desviación angular en la conexión del anillo de equilibrio. Si coloca un potenciómetro giratorio en la conexión y mide el voltaje del potenciómetro, puede obtener el ángulo de rotación. El giroscopio debería poder obtener directamente el ángulo, pero el giroscopio de este MPU6050 no puede medir directamente el ángulo. Mide la velocidad angular, es decir, la velocidad angular del chip que gira alrededor del eje X, el eje Y y el Z. -eje. La integral de la velocidad angular es el ángulo. Sin embargo, cuando el objeto está estacionario, el valor de la velocidad angular no puede volver completamente a cero debido al ruido. Luego, después de la acumulación continua de integrales, este pequeño ruido hará que el ángulo calculado se desvíe lentamente. que es el ángulo obtenido integrando la velocidad angular. No puede resistir la prueba del tiempo, pero este ángulo no es problema ya sea que esté estacionario o en movimiento, y no se verá afectado por el movimiento del objeto. Los giroscopios tienen estabilidad dinámica, no estática.
Según el acelerómetro, que tiene estabilidad estática pero no tiene estabilidad dinámica; el giroscopio tiene estabilidad dinámica pero no tiene estabilidad estática. Estas dos características, por lo que podemos aprender de las fortalezas de cada uno y complementar las debilidades de cada uno. , podemos integrar estabilidad estática y dinámica. La postura es incómoda.
2.2 parámetros MPU6050
ADC de 16 bits recopila la señal analógica del sensor, rango de cuantificación: -32768~32767
Selección de escala completa del acelerómetro: ±2, ±4, ±8, ±16 (g) (1g = 9,8 m/s2)
Selección de escala completa del giroscopio: ±250, ±500, ±1000, ±2000 (°/seg, grado/segundo, unidad de velocidad angular, cuántos grados de rotación por segundo) (cuanto mayor sea la selección de escala completa, más amplia será la rango de medición. Cuanto menor sea el rango de escala completa, mayor será la resolución de medición)
Filtro de paso bajo digital configurable: se puede configurar un registro para seleccionar el filtrado de paso bajo de los datos de salida.
Fuente de reloj configurable
División de frecuencia de muestreo configurable: la fuente del reloj se puede dividir por el divisor de frecuencia para proporcionar relojes para la conversión AD y otros circuitos internos. Al controlar el coeficiente de división de frecuencia, puede controlar la velocidad de conversión AD.
Dirección de esclavo I2C: 1101000 (AD0=0) o 1101001 (AD0=1)
110 1000 se convierte a hexadecimal, que es 0x68, por lo que algunos dicen que la dirección esclava de MPU6050 es 0x68. Pero en la comunicación I2C, los 7 bits superiores del primer byte son la dirección del esclavo y el bit más bajo es el bit de lectura y escritura. Por lo tanto, si cree que 0x68 es la dirección del esclavo, primero debe cambiar al enviar el primer byte. 0x68 Desplazarse 1 bit hacia la izquierda (0x68 << 1), luego leer y escribir bits bit a bit o hacia arriba, leer 1 y escribir 0.
Otro método es desplazar los datos de 0x68 hacia la izquierda 1 bit (0x68 << 1) como dirección esclava, que es 0xD0. En este caso, la dirección esclava de MPU6050 es 0xD0. En este momento, cuando envíe el primer byte, si desea escribir, simplemente use 0xD0 como el primer byte; si desea leer, use 0xD0 o 0x01 (0xD0 | 0x01), es decir, 0xD1. . Esta representación no requiere una operación de desplazamiento a la izquierda o, en otras palabras, esta representación integra los bits de lectura y escritura en la dirección esclava. 0xD0 es la dirección de escritura y 0xD1 es la dirección de lectura.
2.3 Circuito de hardware
alfiler
Función
VCC, GND
fuente de alimentación
SCL, SDA
Pin de comunicación I2C
XCL, XDA
Pines de comunicación del host I2C
AD0
El bit más bajo de la dirección esclava.
EN T
Salida de señal de interrupción
LDO: regulador de voltaje lineal de baja caída, regulador de voltaje de 3,3 V.
SCL y SDA: son pines de comunicación I2C. El módulo tiene dos resistencias pull-up integradas de 4,7 K, por lo que al realizar el cableado, simplemente conecte SDA y SCL directamente al puerto GPIO. No es necesario conectar resistencias pull-up externas. .
XCL, XDA: pines de comunicación del host I2C. Estos dos pines están diseñados para ampliar las funciones del chip. Generalmente se usa para magnetómetros o barómetros externos. Cuando estos chips de expansión están conectados, la interfaz de host de MPU6050 puede acceder directamente a los datos de estos chips de expansión y leer los datos de estos chips de expansión en MPU6050 tiene una unidad DMP. cálculo de actitud. Pin AD0: es el bit más bajo de la dirección del esclavo. Si está conectado a un nivel bajo, la dirección del esclavo de 7 bits es 1101000; si está conectado a un nivel alto, la dirección del esclavo de 7 bits es 1101001. Hay una resistencia en el diagrama del circuito, que está débilmente bajada a un nivel bajo de forma predeterminada, por lo que si el pin se deja flotando, es de nivel bajo. Si desea conectarlo a un nivel alto, puede conectar directamente AD0 a VCC. y tire de él con fuerza hasta un nivel alto.
INT: pin de salida de interrupción Puede configurar algunos eventos dentro del chip para activar la salida del pin de interrupción, como datos listos, error del host I2C, etc.
El chip también tiene incorporado: detección de caída libre, detección de movimiento, detección de movimiento cero, etc. Estas señales pueden activar el pin INT para generar una transición de nivel y las señales de interrupción se pueden configurar si es necesario.
La fuente de alimentación del chip MPU6050 es de 2.375-3.46V, que es un dispositivo de fuente de alimentación de 3.3V y no se puede conectar directamente a 5V. Por lo tanto, se agrega un regulador de voltaje de 3,3 V y el voltaje del terminal de entrada VCC_5V puede estar entre 3,3 V y 5 V. Luego, el regulador de voltaje de 3,3 V genera un voltaje estable de 3,3 V para alimentar el chip siempre que el terminal de 3,3 V tenga energía. , La luz indicadora de encendido se encenderá.
2.4 Diagrama de bloques de MPU6050
CLKIN y CLKOUT son pines de entrada y salida de reloj, pero generalmente usamos el reloj interno.
La parte gris: es el sensor dentro del chip, el acelerómetro en el eje XYZ y el giroscopio en el eje XYZ.
También hay un sensor de temperatura incorporado que se puede utilizar para medir la temperatura.
Estos sensores son esencialmente equivalentes a resistencias variables. Después de dividir el voltaje, generan un voltaje analógico y luego realizan una conversión de analógico a digital a través del ADC. Una vez completada la conversión, los datos de estos sensores se colocan de manera uniforme en los datos. registro, que se puede obtener leyendo el registro de datos. El valor medido por el sensor. Todas las conversiones dentro de este chip están completamente automatizadas.
Cada sensor tiene una unidad de autoprueba, que se utiliza para verificar la calidad del chip. Cuando se inicia la autoprueba, el chip simulará una fuerza externa ejercida sobre el sensor. Esta fuerza externa hará que los datos del sensor sean. más grande de lo habitual. Proceso de autoprueba: primero puede habilitar la autoprueba, leer los datos, luego habilitar la autoprueba, leer los datos, restar los dos datos y los datos resultantes se denominan respuesta de autoprueba. Para esta respuesta de autoprueba, el manual proporciona un rango. Si está dentro de este rango, significa que no hay problema con el chip.
Bomba de carga: Es una bomba de carga o bomba de carga. La bomba de carga es un circuito de refuerzo.
El pin CPOUT requiere un condensador externo.
Registro de estado de interrupción: puede controlar qué eventos internos se envían al pin de interrupción,
FIFO: registro de primero en entrar, primero en salir, que puede almacenar en caché el flujo de datos.
Registro de configuración: Puede configurar varios circuitos internos.
Registro de sensor: Registro de datos, que almacena los datos de cada sensor.
Calibrado de fábrica: esto significa que los sensores internos están calibrados.
Procesador de movimiento digital: DMP para abreviar, es un algoritmo de hardware para el cálculo de actitud que viene dentro del chip. Puede usarse para el cálculo de actitud con la biblioteca oficial de DMP.
FSYNC: Sincronización de cuadros.
3. 10-1 Software I2C de lectura y escritura MPU6050
3.1 Conexión de hardware
A través de la comunicación I2C del software, lea y escriba los registros dentro del chip MPU6050. Al escribir en el registro de configuración, puede configurar el módulo enchufable. Al leer el registro de datos, puede obtener los datos del módulo enchufable. Se mostrarán los datos leídos en OLED, los datos superiores son el número de identificación del dispositivo. El número de identificación de este MPU6050 está fijo en 0x68. A continuación, los tres de la izquierda son los datos de salida del sensor de aceleración, que son la aceleración del eje X, el eje Y y el eje Z respectivamente. Los tres de la derecha son los datos de salida del sensor giroscópico. que son la velocidad angular del eje X, el eje Y y el eje Z. SCL está conectado al pin PB10 de STM32 y SDA está conectado al pin PB11. Dado que aquí se implementa el cambio de nivel de software, se pueden conectar dos puertos GPIO a voluntad.
3.2 Resultados de la operación
3.3 Flujo de código
STM32 es el host y MPU6050 es el esclavo, que es un modo maestro-esclavo.
Establecer los módulos .c y .h de la capa de comunicación I2C
Escriba la inicialización GPIO subyacente de I2C
6 unidades de temporización básicas: inicio, fin, enviar un byte, recibir un byte, enviar respuesta, recibir respuesta
Cree los módulos .c y .h de MPU6050
Basado en el módulo de comunicación I2C, implementa lectura en la dirección especificada, escritura en la dirección especificada, escritura de registros para configurar el chip y lectura de registros para obtener datos del sensor.
C Principal
Llame al módulo MPU6050, inicialícelo, obtenga los datos y muestre los datos
STM32 integra un circuito transceptor I2C de hardware, que puede realizar automáticamente funciones como generación de reloj, generación de condiciones de inicio y fin, transmisión y recepción de bits de respuesta y transmisión y recepción de datos por parte del hardware, lo que reduce la carga de la CPU.
Admite modelo de host múltiple
Admite modo de dirección de 7 bits/10 bits
Soporta diferentes velocidades de comunicación, velocidad estándar (hasta 100 kHz), rápida (hasta 400 kHz)
Soporte DMA
Compatible con protocolo SMBus
Recursos I2C de hardware STM32F103C8T6: I2C1, I2C2
4.2 Diagrama de bloques I2C
A la izquierda están los pines de comunicación: SDA y SCL son utilizados por SMBus; Los pines derivados de periféricos generales suelen estar conectados al mundo exterior a través del modo multiplexación del puerto GPIO (consulte la tabla)
Lo anterior es la parte de control de datos: SDA La parte central de la transmisión y recepción de datos es el registro de datos DR (REGISTRO DE DATOS) y el registro de desplazamiento de datos. Cuando es necesario enviar datos, se puede escribir un byte de datos en el registro de datos DR. Cuando el registro de desplazamiento no tiene datos para desplazar, el valor del registro de datos se transferirá aún más al registro de desplazamiento. Durante el proceso de cambio, los siguientes datos se pueden colocar directamente en el registro de datos y esperar. Una vez que se completa el cambio de datos anterior, los siguientes datos se pueden conectar sin problemas y continuar enviándose. Cuando se transfieren datos del registro de datos al registro de desplazamiento, el bit TXE del registro de estado se establece en 1, lo que indica que el registro de transmisión está vacío.
Recepción: los datos de entrada se mueven desde el pin al registro de desplazamiento bit a bit. Cuando se recopila un byte de datos, los datos se transfieren del registro de desplazamiento al registro de datos en su conjunto y el indicador RXNE se establece en el. Al mismo tiempo, indica recepción. El registro no está vacío, entonces los datos se pueden leer del registro de datos. En cuanto a cuándo recibir y cuándo enviar, es necesario escribir los bits correspondientes en el registro de control para la operación. Las condiciones de inicio, condiciones de terminación, bits de respuesta, etc., se completan mediante el control de datos.
El comparador y el registro de direcciones se utilizan en modo esclavo.
SCL: El control de reloj se utiliza para controlar la línea SCL. Escriba el bit correspondiente en el registro de control del reloj y el circuito realizará la función correspondiente. Circuito lógico de control, escribir en el registro de control puede controlar todo el circuito. El estado de funcionamiento del circuito se puede conocer leyendo el registro de estado.
Al enviar y recibir muchos bytes, se puede utilizar DMA para mejorar la eficiencia.
4.3 Estructura básica I2C
SDA: dado que I2C es de orden superior primero, este registro de desplazamiento se desplaza hacia la izquierda. Al enviar, el bit alto se mueve primero y luego el segundo bit alto. Un reloj SCL se desplaza una vez y se desplaza 8 veces, y se pueden colocar 8 bytes en la línea SDA desde el bit alto al bit bajo. Al recibir, los datos se mueven desde la derecha a través del puerto GPIO y finalmente se mueven 8 veces y se recibe un byte. Los datos de salida se envían al puerto a través del puerto GPIO. Los datos de entrada se ingresan al registro de desplazamiento a través del puerto GPIO.
El puerto GPIO debe configurarse para multiplexar el modo de salida de drenaje abierto; la multiplexación significa que el estado del puerto GPIO está controlado por periféricos en el chip, y la salida de drenaje abierto es la configuración del puerto requerida por el protocolo I2C. Incluso en el modo de salida de drenaje abierto, se puede ingresar el puerto GPIO.
SCL: el controlador de reloj controla la línea de reloj a través de GPIO.
4.4 Envíos del host
Cuando STM32 quiere escribir en una dirección específica, debe seguir el diagrama de secuencia de transmisión del transmisor.
Dirección de 7 bits: se aborda el byte después de la condición de inicio.
Dirección de 10 bits: los dos bytes después de la condición de inicio son direccionamiento. El primer byte es el encabezado de la trama y el contenido es el bit de bandera de 5 bits 11110 + dirección de 2 bits + 1 bit de lectura y escritura; Dirección pura de 8 bits.
Proceso de 7 bits: inicio, dirección esclava, respuesta, datos, respuesta, datos, respuesta... Detener
Después de la inicialización, el bus pasa al estado inactivo y STM pasa al modo esclavo. Para generar una condición de inicio, STM32 necesita escribir en el registro de control (CR1), escribir 1 y luego STM32 cambia del modo esclavo al modo maestro. .
El evento EV5 puede considerarse como un bit de bandera. SB es un bit del registro de estado, lo que indica que el estado del hardware SB = 1 significa que se ha enviado la condición de inicio.
Luego puede enviar un byte de dirección esclava. La dirección esclava debe escribirse en el registro de datos DR. Después de escribir en DR, el circuito de hardware transferirá automáticamente el byte de dirección al registro de desplazamiento y luego transferirá la palabra El nodo es. enviado al bus I2C, y luego el hardware recibirá automáticamente la respuesta y juzgará si no hay respuesta, el hardware establecerá el indicador de falla de respuesta y luego el indicador puede solicitar una interrupción para recordárnoslo.
Cuando se complete el direccionamiento, se producirá el evento EV6 y el bit de indicador ADDR será 1. Este bit de indicador indica el final de la transmisión de dirección en modo maestro.
El evento EV8_1 significa que el indicador TxE es 1, el registro de desplazamiento está vacío y el registro de datos está vacío. Necesitamos escribir en el registro de datos DR para enviar datos. Después de escribir en DR, debido a que el registro de desplazamiento está vacío, DR. cambiará inmediatamente al turno de registro para enviar. Se producirá el evento EV8. El registro de desplazamiento no está vacío y el registro de datos está vacío, lo que significa que el registro de desplazamiento está enviando datos. Por lo tanto, el tiempo del dato 1 se genera aquí en el proceso. En este momento, los datos 2 se escribirán en el registro de datos y estarán esperando. Después de recibir el bit de respuesta, los bits de datos se transfieren al registro de desplazamiento para su transmisión. El estado en este momento es que el registro de desplazamiento no está vacío. El registro de datos está vacío, por lo que en este momento, el incidente del EV8 volvió a ocurrir.
Luego se envían los datos 2, pero esta vez los siguientes datos se han escrito en el registro de datos y están esperando. Una vez que se detecta el evento EV8, se pueden escribir los siguientes datos.
Una vez escritos los datos que desea enviar, no se escriben datos nuevos en el registro de datos. Cuando se completa el desplazamiento de datos actual en el registro de desplazamiento, el registro de desplazamiento está vacío y el registro de datos también está vacío. Evento EV8_2, TxE=1 significa que el registro de desplazamiento está vacío, el registro de datos está vacío, BTF: indicador de fin de transmisión de bytes, cuando se transmite, cuando se enviarán nuevos datos y el registro de datos no se ha escrito con datos nuevos. Cuando se detecta EV8_2, se puede generar la condición de terminación Stop. Para generar una condición de terminación, obviamente, debe haber bits correspondientes en el registro de control que puedan controlarse. De esta forma finaliza la secuencia de envío.
Primero, escriba el bit de inicio del registro de control para generar una condición de inicio y luego espere el evento EV5 (que indica que se ha enviado la condición de inicio).
Después del direccionamiento, se recibe la respuesta y se genera un evento EV6 después del final (que indica que se completa el direccionamiento).
Dato 1 significa que los datos se están ingresando a través del registro de desplazamiento.
EV6_1 indica que los datos aún se están desplazando. Después de recibir la respuesta, significa que el registro de desplazamiento se ha movido con éxito en un byte de datos 1. En este momento, el byte desplazado se transfiere al registro de datos en su totalidad y el indicador RxNE se establece al mismo tiempo, lo que indica que el registro de datos no está vacío, es decir, se ha recibido un byte de datos. El estado es un evento EV7, RxNE = 1. que los datos han sido recibidos Después de leer los datos, el evento ya no existe.
Por supuesto, cuando los datos 1 no se han leído, los datos 2 se pueden mover directamente al registro de desplazamiento. Después de eso, se completa el desplazamiento de los datos 2, se reciben los datos 2, se genera un evento EV7, se leen los datos 2 y. el evento EV7 ya no existe.
Cuando no se necesita más recepción, el registro de control de bits de respuesta ACK debe establecerse en 0 por adelantado cuando ocurre la última unidad de temporización y se establece la solicitud de condición de terminación, es decir, el evento EV7_1. Luego, no hay respuesta NA. Se dará como el bit STOP está establecido, por lo que se genera una condición de terminación.
4.6 Comparación de formas de onda de software/hardware
5.2 Implementación de hardware I2C de lectura y escritura de MPU6050
5.2.1 Conexión de hardware
SCL está conectado al pin PB10 de STM32 y SDA está conectado al pin PB11. Dado que aquí se implementa el cambio de nivel de software, se pueden conectar dos puertos GPIO a voluntad. El dato principal de OLED es el número de identificación del dispositivo. El número de identificación de este MPU6050 está fijo en 0x68. A continuación, los tres de la izquierda son los datos de salida del sensor de aceleración, que son la aceleración del eje X, el eje Y y el eje Z respectivamente. Los tres de la derecha son los datos de salida del sensor giroscópico. que son la velocidad angular del eje X, el eje Y y el eje Z.
5.2.2 Resultados de la operación
5.2.3 Proceso de implementación del código
Configure los periféricos I2C, inicialice los periféricos I2C, reemplace MyI2C_Init (1) Encienda el reloj del periférico I2C y el puerto GPIO correspondiente, (2) Inicialice el puerto GPIO correspondiente al periférico I2C al modo de drenaje abierto multiplexado (3) Utilice la estructura para configurar todo el I2C (4) I2C_Cmd, habilitar I2C
Controle circuitos periféricos, realice el tiempo de escritura en direcciones específicas y reemplace WriteReg
Controle el circuito periférico para realizar el tiempo de lectura de la dirección especificada y reemplazar ReadReg