میکروکنترلر adc مبدل آنالوگ به دیجیتال

saalek110

Well-Known Member
در میکروکنترلر های AVR یک واحد وجود دارد به نام ADC یا همان تبدیل کننده آنالوگ به دیجیتال (Analog Digital Conversion) که وظیفه آن تبدیل سیگنال های پیوسته آنالوگ به سیگنال های گسسته دیجیتال است.
 

saalek110

Well-Known Member
سنسور ها و … کلا اجزای بیرون از کامپیوتر با سیگنال آنالوگ کار میکنند در صورتی که میکروکنترلر ها با سیگنال دیجیتال کار میکنند و ما برای تبدیل اطلاعات آنالوگ به دیجیتال از ADC میکروکنترلر استفاده میکنیم.
 

saalek110

Well-Known Member
در میکروکنترلر ATMEGA16 (و ATMEGA32) هشت پایه به ADC اختصاص داده شده، یعنی شما می توانید به صورت همزمان ، خروجی ۸ سنسور یا مدار جانبی را به میکرو کنترلر خود وصل کنید و اطلاعات آن ها را به وسیله ی ADC دریافت کنید. اما این ۸ پایه کدام پایه ها هستند؟ این ۸ پایه ، پایه های مربوط به پورت A هستند.

Screenshot_۲۰۲۳-۱۲-۰۲_۰۳۳۱۱۹.jpg

منبع:
 

saalek110

Well-Known Member
یکی از کاربردهای مهم ADC میتواند در رباتها برای تشخیص رنگ باشد. همانطور که میدانید هر رنگ میزان مشخصی از نور را بازتاب می دهد و بقیه را جذب می کند، ما با اندازه گیری مقدار نور بازتاب شده ، میتوانیم رنگ را تشخیص دهیم . در اینجا ما برای اندازه گیری میزان شدت نور بازتاب شده ، باید از ADC میکروکنترلر استفاده کنیم تا بتوانیم ولتاژ خروجی سنسور نوری خود را به دقت اندازه گیری کنیم.
 

saalek110

Well-Known Member

یک برنامه برای کدویژن گذاشته ، من تست نکردم فعلا.

PHP:
#include <mega16a.h>
#include <delay.h>
#include <alcd.h>      
#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))  // هست که توسط خود کدويژن ايجاد مي شود ADC از خط 4 تا خط 13 کتابخانه //
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=(1<<ADSC);
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}

void main(void)
{
int a;        // خوانده شده از پين هاي ميکرو در ان ADC براي ريختن مقادير int از نوع a تعريف متغيري به نام //

DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

ADMUX=ADC_VREF_TYPE;   // هستند که با توجه به تنظيماتي که در کدويزارد انجام داديم توسط خود کدويژن ايجاد مي شوند ADC از خط 25 تا27 رجيسترهاي //
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

lcd_init(16);

while (1)
      {
      a=read_adc(0);         // a خواندن عددي بين 0 تا 1023 که نشان دهنده مقدار ولتاژ انالوگ روي ان پين ميکرو است و ريختن ان در متغير //
      if(a<410)            //را مينويسد Vin is lower 2V عبارت LCD اگر عدد خوانده شده از 410 که با توجه به فرمول تناسب مي شود 2 ولت کمتر بود روي //
       {
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Vin is lower 2V");
        delay_ms(300);
       }
      if(a>410)            //را مينويسد More Vin of 2V عبارت LCD اگر ولتاژ خوانده شده بيشتر از 2 ولت بود روي //
       {
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("More Vin of 2V");
        delay_ms(300);
       }

       }
}

در سایت بالا توضیح داده چطوری کار کنیم.


در این پروژه مبدل انالوگ به دیجیتال میکرو (ADC) تشخیص می دهد که ولتاژی که به پین ADC0 می دهیم کمتر از 2 ولت است یا بیشتر و درنهایت عبارتی روی LCD کاراکتری نمایش می دهد.

نکته : همانطور که در شماتیک بالا مشاهده می کنید, برای استفاده از ADC میکرو باید پین AREF و AVCC را به ولتاژ مرجع خود که در اینجا 5 ولت است متصل کنید. (پین 31 را هم که در شبیه سازی Proteus وجود ندارد, به منفی وصل کنید)

adc-micro-avr2emic.ir_.png

Screenshot_۲۰۲۳-۱۲-۰۲_۰۳۴۵۳۶.jpg

نگارنده lcd را به پورت C وصل کرده ، و تنظیمات adc را در کدویزارد کدویژن طبق عکس بالا انجام داده.

سالک: با تشکر از نگارنده. از نظر من که آموزش مشکلی ندارد. ولی همین طوری نمیشه نظر داد ، باید عملی تست بشه.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا