آموزش راه اندازی مبدل آنالوگ به دیجیتال با کدویژن
رجیستر های کنترلی ADC
در این قسمت رجیستر های کنترلی atmega16 را توضیح می دهیم
ADMUX
![[تصویر: admax.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/admax.png)
MUX4..0
با استفاده از این بیت ها می توان ورودی کانال ADC را مطابق با جدول زیر انتخاب کرد
![[تصویر: mux.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/mux.png)
REFS0..1
این دو بیت ولتاژ مرجع ADC را مطابق جدول زیر مشخص می کند.
![[تصویر: refs1.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/refs1.png)
نکته:برای استفاده از ولتاژ مرجع داخلی و خارجی باید از مدار های زیر استفاده کرد
داخلی:
![[تصویر: KHAREG.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/KHAREG.png)
خارجی:
![[تصویر: DAKHEL.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/DAKHEL.png)
ADCSRA
![[تصویر: adcsra.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/adcsra.png)
ADEN
با یک کردن این بیت ADC فعال می شود. و با صفر کردن آن مبدل آنالوگ به دیجیتال غیر فعال می شود
ADSC
در مد عملکرد Single برای شروع تبدیل باید این بیت یک شود ولی در حالت Free فقط برای شروع اولین تبدیل باید باید این بیت یک شود
ADATE
با یک کردن این بیت ADC می تواند به صورت اتوماتیک با لبه بالا رونده منبع تحریک کننده شروع به تبدیل کند. منیع تحریک توسط بیت های ADTS از رجیستر SFIOR انتخاب می شود.
ADIF
این بیت زمانی یک می شود که عمل تبدیل به پایان رسیده باشد . درکل به کمک این بیت ما می توانیم لحظه اتمام تبدیل را مشخص کنیم و مقدار ADC را بخوانیم
ADIE
با یک کردن این بیت و بیت I در رجیستر SREG می توانیم وقفه مربوط به اتمام تبدیل ADC فعال ی شود
ADPS2..0
توسط این بیت ها می توان تقسیم فرکانسی ADC را تعیین کرد.فرکانس ADC از کلاک سیستم تامین می شوند
![[تصویر: adps.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/adps.png)
SFIOR
![[تصویر: sfior.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/sfior.png)
ADTS2..0
زمانی که بیت ADATE در رجیستر ADCSRA یک شود مطابق جدول زیر این بیت ها منبع تحریک را در تبدیل ADC مشخص می کنند
![[تصویر: adts.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/adts.png)
تنظیمات مبدل آنالوگ به دیجیتال در کدویزارد
به زبانه ی ADC بروید
![[تصویر: ADC0.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/ADC0.png)
همان طور که مشاهده می کنید این برگه فقط یک گزینه دارد و آن هم ADC Enable است با فعال کردن این گزینه ADC فعال می شود برگه مربوط به به صورت زیر می شود
![[تصویر: adc1.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/adc1.png)
Use 8-Bit
این گزینه حالت تبدیل 8 بیتی را فعال می کند
Adc Interrupt
این گزینه وقفه ADC را فعال می کند. زمانی که این گزینه را انتخاب می کنید برگه ADC به این صورت می شود
![[تصویر: ADC2.png]](http://dl2.pcbook.ir/hadikh73/learn/codevision/adc/ADC2.png)
Noise Canceler
در صورت استفاده از وقفه ADC این گزینه نمایان می شود و برای کم کردن نویز در عمل تبدیل استفاده می شود در صورت استفاده از این حالت گزینه ی Automatically Scan Inputs غیر فعال می شود
Volt Ref
ولتاژ مرجع برای تبدیل را مشخص می کند
AREF pin
با این گزینه پایه AREF را به عنوان ولتاژ مرجع انتخاب می کنیم
AVCC pin
با این گزینه پایه AVCC را به عنوان ولتاژ مرجع انتخاب می کنیم
Int., cap.on AREF
با این گزینه ولتاژ داخلی 2.56V به عنوان ولتاژ مرجع انتخاب می شود
Clock
این گزینه فرکانس کاری ADC را مشخص می کند
Automatically Scan Inputs
این گزینه زمانی فعال می شود که تیک Adc Interrupt را انتخاب کنیم . این گزینه تعداد پایه ها یی را که مبدل آنالوگ به دیجیتال به صورت اتوماتیک چک می کند را مشخص می کند که از پایه First تا Last را مداوم چک می کند
نکته مقدار ADC از این فرمول محاسبه می شود
مقدار ADC = (ولتاژ وررودی*1024)/ولتاژ مرجع
پروژه 13: نمایش عدد متناظر با ولتاژ داده شده به ADC روی ال سی دی
هدف:آموزش روش استفاده از ADC
در کدویزارد میکروکنترلر را atmega8 و فرکانس میکروکنترلر را روی 1000000 تنظیم کنید حالا زبانه ی port را باز کنید وportc.0 را ورودی تعریف کنید به زبانه ی adc بروید و گزینه ی adc enable را تیک بزنید پایه AREF را ولتاژ مرجع انتخاب کنید و فرکانس کاری را روی 125000 تنظیم کنید. به زبانه ی lcd بروید و پورت b را به عنوان ال سی دی مشخص کنید و نوع ال سی دب را 16*2 انتخاب کنید و فایل را به نام adc0 ذخیره کنید .
قسمت های اضافی را حذف کنید.
فایل نهایی به این در می آید
کد php:
#include #asm .equ __lcd_port=0x18 ;PORTB#endasm#include
#include
#define ADC_VREF_TYPE 0x00unsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Delay needed for the stabilization of the ADC input voltagedelay_us(10);// Start the AD conversionADCSRA|=0x40;// Wait for the AD conversion to completewhile ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}void main(void){PORTC=0x00;DDRC=0x00;// ADC initialization// ADC Clock frequency: 125.000 kHz// ADC Voltage Reference: AREF pinADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0x83;lcd_init(16);while (1) { // Place your code here
};} ابتدا باید کتابخانه ی stdio.h را در ابتدای برنامه با این دستور فعال کنید
#include
یاد آوری :این کتاب خانه برای فعال کردن دستور sprintf استفاده می شود
در ابتدای برنامه یک متغییر از نوع int و به نام a تعریف می کنیم
و یک متغیر از نوع char و به نام str و به اندازه ی 20 تعریف می کنیم
کد php:
Int a;Char str[20]; دستور
کد php:
Var=Read_adc(x); Var متغیری که مقدار adc در آن قرار می گیرد
X شماره ی پایه ای است که ADC در آن اندازگیری می شود
حال در حلقه ی اصلی می نویسیم
کد php:
A=read_adc(0) مقدار ADC را در متغیر a می ریزیم
حال باید متغیر a را نمایش دهیم که با دستور
کد php:
Sprint(str,”%u”,a); متغیر a را به رشته str تبدیل می کنیم
با دستور
کد php:
Lcd_clear(); صفحه نمایش را پاک می کنیم
با دستور
کد php:
Lcd_gotoxy(0,0); مکان نما را به 1و1 می بریم
و با دستور
کد php:
Lcd_puts(str); متغیر str را روی lcd نمایش می دهیم
و در نهایت یک تاخیر 100 میلی ثانیه ای ایجاد می کنیم
نکته: در فایل شبیه ساز پروتئوس باید پایه های AVCC و AREF را به مثبت وصل کنیم و برای ایجاد ولتاژ متغیر از پتانسیومتر استفاده می کنیم
متن کامل برنامه:
کد php:
#include #asm .equ __lcd_port=0x18 ;PORTB#endasm#include
#include #include #define ADC_VREF_TYPE 0x00unsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);delay_us(10);ADCSRA|=0x40;while ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}void main(void){ int a;char str[20];PORTC=0x00;DDRC=0x00;// ADC initialization// ADC Clock frequency: 125.000 kHz// ADC Voltage Reference: AREF pinADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0x83;lcd_init(16);while (1) { a=read_adc(0); sprintf(str,"%u",a); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(100); };} پروژه 14:ولتمر 0 تا 5 ولت با LCD
هدف:نمایش یک عدد اعشاری روی ال سی دی
از آنجایی که ADC میکرو بسیار دقیق می باشد پس این ولت متر بسیار دقیق است فبل از شروع باید 2 نکته را توضیح دهیم
نکته1: adc ولتاژ 0 تا 5 ولت را به 1024 قسمت تقسیم می کند(چون ولتاژ مرجع 5 ولت است) پس باید برای بدست آوردن ولتاژ ورودی 5 را بر 1023 تقسیم کنیم . عدد بدست آمده مساوی0.004887 می شود. حال اگر عددی را که ADC به ما می دهد در این عدد ضرب کنیم ولتاژ ورودی به پایه ADC به دست می آید.
نکته2:نمایش متغییر اعشاری روی ال سی دی: برای این کار بایدعدد اعشاری را با دستور زیر به رشته تبدیل کنیم
کد php:
Ftoa(z,y,x); X رشته تولید شده
Yیک عدد است که تعداد ارقام اعشاری را مشخص می کند
Z متغیری که باید به رشته تبدیل شود
نکته : این دستور در کتابخانه ی stdlib.h قرار دارد
در کدویزارد میکروکنترلر را atmega8 و فرکانس میکروکنترلر را روی 1000000 تنظیم کنید حالا زبانه ی port را باز کنید وportc.0 را ورودی تعریف کنید به زبانه ی adc بروید و گزینه ی adc enable را تیک بزنید پایه AREF را ولتاژ مرجع انتخاب کنید و فرکانس کاری را روی 125000 تنظیم کنید. به زبانه ی lcd بروید و پورت b را به عنوان ال سی دی مشخص کنید و نوع ال سی را 16*2 انتخاب کنید و فایل را به نام adc1 ذخیره کنید و قسمت های اضافی را حذف می کنیم .
کتابخانه ی stdio.h و هم چنین کتابخانه ی stdlib.h را در ابتدای برنامه تعریف می کنیم
یک متغیر به نام a و از نوع int تعریف می کنیم
حال در حلقه ی اصلی با دستور
کد php:
A=read_adc(0); مقدار adc را در متغیر a می ریزیم
حال باید یک متغیر اعشاری ازنوع float و به نام b تعریف می کنیم
کد php:
Float b; اکنون باید a را در 0.004887 ضرب کنیم و در b بریزیم
دو متغیر از نوع char و به نام های str و str1 به اندازه ی 20 تعریف می کنیم
کد php:
Char str[20], str1[20]; حالا با دستور زیر عدد را به رشته تبدیل می کنیم
کد php:
Ftoa(b,2,str); حال با دستور زیر به رشته ی قابل چاپ تبدیل می کنیم
کد php:
Sprint(str1,”%s”,str); و با دستورات زیر صفحه lcd را پاک می کنیم ، مکان را به 1و1 می بریم و روی lcd نمایش می دهیم
کد php:
Lcd_clear();Lcd_gotoxy(0,0);Lcd_puts(str1); در نهایت یک تاخیر 100 میلی ثانیه ای
متن کامل برنامه:
کد php:
#include #asm .equ __lcd_port=0x18 ;PORTB#endasm#include
#include #include #include #define ADC_VREF_TYPE 0x00unsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Delay needed for the stabilization of the ADC input voltagedelay_us(10);// Start the AD conversionADCSRA|=0x40;// Wait for the AD conversion to completewhile ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}void main(void){ int a;float b;char str[20],str1[20];PORTC=0x00;DDRC=0x00;// ADC initialization// ADC Clock frequency: 125.000 kHz// ADC Voltage Reference: AREF pinADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0x83;lcd_init(16);while (1) { a=read_adc(0); b=a*0.004887; ftoa(b,2,str); sprintf(str1,"%s",str); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(str1); delay_ms(100); };} موفق باشید
+ نوشته شده در 15 Oct 2013 ساعت 20 توسط حــ ا مـــ د
|