فهرست مطالب
راهنمای راه اندازی سنسور شتاب سنج سه محوره ADXL355
هدف: در این پروژه سنسور شتابسنج سه محوره adxl355 توسط برد AVR WIZARD راهاندازی شده و دادههای مربوطه بر روی LCDنمایش داده میشود.
مقدمهای بر سنسور ADXL355
حسگر ADXL355 ، یک حسگر شتاب سنج سه محوره با خروجی دیجیتال ( SPI یا I2C ) است که دارای چگالی نویز پایین، آفست دریفت کم 0g و مصرف توان پایین میباشد. ADXL355 قادر به اندازهگیری شتاب، در محدودههای 2.048g ، ±4.096g± و 8.192g± میباشد. از دیگر ویژگیهای آن به توانایی کار در محیطهای صنعتی، آفست دریفت پایین متاثر از تغییرات دمایی و Long term stability، میتوان اشاره کرد که برای کاربردهای دقیق با حداقل کالیبراسیون مناسب است.
همچنین به خاطر مجتمع سازی فشرده و مصرف توان پایین، این حسگر برای استفاده در گرههای حسگری اینترنت اشیا و دیگر تولیدات بیسیم مناسب است.
حسگر ADXL355 دارای یک فیلتر میانگذر داخلی قابل تنظیم است. قطبهای فیلتر بالا گذر و پایین گذر از طریق رجیسترهای مربوط به آن ها قابل تنظیم است. در حالت پیشفرض تنظیمات فیلتر به صورت زیر است:
فیلتر بالا گذر ( HPF ) : off
فیلتر میان گذر ( LPF ) : 1000 Hz
نرخ داده خروجی ( ODR ): 4000 Hz
راهاندازی ADXL355 توسط برد AVR WIZARD
قطعات مورد نیاز
- برد AVR WIZARD
- ماژول ADXL355
- آداپتور تغذیه
- سیم جامپر
کدنویسی
از طریق درگاه SPI ارتباط برقرار میکند. برای نوشتن کد مربوطه، ابتدا در CodeVision پروژه جدید تعریف کرده و درگاههای SPI آن را راه اندازی میکنیم. همچنین تنظیمات مربوط به LCD را انجام میدهیم.
ایجاد پروژه در CodeVision
برای ایجاد پروژه جدید، از شاخه File، گزینه New و سپس Project را انتخاب کنید.
سپس پیغام مربوط به code wizard را مشاهده خواهید کرد؛ دکمه Yes را بزنید.
سپس پنجره دیگری نشان داده خواهد شد؛ گزینه اول را انتخاب کرده و Ok را بزنید.
پس از تایید این گزینه، وارد صفحه جدیدی خواهید شد. در این صفحه تنظیمات مربوط به پورتهای ورودی و خروجی، LCD و SPI را انجام خواهیم داد. میکرو کنترلر استفاده شده ATMEGA32A میباشد.
پایه CS ماژول به PORTB.4 متصل است. در قسمت PORT، این پورت را به عنوان خروجی تعریف می کنیم.
سپس تنظیمات مربوط به LCD را انجام میدهیم.
همانطور که روی برد مشخص شده است، خطوط داده LCD به PORTA و خطوط فرمان به PORTB متصل هستند.
در ادامه SPI را فعال سازی میکنیم.
در پایان تنظیمات را ذخیره کرده و گزینه تولید فایلها را میزنیم.
پس از ذخیره سازی، وارد پنجره کدنویسی خواهیم شد. در این پنجره قسمتهای مشخص شده اند که کاربر کد خود را در آن جا وارد کند.
#include
// SPI functions
#include
// Alphanumeric LCD functions
#include
// Declare your global variables here
// Standard Input/Output functions
#include
#include
#include
#include
#include
#include
//adxl registers
uint8_t status_reg=0x04;
uint8_t temp2=0x06;
uint8_t temp1=0x07;
uint8_t xdata3=0x08;
uint8_t xdata2=0x09;
uint8_t xdata1=0x0A;
uint8_t ydata3=0x0B;
uint8_t ydata2=0x0C;
uint8_t ydata1=0x0D;
uint8_t zdata3=0x0E;
uint8_t zdata2=0x0F;
uint8_t zdata1=0x10;
uint8_t filter=0x28;
uint8_t range=0x2C;
uint8_t mode=0x2D;
uint8_t mode_off=0x01;
uint8_t mode_on=0x00;
long int x,y,z;
float e=0,e1=0,e2=0,k1=.01,k2=.01,k3=0,delta_u=0,out; //PID variables (change k1,k2,k3 (must be<1) to see theire effects)
float acc_x,acc_y,acc_z;
float temperatur;
char x_ch[10],y_ch[10],z_ch[10];
/************** 2G, 4G, 8G *********/
uint8_t range_value[]={0x01,0x02,0x03};
/*******************4000,2000,1000,500,250,125,62.5,31.25,15.625,7.813,3.906 HZ****/
uint8_t ODR_LPF[]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A};
void adxl_config(uint8_t,uint8_t);
void adxl_readData(uint8_t);
void uart_print(char*);
void uart_putchar(char);
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<>4; //x-axis data(20 bit)
if(x>=0x00080000) //Data is left justified and formatted as twos complement.
{
x=-1048576 - (~x+1);
}
y=(long)read_data[5]<<12 | (long)read_data[6]<<4 | read_data[7]>>4;
if(y>=0x00080000)
{
y=-1048576 - (~y+1);
}
z=(long)read_data[8]<<12 | (long)read_data[9]<<4 | read_data[10]>>4;
if(z>=0x00080000)
{
z=-1048576 - (~z+1);
}
ltoa(x,x_ch);//ltoa() function in C language converts long data type to string data type
ltoa(y,y_ch);
ltoa(z,z_ch);
acc_x=(float)x/262144; //This formula is for 2G range mode!
acc_y=(float)y/262144;
acc_z=(float)z/262144;
ftoa(acc_x,1,acc_xch); //convert a floating point number to a character array to display on LCD
ftoa(acc_y,1,acc_ych);
ftoa(acc_z,1,acc_zch);
ftoa(out,2,temp_ch);
lcd_clear();
lcd_gotoxy(0,0); //row 0 column 0
lcd_puts(acc_xch);
lcd_puts(", ");
lcd_puts(acc_ych);
lcd_puts(", ");
lcd_puts(acc_zch);
lcd_gotoxy(0,1); //row 1 column 0
lcd_puts("Temp: ");
lcd_puts(temp_ch);
lcd_puts(" 0C");
uart_print("X= ");
uart_print(x_ch); // sending data by UART
uart_print(", ");
uart_print(y_ch); // sending data by UART
uart_print(", ");
uart_print(z_ch); // sending data by UART
uart_print(". \r\n ");
}
}
void uart_putchar(char z)
{
UDR = z;
while ( !( UCSRA & (1<
خروجی برنامه
**نکات**
- دادههای سطر اول LCD، دادههای مربوط به محورهای مختلف شتاب سنج هستند که به صورت عددی در بازهی g± نشان داده شدهاند.
- سطر دوم داده مربوط به سنسور دما را نشان میدهد که برای نمایش بهتر آن، یک کنترلکننده PID بر روی آن اعمال شده است. برای تغییر ضرایب کنترل کننده، میتوان مقادیر مربوط به آن را در کد اصلاح کرد.