۲۸-شهریور-۱۳۹۱, ۱۳:۱۲:۲۷
سلام دوستان.
اینم یک پروژه باحال.
این پروژه اندازه گیری ولتاژ 0 تا 220ولت Dc با میکروکنترل avr مدل atmega8 هستش.
مشخصات پروژه:
میکرو کنترل به کار رفته:atmega8
کریستال:8.000.000
زبان برنامه:بیسیک و سی
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
توجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:از این به بعد هر برنامه ای رو که قرار میدیم دیگه توضحات اضافی و توضیحاتی رو که قبلا دادم رو نمیدم.(بدلیل اینکه وقت ندارم).
هر کی هر سوالی داشت میتونه همینجا مطرح کنه یا ایمیل بزنه یا زنگ بزنه یا .......
برنامه به زبان بیسیک:
برنامه به زبان سی:
شبیه ساز:
توضیحات کلی:
مبدل آنالوگ به دیجیتال.
یکی از قابلیت های میکروکنترل Avr اینه که یک مبدل آنالوگ به دیجیتال 10 بیتی دارن که اگه ولتاژ آنالوگ بین 0 تا 5 ولت رو رو پایه های ADCx قرار بدیم اونو اندازه گیری میکنه و اگه 0 بود ریجستر خودشو 0 میکنه و اگه 5ولت بود رجیسترش برابر 1023میشه.
تو این پروژه هم با استفاده از پل مقاومت 220 ولت رو به 5ولت تبدیل کردیم که میکرو بتونه اونو اندازه گیری کنه.
اون پتانسیومتری رو هم که قرار دادم واسه ایته که ولتاژ رو ورودی رو تغییر بدیم.
اگه ما ولتاژ اصلی رو بر 1023 تفسیم کنیم و بعد جواب رو ضرب در مقدار ADC کنیم ولتاژ رو میتونیم رو Lcd نشون بدیم!
تـوجـه:حتما هردو پایه های Avcc و Aref رو به +5ولت متصل کنید.
توضیحات برنامه بیسیک:
1.پیکر بندی ADC در بیسیک:
فقط در اینجا اگر گزینه ی REFERENCE رو انتخاب کنیم ما 3تا انتخاب خواهیم داشت.
1.Avcc
2.Aref
3.Internal
اگه ما گزینه ی Avcc رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Avcc مقایسه میشه.
اگه ما گزینه ی Aref رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Aref مقایسه میشه.
اگه ما گزینه ی Internal رو انتخاب کنیم ولتاژ پایه adc با ولتاژ داخلی میکرو که 2.56 ولت هستش مقایسه میشه.
2.دستورات مربوط به ADC:
2-1:برای شروع مقایسه باید از دستور:
استفاده کنیم و واسه استپ کردن مقایسه از دستور:
استفاده کنیم.
2-2:برای دریافت مقدار ADC باید یک متغیر از نوع Word تعریف کنیم و از دستور:
متغیری رو که تعریف کردیم برابر این دستور قرار میدیم و بجای Channel شماره پایه ADC که رو اون ولتاژ قرار داره رو قرار میدیم.
مثال:
در مثال بالا مقدار ADC0 تو متغیر a ریخته میشه و رو lcd نمایش داده میشه.
3.دستور Fusing.
این دستور برای ساده کردن متغیر ها استفاده میشه.
فرم کلی این دستور:
مثال:
متغیری که برابر این دستور قرار میگره حتما باید از توع String باشه.
در این مثال متغیر b با یک رغم اعشار ساده شده ولی روند نشده.
این علامت & برای ساده کردن هستش ولی عدد رو رند نمیکنه.
این علامت # برای ساده کردن هستش ولی عدد رو هم رند میکنه.
توضیحات برنامه سی:
در این کامپایلر دستوراتی همانند دستورات بیسکام وجود نداره و باید ریجستر هارو دستی مقدار دهی کنیم که اگه من بخوام ریجیستر ها و مقدار دهی اونارو توضیح بدم خیلی خیلی حجم مطالب زیاد میشه لذا از توضیح دادن این مطالب خوداری میکنم و به شما عزیزان توصیه میکنم که حتما یک کتاب مانند مرجع کامل میکرو کنترل های AVR تهیه کنید.اگر بازم کسی سوالی در این مورد داشت حتما با من در میون بزاره.
ساخت کد ها با استفاده از کدویزاد در کدویژن:
1.بر روی گزینه ی CodeWizard کلیک کنید.با کلیک بر روی این گزینه صفحه ی زیر باز میشه و بعد از انتخاب گزینه ی اول برروی ok کلیک کنید.
بعد از انجام کار های بالا صفحه ی زیر باز میشه.
در این صفحه گزینه ی ADC رو انتخاب کنید.
بعد گزینه ی Enable ADC رو انتخاب کنید.
در قسمت 5 پایه ای که ولتاژ روی اون با ADC مقایسه میشه رو انتخاب کنید و در قسمت 6 هم اون فرکانسی که دوس دارین رو انتخاب کنید.
اگه گزینه ی Use 8 bit رو انتخاب کنید مقایسه کننده از 10 بیتی به 8 بیتی تغییر میکنه.
اگه گزینه ی Interrupt رو انتخاب کنید بعد از پایان مقایسه یک وقفه رخ میده.
بعد از اینکه تنظیمات مورد نظرتونو انجام دادین رو گزینه 7 که Preview هستش رو انتخاب کنید.
بعد از انتخاب این گزینه کد های شما در صفحه ی Program Preview نمایش داده میشه.اون کد هارو مارک آل کنید و درون برنامه اصلی قرار بدین.
برای خواندن مقدار ADC ابتدا یک متغیر 16 بیتی تعریف میکنیم و از دستور:
که در اینجا var نام متغیری هستش که تعریف کردیم و x هم شماره پایه ای هستش که ولتاژ رو اون قرار داره.
مثال:
در مثال بالا مقدار ADC0 درون متغیر a قرار میگیره.
نـــکــــتـــه:بچه ها این کد هایی که در زیر گذاشتم مربوط به پیکر بدی ADC هستش.همون دستوراتی که با کدویزارد به دست آوردیم.
تــــــــــوجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
امید وارم که توضیحات من و این پروژه بهتون کمکی کرده باشه.
موفق باشید.....
اینم یک پروژه باحال.
این پروژه اندازه گیری ولتاژ 0 تا 220ولت Dc با میکروکنترل avr مدل atmega8 هستش.
مشخصات پروژه:
میکرو کنترل به کار رفته:atmega8
کریستال:8.000.000
زبان برنامه:بیسیک و سی
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
توجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:از این به بعد هر برنامه ای رو که قرار میدیم دیگه توضحات اضافی و توضیحاتی رو که قبلا دادم رو نمیدم.(بدلیل اینکه وقت ندارم).
هر کی هر سوالی داشت میتونه همینجا مطرح کنه یا ایمیل بزنه یا زنگ بزنه یا .......
برنامه به زبان بیسیک:
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4 , E = Portd.3 , Rs = Portd.2 : Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto
Dim A As Word
Dim B As Single
Dim V As String * 5
Cursor Off
Locate 1 , 1 : Lcd "Www.IranLed.Com" : Locate 2 , 1 : Lcd "h.unique" : Wait 1 : Cls
Start Adc
Do
A = Getadc(6)
B = A * 0.2150537634408602
V = Fusing(b , "#.&")
Locate 1 , 1 : Lcd "Vlotag:" ; V ; "v" ; " "
Locate 2 , 1 : Lcd "Dc VoltMetr"
Loop
End
برنامه به زبان سی:
کد:
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
unsigned int a;
float b;
char v[20];
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (0x40 & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(){
ADMUX=0x40 & 0xff;
ADCSRA=0x83;
lcd_init(16);
lcd_gotoxy(0,0);lcd_putsf("Www.IranLed.Com");lcd_gotoxy(0,1);lcd_putsf("h.unique");delay_ms(1000);lcd_clear();
do{
a=read_adc(6);
b=a*0.2150537634408602;
sprintf(v,"Vlotag:%0.1f v ",b);
lcd_gotoxy(0,0);lcd_puts(v);
lcd_gotoxy(0,1);lcd_putsf("Dc VoltMetr");
}while(1);
}
شبیه ساز:
توضیحات کلی:
مبدل آنالوگ به دیجیتال.
یکی از قابلیت های میکروکنترل Avr اینه که یک مبدل آنالوگ به دیجیتال 10 بیتی دارن که اگه ولتاژ آنالوگ بین 0 تا 5 ولت رو رو پایه های ADCx قرار بدیم اونو اندازه گیری میکنه و اگه 0 بود ریجستر خودشو 0 میکنه و اگه 5ولت بود رجیسترش برابر 1023میشه.
تو این پروژه هم با استفاده از پل مقاومت 220 ولت رو به 5ولت تبدیل کردیم که میکرو بتونه اونو اندازه گیری کنه.
اون پتانسیومتری رو هم که قرار دادم واسه ایته که ولتاژ رو ورودی رو تغییر بدیم.
اگه ما ولتاژ اصلی رو بر 1023 تفسیم کنیم و بعد جواب رو ضرب در مقدار ADC کنیم ولتاژ رو میتونیم رو Lcd نشون بدیم!
تـوجـه:حتما هردو پایه های Avcc و Aref رو به +5ولت متصل کنید.
توضیحات برنامه بیسیک:
1.پیکر بندی ADC در بیسیک:
کد:
CONFIG ADC = single, PRESCALER = AUTO, REFERENCE = opt
1.Avcc
2.Aref
3.Internal
اگه ما گزینه ی Avcc رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Avcc مقایسه میشه.
اگه ما گزینه ی Aref رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Aref مقایسه میشه.
اگه ما گزینه ی Internal رو انتخاب کنیم ولتاژ پایه adc با ولتاژ داخلی میکرو که 2.56 ولت هستش مقایسه میشه.
2.دستورات مربوط به ADC:
2-1:برای شروع مقایسه باید از دستور:
کد:
Start Adc
کد:
Stop Adc
2-2:برای دریافت مقدار ADC باید یک متغیر از نوع Word تعریف کنیم و از دستور:
کد:
var = GETADC(channel [,offset])
مثال:
کد:
Config Adc = Single , Prescaler = Auto
Dim A As Word
A = Getadc(0)
Lcd A
3.دستور Fusing.
این دستور برای ساده کردن متغیر ها استفاده میشه.
فرم کلی این دستور:
کد:
target = FUSING(source, "mask")
کد:
V = Fusing(b , "#.&")
در این مثال متغیر b با یک رغم اعشار ساده شده ولی روند نشده.
این علامت & برای ساده کردن هستش ولی عدد رو رند نمیکنه.
این علامت # برای ساده کردن هستش ولی عدد رو هم رند میکنه.
توضیحات برنامه سی:
در این کامپایلر دستوراتی همانند دستورات بیسکام وجود نداره و باید ریجستر هارو دستی مقدار دهی کنیم که اگه من بخوام ریجیستر ها و مقدار دهی اونارو توضیح بدم خیلی خیلی حجم مطالب زیاد میشه لذا از توضیح دادن این مطالب خوداری میکنم و به شما عزیزان توصیه میکنم که حتما یک کتاب مانند مرجع کامل میکرو کنترل های AVR تهیه کنید.اگر بازم کسی سوالی در این مورد داشت حتما با من در میون بزاره.
ساخت کد ها با استفاده از کدویزاد در کدویژن:
1.بر روی گزینه ی CodeWizard کلیک کنید.با کلیک بر روی این گزینه صفحه ی زیر باز میشه و بعد از انتخاب گزینه ی اول برروی ok کلیک کنید.
بعد از انجام کار های بالا صفحه ی زیر باز میشه.
در این صفحه گزینه ی ADC رو انتخاب کنید.
بعد گزینه ی Enable ADC رو انتخاب کنید.
در قسمت 5 پایه ای که ولتاژ روی اون با ADC مقایسه میشه رو انتخاب کنید و در قسمت 6 هم اون فرکانسی که دوس دارین رو انتخاب کنید.
اگه گزینه ی Use 8 bit رو انتخاب کنید مقایسه کننده از 10 بیتی به 8 بیتی تغییر میکنه.
اگه گزینه ی Interrupt رو انتخاب کنید بعد از پایان مقایسه یک وقفه رخ میده.
بعد از اینکه تنظیمات مورد نظرتونو انجام دادین رو گزینه 7 که Preview هستش رو انتخاب کنید.
بعد از انتخاب این گزینه کد های شما در صفحه ی Program Preview نمایش داده میشه.اون کد هارو مارک آل کنید و درون برنامه اصلی قرار بدین.
برای خواندن مقدار ADC ابتدا یک متغیر 16 بیتی تعریف میکنیم و از دستور:
کد:
var=read_adc(x);
مثال:
کد:
a=read_adc(0);
نـــکــــتـــه:بچه ها این کد هایی که در زیر گذاشتم مربوط به پیکر بدی ADC هستش.همون دستوراتی که با کدویزارد به دست آوردیم.
کد:
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (0x40 & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
تــــــــــوجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
امید وارم که توضیحات من و این پروژه بهتون کمکی کرده باشه.
موفق باشید.....