Thứ Năm, 29 tháng 11, 2018

Giao tiếp modul MPU6050

Giới thiệu

Mô-đun MPU6050

Mô-đun cảm biến MPU6050 là thiết bị theo dõi chuyển động 6 trục tích hợp.
  • Nó có một con quay hồi chuyển 3 trục, gia tốc kế 3 trục, bộ xử lý chuyển động kỹ thuật số và cảm biến nhiệt độ, tất cả trong một IC duy nhất.
  • Nó có thể chấp nhận đầu vào từ các cảm biến khác như từ kế 3 trục, một cảm biến áp suất sử dụng bus phụ I2C của nó.
  • Nếu từ kế 3 trục bên ngoài được kết nối, nó có thể cung cấp đầu ra Motion Fusion 9 trục hoàn chỉnh.
  • Một vi điều khiển có thể giao tiếp với mô-đun này bằng giao thức truyền thông I2C.
  • Con quay hồi chuyển và gia tốc đọc dọc theo trục X, Y và Z có sẵn trong dạng bổ sung của 2. Nhiệt độ đọc có sẵn ở dạng số nguyên đã ký.
  • Các chỉ số con quay hồi chuyển được tính bằng đơn vị độ / giây (dps); Các chỉ số gia tốc kế theo đơn vị g; và nhiệt độ đọc là ở độ Celsius.

Lập trình PIC18F4550 cho MPU6050
Hãy giao diện và lập trình PIC18F4550 với mô-đun cảm biến MPU6050 (Gyro meter + Accelerometer + Temperature) để đọc tất cả các giá trị cảm biến và gửi tất cả các giá trị trên các đầu cuối máy tính qua USART.
  • Vì MPU-6050 có giao diện truyền thông I2C, chúng tôi đang kết nối nó với I2C của PIC18F4550.
  • Các mô-đun yêu cầu + 5V DC cung cấp điện, do đó, kết nối nó với VCC pin của một mô-đun.
  • Kết nối mặt đất với pin GND của một mô-đun.
  • Ở đây chúng tôi đã sử dụng FTDI nối tiếp để chuyển đổi USB để gửi các giá trị serially đến các thiết bị đầu cuối máy tính.

Interfacing MPU6050 với PIC18F4550

Giao diện MPU6050 với PIC18F4550
Giao diện PIC18F4550 với MPU6050

Chương trình

/* 
 * PIC18F4550 Interface with MPU-6050
 */

#include <pic18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include "USART_Header_File.h"
#include "I2C_Master_File.h"
#include "MPU6050_res_define.h"
#include "Configuration_header_file.h"

void MPU6050_Init()  /* Gyro initialization function */
{
 MSdelay(150);  /* Power up time >100ms */
 I2C_Start_Wait(0xD0); /* Start with device write address */
 I2C_Write(SMPLRT_DIV); /* Write to sample rate register */
 I2C_Write(0x07); /* 1KHz sample rate */
 I2C_Stop();

 I2C_Start_Wait(0xD0);
 I2C_Write(PWR_MGMT_1); /* Write to power management register */
 I2C_Write(0x01); /* X axis gyroscope reference frequency */
 I2C_Stop();

 I2C_Start_Wait(0xD0);
 I2C_Write(CONFIG); /* Write to Configuration register */
 I2C_Write(0x00); /* Fs = 8KHz */
 I2C_Stop();

 I2C_Start_Wait(0xD0);
 I2C_Write(GYRO_CONFIG); /* Write to Gyro configuration register */
 I2C_Write(0x18); /* Full scale range +/- 2000 degree/C */
 I2C_Stop();

 I2C_Start_Wait(0xD0);
 I2C_Write(INT_ENABLE); /* Write to interrupt enable register */
 I2C_Write(0x01);
 I2C_Stop();
}

void MPU_Start_Loc()

{
 I2C_Start_Wait(0xD0); /* I2C start with device write address */
 I2C_Write(ACCEL_XOUT_H);/* Write start location address to read */ 
 I2C_Repeated_Start(0xD1);/* I2C start with device read address */
}

void main()

{
 char buffer[20];
 int Ax,Ay,Az,T,Gx,Gy,Gz;
 float Xa,Ya,Za,t,Xg,Yg,Zg;
     OSCCON = 0x72;
     I2C_Init();  /* Initialize I2C */ 
 MPU6050_Init();  /* Initialize Gyro */
 USART_Init(9600); /* Initialize USART with 9600 baud rate */
 
 while(1)
 {
  MPU_Start_Loc();
  /* Read Gyro values continuously & send to terminal over UART */
  Ax = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  Ay = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  Az = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  T =  (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  Gx = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  Gy = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
  Gz = (((int)I2C_Read(0)<<8) | (int)I2C_Read(1));
  I2C_Stop();
        
  
  /* Divide raw value by sensitivity scale factor */
  Xa = (float)Ax/16384.0; 
  Ya = (float)Ay/16384.0;
  Za = (float)Az/16384.0;
  Xg = (float)Gx/131.0;
  Yg = (float)Gy/131.0;
  Zg = (float)Gz/131.0;
  t = ((float)T/340.00)+36.53;/* Convert temperature in °/c */


  /* Take values in buffer to send all parameters over USART */
  sprintf(buffer," Ax = %.2f g\t",Xa);
  USART_SendString(buffer);

  sprintf(buffer," Ay = %.2f g\t",Ya);
  USART_SendString(buffer);
  
  sprintf(buffer," Az = %.2f g\t",Za);
  USART_SendString(buffer);

  /* 0xF8 Ascii value of degree '°' on serial */
  sprintf(buffer," T = %.2f%cC\t",t,0xF8);
  USART_SendString(buffer);

  sprintf(buffer," Gx = %.2f%c/s\t",Xg,0xF8);
  USART_SendString(buffer);

  sprintf(buffer," Gy = %.2f%c/s\t",Yg,0xF8);
  USART_SendString(buffer);
  
  sprintf(buffer," Gz = %.2f%c/s\r\n",Zg,0xF8);
  USART_SendString(buffer);
 }
}

Cửa sổ đầu ra của thiết bị đầu cuối

Cửa sổ đầu ra sẽ hiển thị tất cả các giá trị được đề cập bên dưới
Ax = Tốc độ trục x dữ liệu trong đơn vị g
Ay = Gia tốc trục y dữ liệu trong đơn vị g
Az = Gia tốc z trục dữ liệu trong đơn vị g
T = nhiệt độ theo độ / celcius
Dữ liệu trục Gx = Gyro x tính bằng đơn vị độ / giây
Dữ liệu trục Gy = Gyro y ở đơn vị độ / giây
Dữ liệu trục Gz = Gyro z theo đơn vị độ / giây
Đầu ra đầu ra

Code
Tập tin đính kèm



Không có nhận xét nào:

Đăng nhận xét