پروژه-راه-اندازی-ICM-20689

پروژه راه اندازی سنسور ژیروسکوپ و شتاب سنج ICM20689 با استفاده از مجموعه آموزشی AVR WIZARD به زبان C

0

 راهنمای راه اندازی سنسور ژیروسکوپ و شتاب سنج ICM20689 با استفاده از مجموعه آموزشی AVR WIZARD به زبان C

هدف از این آموزش راه اندازی واحد I2C با  سنسور ژیروسکوپ و شتاب سنج

ICM20689 ، به زبان برنامه نویسی C  توسط مجموعه آموزشی AVR WIZARD میباشد .

لوازم مورد نیاز

  1. برد اصلی AVR WIZARD
  2. LCD2X16
  3. ماژول سنسور ژیروسکوپ و شتاب سنج ICM20689
  4.  تغذیه 9 ولت

شتاب سنج سنسور هایی هستند که شتاب را اندازه گیری می کنند ، یعنی سرعت تغییر یک جسم بر حسب متر در مجذور ثانیه (m / s2) ). شتاب سنج برای سنجش لرزش در سیستم ها یا برنامه های جهت گیری مفید هستند. شتاب سنج ها دستگاه های الکترومکانیکی هستند که نیروی استاتیک یا دینامیکی شتاب را حس می کنند. نیروهای استاتیک شامل جاذبه هستند ، در حالی که نیروهای پویا می توانند شامل ارتعاشات و حرکت شوند.

شتاب سنج می تواند شتاب را در یک ، دو یا سه محور اندازه گیری کند. واحدهای 3 محوره با کاهش هزینه های توسعه برای استفاده متداول تر می شوند.

بطور کلی شتاب سنجها داخل صفحاتی دارای خازن هستند. برخی از این موارد ثابت بوده ، در حالی که برخی دیگر به فنرهایی وصل شده اند که در اثر حرکت نیروهای شتاب دهنده بر روی سنسور ، به سمت داخل حرکت می کنند. هرچه این صفحات در رابطه با یکدیگر حرکت کنند ، ظرفیت بین آنها تغییر می کند. از این تغییرات ظرفیت می توان شتاب را تعیین کرد.

سایر شتاب سنجها می توانند در اطراف مواد پیزو الکتریک محور باشند. این سازه های کریستالی ریز هنگامی که تحت فشار مکانیکی قرار می گیرند ، بار الکتریکی تولید می کنند (مثلاً شتاب).

بیشتر شتاب سنجها دامنه انتخابی از نیروهایی را دارند که می توانند اندازه بگیرند. این محدوده می تواند از 1 G تا 250 G متغیر باشد. به طور معمول هر چه دامنه کوچکتر باشد ، خوانش ها از شتاب سنج حساس تر خواهد بود. به عنوان مثال برای اندازه گیری ارتعاشات کوچک روی میز ، استفاده از شتاب سنج با برد کوچک ، داده های دقیق تری را نسبت به استفاده از برد 250g  که برای موشک ها مناسب تر است  ارائه می دهد.

نحوه اتصال و برقراری ارتباط با شتاب سنج

انواع شتاب سنج ها از طریق رابط ، اتصال آنالوگ ، دیجیتال یا پالس ارتباط برقرار می کنند:

آنالوگ – شتاب سنج با یک رابط آنالوگ شتاب را از طریق متغیر ولتاژ نشان می دهد. این مقادیر معمولاً بین سطح زمین و ولتاژ منبع تغذیه متغیر هستند. سپس می توان از ADC در میکروکنترلر برای خواندن این مقدار استفاده کرد. این شتاب سنج  ها معمولاً ارزانتر از شتاب سنجهای دیجیتال هستند.

دیجیتال – شتاب سنج با رابط دیجیتال می توانند با پروتکل های ارتباطی SPI یا I2C ارتباط برقرار کنند. این شتاب سنج ها عملکرد بیشتری دارند و نسبت به شتاب سنجهای آنالوگ کمتر مستعد ابتلا به نویز  هستند.

Pulse-Width Modulation (PWM) – شتاب سنج هایی که داده ها را از طریق مدولاسیون پالس (PWM) استخراج می کنند ، امواج مربعی را با یک دوره مشخص تولید می کنند .

سنسور ژیروسکوپ

ژیروسکوپ یا GYRO سنسور هایی هستند که حرکت چرخشی را اندازه گیری می کنند. gyros   MEMS (سیستم میکروالکترومکانیکی) سنسورهای کوچک و ارزان قیمتی هستند که سرعت زاویه ای را اندازه می گیرند. واحدهای سرعت زاویه ای در درجه در ثانیه (درجه در ثانیه) یا چرخش در ثانیه (RPS) اندازه گیری می شوند. سرعت زاویه ای اندازه گیری سرعت چرخش است.

Gyros می تواند برای تعیین جهت گیری مورد استفاده قرار گیرد و در بیشتر سیستم های ناوبری یافت می شود. به عنوان مثال ، اگر می خواهید یک ربات را متعادل کنید ، می توان از ژیروسکوپ برای اندازه گیری چرخش از حالت تعادل و ارسال اصلاحات به یک موتور استفاده کرد. هنگامی که همه چیز در یک محور می چرخد ،  دارای سرعت زاویه ای است. چرخ ریسندگی را می توان با چرخش در ثانیه (RPS) یا درجه در ثانیه (درجه در ثانیه) اندازه گیری کرد. اگر سنسور را به چرخ نشان داده شده در بالا وصل کنید ، می توانید سرعت زاویه ای محور z gyro را اندازه گیری کنید. دو محور دیگر هیچ چرخشی را اندازه گیری نمی کنند.

چرخش-در-ژایرو
چرخش در ژایروسکوپ

تصور کنید که چرخ یک بار در هر ثانیه می چرخد. سرعت زاویه ای 360 درجه در ثانیه خواهد داشت. جهت چرخش چرخ نیز مهم است. آیا در اطراف محور عقربه های ساعت است یا خلاف عقربه های ساعت؟

یک ژیروسکوپ MEMS با محور سه گانه ، مشابه آنچه در تصویر بالا نشان داده شده است (ITG-3200) ، می تواند چرخش را در حدود سه محور: x ، y و z اندازه گیری کند. بعضی از ژیروها در محورهای یک و دو محوره قرار می گیرند ، اما ژیرو محور سه گانه در یک تراشه منفرد کوچکتر ، ارزان تر و محبوب تر می شود.

 

سنسور ژایروسکوپ

ژیروسکوپ اغلب در اشیایی استفاده می شوند که به هیچ وجه خیلی سریع نمی چرخند مثل هواپیماها .در عوض ، آنها در هر محور چند درجه می چرخند. با شناسایی این تغییرات کوچک ، ژیروسکوها به ثبات پرواز هواپیما کمک می کنند. همچنین توجه داشته باشید که شتاب یا سرعت خطی هواپیما تاثیری در اندازه گیری ژیرو ندارد. سنسور ژیروسکوپ در MEMS بسیار کوچک است (بین 1 تا 100 میکرومتر ، اندازه موهای انسان). هنگامی که ژیر چرخانده می شود ، با تغییر سرعت زاویه ای ، یک توده تشدید کننده کوچک جابجا می شود. این حرکت به سیگنالهای الکتریکی بسیار کم جریان تبدیل می شود که توسط میکروکنترلر میزبان تقویت و خوانده می شود.

سنسور-های-MEMS

 

سنسورهای MEMS

خصوصیات ژیروسکوپ

دامنه:

دامنه اندازه گیری یا دامنه تمام مقیاس حداکثر سرعت زاویه ای است که ژیروسکوپ می تواند بخواند. به آنچه می سنجید فکر کنید که آیا شما نیاز دارید که چرخش یک دستگاه ضبط ، که بسیار کند است یا یک چرخ نخ ریسی را اندازه گیری کنید ، که می تواند خیلی سریع باشد؟

حساسیت:

حساسیت در mV در هر درجه در ثانیه (mV / ° / s) اندازه گیری می شود. تعیین می کند که چقدر ولتاژ برای یک سرعت زاویه ای مشخص تغییر می کند. به عنوان مثال ، اگر یک ژیرو با حساسیت 30mV / ° / s مشخص شده است و تغییر 300 میلی ولت در خروجی را مشاهده می کنید ، شما ژیروژ را با 10 درجه در ثانیه چرخانده اید.

یک قانون خوب برای به یاد آوردن: با افزایش حساسیت ، دامنه کاهش می یابد. به عنوان مثال ، به صفحه داده gyro LPY503 یا هر ژیرو با دامنه انتخابی نگاه کنید.توجه کنید که با دامنه بیشتر ، حساسیت وضوح کمتری می گیرید.

BIAS:

مانند هر سنسور ، مقادیر اندازه گیری شده حاوی مقداری خطا است. هنگامی که هنوز ژیروسکوپ است ، می توانید با اندازه گیری میزان خروجی ، خطای ژیرو را مشاهده کنید. این خطاها گاهی اوقات بی ثبات یا بی ثباتی نامیده می شوند. دمای سنسور روی BIAS تأثیر زیادی دارد. برای كمك به حداقل رساندن منبع این خطا ، بیشتر آنها همراه سنسور دما داخلی ساخته شده اند. بنابراین ، شما قادر به خواندن دمای سنسور و اصلاح یا هرگونه تغییر وابسته به دما هستید. برای تصحیح این خطاها ، باید ژیرو کالیبره شود. این کار معمولاً با ثابت نگه داشتن gyro و صفر کردن تمام خوانش های موجود در کد شما انجام می شود.

پین های ماژول ICM20689

ماژول-ICM-20689

 

ماژول ICM20689

برنامه نویسی

کد برنامه نویسی به زبان c هدر فایل TWI

[cpp] #ifndef TwoWire_h #define TwoWire_h #include <mega16a.h> #define uint8_t unsigned char #define ACK 0 #define NACK 1 void Twi_Start(void); void Twi_Send(uint8_t data) ; uint8_t Twi_ReadStatus(void) ; void Twi_Stop() ; void Twi_Init(void) ; uint8_t Twi_Read(uint8_t ack_n) ; void Twi_AsSlave(uint8_t slave_a) ; void Twi_listen(void) ; void Twi_Start(void) { TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while ((TWCR & (1<<TWINT))==0); } void Twi_Send(uint8_t data) { TWDR=data; TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); while ((TWCR & (1<<TWINT))==0); } uint8_t Twi_ReadStatus(void) { uint8_t i=0; i=TWSR & 0XF8; return i; } void Twi_Stop() { TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); } void Twi_Init(void) { TWSR=0; TWBR=0x48; TWCR=0x44; } uint8_t Twi_Read(uint8_t ack_n) { if(ack_n==0) TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); else TWCR=(1<<TWINT)|(1<<TWEN); while ((TWCR & (1<<TWINT))==0); return TWDR; } void Twi_AsSlave(uint8_t slave_a) { TWAR=slave_a; TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); } void Twi_listen(void) { while ((TWCR & (1<<TWINT))==0); } #endif [/cpp]

 

در ادامه برنامه به زبان C در تابع MAIN را مشاهده می کنید

[cpp] /******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 01/14/2020 Author : Company : Comments: Chip type : ATmega16A Program type : Application AVR Core Clock frequency: 16.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega16a.h> #include <alcd.h> #include <delay.h> #include <stdlib.h> #include "TCS34725.h" #include "Twi.h" #define WHO_AM_I 0x75 #define ICM20689_ADDRESS 0x68 #define ICM20689_ADDRESS_WRITE 0|(ICM20689_ADDRESS<< 1) #define ICM20689_ADDRESS_READ 1|(ICM20689_ADDRESS<< 1) #define ICM20689_CONFIG 0X1A #define ICM20689_GYRO_CONFIG 0X1B #define ICM20689_ACCEL_CONFIG 0X1C #define ICM20689_ACCEL_CONFIG2 0X1D #define ICM20689_LPMODE_CFG 0X1E #define ICM20689_FIFO_ENA 0X23 #define ICM20689_USER_CONTROL 0X6A #define ICM20689_PWR_MGMT1 0X6B #define ICM20689_PWR_MGMT2 0X6C #define ACCEL_XOUT_H 0X3B #define ACCEL_XOUT_L 0X3C #define ACCEL_YOUT_H 0X3D #define ACCEL_YOUT_L 0X3E #define ACCEL_ZOUT_H 0X3F #define ACCEL_ZOUT_L 0X40 void ICM20689_WriteData(uint8_t RegisterName,uint8_t value) { Twi_Start(); Twi_Send(ICM20689_ADDRESS_WRITE); Twi_Send(RegisterName); Twi_Send(value); } uint8_t ICM20689_ReadData(uint8_t RegisterName) { Twi_Start(); Twi_Send(ICM20689_ADDRESS_WRITE); Twi_Send(RegisterName); Twi_Start(); Twi_Send(ICM20689_ADDRESS_READ); return Twi_Read(NACK); } void ICM20689_Init(void) { ICM20689_WriteData(ICM20689_PWR_MGMT1,0x20) ; ICM20689_WriteData(ICM20689_PWR_MGMT2,0x80) ; ICM20689_WriteData(ICM20689_CONFIG,0x7) ; ICM20689_WriteData(ICM20689_GYRO_CONFIG,0x18) ; ICM20689_WriteData(ICM20689_ACCEL_CONFIG,0x18) ; ICM20689_WriteData(ICM20689_ACCEL_CONFIG2,0x37) ; ICM20689_WriteData(ICM20689_LPMODE_CFG,0x80) ; ICM20689_WriteData(ICM20689_FIFO_ENA,0xF8) ; ICM20689_WriteData(ICM20689_USER_CONTROL,0xC0) ; } uint16_t ICM20689_GetRawData(uint8_t hvalue,uint8_t lvalue) { uint16_t x; uint16_t t; t=Tcs34725_ReadData(lvalue); delay_ms(1); x=Tcs34725_ReadData(hvalue); x <<= 8; x |= t; return x; } // Declare your global variables here // Standard Input/Output functions #include <stdio.h> void main(void) { uint8_t data_rx ; uint16_t xa, ya, za; char xabuffer[6],yabuffer[6],zabuffer[6]; // 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<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x67; // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS – PORTB Bit 0 // RD – PORTB Bit 1 // EN – PORTB Bit 2 // D4 – PORTA Bit 4 // D5 – PORTA Bit 5 // D6 – PORTA Bit 6 // D7 – PORTA Bit 7 // Characters/line: 16 //printf("hi "); lcd_init(16); lcd_putsf( " HI Wellcom " ) ; lcd_gotoxy( 0 , 1 ); lcd_putsf( "TO REDRONIC.COM" ) ; delay_ms(2000); lcd_clear(); Twi_Init() ; ICM20689_Init(); while (1) { lcd_clear(); xa=ICM20689_GetRawData(ACCEL_XOUT_H,ACCEL_XOUT_L); ya=ICM20689_GetRawData(ACCEL_YOUT_H,ACCEL_YOUT_L); za=ICM20689_GetRawData(ACCEL_ZOUT_H,ACCEL_ZOUT_L); itoa (xa,xabuffer); itoa (ya,yabuffer); itoa (za,zabuffer); lcd_gotoxy(0,0); lcd_putsf("XA:"); lcd_gotoxy(3,0); lcd_puts(xabuffer); lcd_gotoxy(9,0); lcd_putsf("YA:"); lcd_gotoxy(12,0); lcd_puts(yabuffer); lcd_gotoxy(0,1); lcd_putsf("ZA:"); lcd_gotoxy(3,1); lcd_puts(zabuffer); delay_ms(200); // lcd_gotoxy(9,1); // lcd_putsf("C"); // lcd_gotoxy(11,1); // lcd_puts(clearbuffer); // data_rx=Tcs34725_ReadData(WHO_AM_I); // printf(" id=%x ",data_rx); // delay_ms(2000); } } [/cpp]

خروجی برنامه

پروژه-راه-اندازی-ICM-20689ر

Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com