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

Giao tiếp modul cảm biến gia tốc ADXL335

Giới thiệu


Gia tốc kế là một thiết bị cơ điện để đo lực tăng tốc do trọng lực trong đơn vị g.
Nó có thể được sử dụng cho các ứng dụng cảm biến độ nghiêng (Ví dụ: Trong điện thoại di động, các ứng dụng chơi game, vv).
ADXL335 đo gia tốc dọc theo trục X, Y và Z.
Nó cung cấp cho đầu ra điện áp analog tỷ lệ thuận với gia tốc dọc theo 3 trục.
Các điện áp này có thể được chuyển đổi thành tín hiệu số bằng ADC và sau đó được xử lý bởi vi điều khiển để tìm ra độ nghiêng.
ADXL335 với PIC18f4550
  • Như mô-đun có đầu ra tương tự. chúng tôi sẽ đo lường nó bằng cách sử dụng các kênh ADC của PIC18F4550 .
  • PIC18F4550 có chân ADC trên PORT A.
  • Vì vậy, chúng tôi sẽ kết nối đầu ra analog X, Y và Z của mô-đun ADXL335 với ba kênh ADC đầu vào của PIC18F4550, nói kênh0, kênh1, kênh2 tương ứng.
  • Và sau khi đọc các giá trị ADC của X, Y và Z từ mô-đun, chúng tôi sẽ gửi nó tới PC / Laptop qua USART.

Sơ đồ

Giao diện PIC18F4550 với ADXL335 Accelerometer
PIC18F4550 với ADXL335

Chương trình cho trục XYZ

/*
 * Accelerometer interface with PIC18F4550
 * 
 */

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


int main() 
{
    char Buffer[10];
    OSCCON = 0x72;         /* Internal Oscillator frequency 8 MHz */
    ADC_Init();            /* Initialize ADC */
    USART_Init(9600);      /* Initialize USART with 9600 baud rate */
    while(1)
    {                      /* Read ADC channel 0,1,2 & send values over USART */
        sprintf(Buffer,"X = %d ",ADC_Read(0));
        USART_SendString(Buffer);
        USART_TxChar(0x09);
        MSdelay(10);
        sprintf(Buffer,"Y = %d ",ADC_Read(1));
        USART_SendString(Buffer);
        USART_TxChar(0x09);
        MSdelay(10);
        sprintf(Buffer,"Z = %d ",ADC_Read(2));
        USART_SendString(Buffer);
        USART_TxChar(0x0A);
        USART_TxChar(0x0D);
        MSdelay(10);
    }
}

Cửa sổ đầu ra

Trên ứng dụng đầu cuối nối tiếp của PC / Laptop, chúng ta có thể thấy trực tiếp các giá trị ADC của X, Y, Z như trong hình bên dưới. Để thử nghiệm nghiêng mô-đun theo hướng X và Y và quan sát các thay đổi trong các giá trị X và Y.
  • Nếu chúng ta nghiêng mô-đun trên trục X, chúng ta sẽ nhận được các biến thể trong các giá trị X và Z trong khi Y sẽ vẫn gần như không đổi.
  • Nếu chúng ta nghiêng mô-đun trên trục Y, chúng ta sẽ nhận được các biến thể trong giá trị Y và Z trong khi Y sẽ vẫn gần như không đổi.
Cửa sổ đầu ra của các giá trị ADC.
Giá trị thô của ADXL XYZ
Giá trị thô của ADXL XYZ

Góc nghiêng & xoay

Ngoài ra, chúng tôi có thể tính toán gia tốc trong đơn vị g, góc nghiêng và xoay bằng ADXL335. 

Chương trình cho góc nghiêng và xoay

/*
 * Accelerometer interface with PIC18F4550
 * 
 */

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

/*This count Provide delay of 1 ms for 8MHz Frequency */
void MSdelay(unsigned int val)
{
     unsigned int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<165;j++);
}
void SendSerial(const char* str, double value, char unit)
{
 char buffer[10];
 sprintf(buffer,"%.2f",value);
 USART_SendString(str); /* Send Name string */
 USART_SendString(buffer);/* Send value */
 USART_TxChar(unit); /* Send unit char */
 USART_TxChar('\t'); /* Send tab char */
 MSdelay(10);
}

int main(void)
{
 int ADC_X_VALUE,ADC_Y_VALUE,ADC_Z_VALUE;
 double Axout,Ayout,Azout,theta, psy, phi,roll,pitch,yaw;
 OSCCON = 0x72;  /* Internal Osc. frequency 8 MHz */
 USART_Init(9600); /* Initialize USART with 9600 Baud rate */
 ADC_Init();  /* Initialize ADC */

 while(1)
 {
  ADC_X_VALUE = ADC_Read(0);/* Read X, Y, Z axis ADC value */
  ADC_Y_VALUE = ADC_Read(1);
  ADC_Z_VALUE = ADC_Read(2);

  /* Convert values in g unit */
  Axout = (((double)(ADC_X_VALUE*5)/1.024)-1700.0)/330.0; 
  Ayout = (((double)(ADC_Y_VALUE*5)/1.024)-1700.0)/330.0;
  Azout = (((double)(ADC_Z_VALUE*5)/1.024)-1700.0)/330.0;

  /* Calculate angles */
  theta = atan(Axout/(sqrt((pow (Ayout,2.0))+(pow (Azout,2.0)))))*57.29577951; 
  psy =  atan(Ayout/(sqrt((pow (Axout,2.0))+(pow (Azout,2.0)))))*57.29577951;
  phi =  atan((sqrt((pow (Ayout,2.0))+(pow (Axout,2.0))))/Azout)*57.29577951;

  roll = (atan2(Ayout,Azout))*57.29577951+180;
  pitch =  (atan2(Azout,Axout))*57.29577951+180;
  yaw =  (atan2(Axout,Ayout))*57.29577951+180;
  
  SendSerial("Axout = ",Axout,'g');/* Send All value serially */
  SendSerial("Ayout = ",Ayout,'g');
  SendSerial("Azout = ",Azout,'g');

  SendSerial("Theta = ",theta,248);
  SendSerial("Psy = ",psy,248);
  SendSerial("Phi = ",phi,248);

  SendSerial("Roll = ",roll,248);
  SendSerial("Pitch = ",pitch,248);
  SendSerial("Yaw = ",yaw,248);
        
  USART_SendString("\r\n");
 }
}

Cửa sổ đầu ra

Tăng tốc trong đơn vị g
Tăng tốc ADXL335
Tăng tốc ADXL335
Góc nghiêng
ADXL335 Góc nghiêng
ADXL335 Góc nghiêng
Góc quay
ADXL335 Góc quay
ADXL335 Góc quay

Code
Tập tin đính kèm



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

Đăng nhận xét