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

Giao tiếp modul từ kế

Giới thiệu

Mô-đun từ kế HMC5883L
Từ kế HMC5883L được sử dụng để đo hướng và cường độ của từ trường Trái Đất. Nó được sử dụng cho la bàn chi phí thấp và từ kế.
Nó đo giá trị từ trường của Trái đất dọc theo trục X, Y và Z từ milli-gauss đến 8 gausses.
Nó có thể được sử dụng để tìm hướng của thiết bị.
Nó sử dụng giao thức I2C để giao tiếp với vi điều khiển.

Lập trình từ kế HMC5883L

Hãy giao diện từ kế HMC5883L với PIC18F4550 và tính toán góc của nó. HMC5883L sử dụng giao thức I2C để giao tiếp. Ở đây chúng tôi đang kết nối PIC18F4550 như thiết bị tổng thể và HMC5883L như thiết bị nô lệ. Đó là địa chỉ thiết bị I2C là 0x3C. Các địa chỉ hoạt động đọc và ghi của nó là:
Ở đây chúng tôi đang sử dụng I2C của PIC18F4550 để giao tiếp với HMC5883L.
Địa chỉ ghi thiết bị nô lệ (SLA + W) : 0x3C
Địa chỉ đọc thiết bị Slave (SLA + R) : 0x3D

Sơ đồ

Giao diện PIC18F4550 với từ kế HMC5883L
PIC18F4550 với từ kế HMC5883L
Các bước lập trình
  • Đầu tiên, chúng ta cần thiết lập thanh ghi cấu hình A cho phép đo trung bình 8 mẫu với tốc độ đầu ra dữ liệu mặc định là 15 Hz
  • Đặt Gain bằng cách sử dụng cấu hình đăng ký B tức là ở đây 0xA0 của nó. (hoặc chúng ta có thể chọn bất kỳ lợi ích mong muốn nào khác)
  • Chọn Chế độ đo liên tục hoạt động trong Chế độ đăng ký. Do đó chế độ Register Register sẽ trở thành 0x00.
Sau khi khởi tạo, ghi vị trí bắt đầu của các thanh ghi dữ liệu đầu ra X, Y và Z, tức là 0x03 và đọc tất cả sáu giá trị thô của sổ đăng ký.
Tính toán giá trị Heading bằng cách sử dụng công thức,
Tiêu đề từ = atan2 \ frac {y} {x}       (bằng radian)
Tiêu đề thực sự = Tiêu đề từ + góc nghiêng    (bằng radian)

Chương trình

/*
 * Magnetometer interface with PIC18F4550
 * 
 */

#include <pic18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>  /* Include math header file */
#include "Configuration_header_file.h"
#include "I2C_Master_File.h"
#include "LCD_16x2_Header_file.h"

#define PI 3.14159265359 /* Define Pi value */
#define Declination -0.00669
/* Define declination of location from where measurement going to be done. e.g. here we have added declination from location Pune city,India. we can get it from http://www.magnetic-declination.com */

void Magneto_init()  /* Magneto initialize function */
{
 I2C_Start(0x3C); /* Start and write SLA+W */
 I2C_Write(0x00); /* Write memory location address */
 /* Configure register A as 8-average, 15 Hz default, normal measurement */
 I2C_Write(0x70);
 I2C_Write(0xA0); /* Configure register B for gain */
 I2C_Write(0x00); /* Configure continuous measurement mode */
 I2C_Stop();  /* Stop I2C */
}

int Magneto_GetHeading()
{
 int x, y, z;
 double Heading;
 I2C_Start_Wait(0x3C); /* Start and wait for acknowledgment */
 I2C_Write(0x03); /* Write memory location address */
 I2C_Repeated_Start(0x3D);/* Generate repeat start with SLA+R */

 /* Read 16 bit x,y,z value (2?s complement form) */
 x = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
 z = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
 y = (((int)I2C_Read(0)<<8) | (int)I2C_Read(1));
 I2C_Stop();  /* Stop I2C */
 Heading = atan2((double)y,(double)x) + Declination;
 if (Heading>2*PI) /* Due to declination check for >360 degree */
  Heading = Heading - 2*PI;
 if (Heading<0)  /* Check for sign */
  Heading = Heading + 2*PI;
 return ((int)(Heading* 180 / PI));/* Convert into angle & return */
}


int main(void)
{
 char buffer[25];
 OSCCON = 0x72;  /* Internal Oscillator frequency 8 MHz */
 TRISB &= ~(1<<4); /* Make pin5 of PORT B as input */          
 LCD_Init();  /* Initialize LCD */
 I2C_Init();  /* Initialize I2C */
 Magneto_init();  /* Initialize magneto */
 LCD_String("Magnetometer");
 while (1)
 {
  sprintf(buffer,"Heading = %d%c    ",Magneto_GetHeading(),0xDF);
  LCD_String_xy(2,0,buffer);  /* Print heading on LCD */
 }
}
Code
Tập tin đính kèm
  • HMC5883L_3-Axis_Digital_Compass_IC  Tải xuống  
  • Ứng dụng cảm biến từ tính cho hệ thống la bàn chi phí thấp  Tải xuống 
  • Ứng dụng của cảm biến từ tính trong hệ thống định vị  tải về  



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

Đăng nhận xét