در این پست از سایت امیک, پروژه ساخت یک ولت متر DC با استفاده از ADC در میکرو AVR را یاد می گیرید. در این پروژه از میکرو کنترلر ATmega16 و lcd کاراکتری 2*16 و یک پتانسیومتر برای ایجاد ولتاژ متغیر استفاده شده است. همانطور که در شبیه سازی در انتهایی مطلب مشاهده می کنید این ولت متر ولتاژ 0 تا 25 ولت را اندازه گیری می کند که رنج اندازه گیری مناسبی می باشد البته می توان ولتاژهای بیشتر از 25 ولت را هم با این ولت متر اندازه گیری کرد ولی باید از مقاومت های با توان بالا استفاده کنید که بخاطر داغ شدن زیاد اسیب نبینند. در ادامه شماتیک این پروژه قرار داده شده است :
همانطور که گفته شد ولتاژی که قرار است اندازه گیری شود توسط پتانسیومتر ایجاد می شود که ما از منبع ولتاژ 25 ولت استفاده کرده ایم, بنابراین محدود تغییرات ولتاژ پتانسیومتر از 0 تا 25 ولت است. ما نمی توانیم ولتاژ بیشتر از 5 ولت را به میکروکنترلر avr بدیم, پس لازم است که این ولتاژ متغیر 0 تا 25 را به بازه 0 تا 5 تبدیل کنیم . ما این کار را توسط دو مقاومت R1 و R2 انجام میدهیم, این مقاومت ها یک تقسیم ولتاژ ساده ایجاد می کنند و ولتاژ را برای جلوگیری از اسیب دیدن میکرو در محدوده 0 تا 5 تبدیل می کنند. ما در برنامه نویسی این ولتاژ تقسیم شده را برای نمایش روی LCD دوباره به بازه 0 تا 25 تبدیل می کنیم .
توجه کنید که مقاومت های R1 و R2 باید تلرانس (ضریب خطا) کمی داشته باشند تا ولت متر شما دقیق باشد. برای اندازه گیری ولتاژهای بیشتر از 25 ولت حتما از مقاومت های با توان بالا استفاده کنید و این ولت متر حداکثر تا ولتاژ 50 ولت را می تواند اندازه گیری کند, بیشتر از 50 ولت باعث اسیب به قطعات این پروژه خواهد شد .
برای تنظیم کنتراست LCD می توانید پین 3 ان را به یک پتانسیومتر متصل کنید یا اینکه پین 3 را به منفی وصل کنید (من همیشه به منفی وصل می کنم و مشکلی نداره!)
از اونجایی که از ADC میکرو استفاده کرده ایم حتما پین های 30 و 32 رو به 5 ولت (VCC) متصل کنید
برنامه کدویژن :
اگر با راه اندازی ADC در میکروکنترلر AVR اشنا نیستید حتما این پست را مطالعه کنید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/************ www.emic.ir ************/ #include <mega16a.h> #include <delay.h> #include <alcd.h> #include <stdio.h> // sprintf براي استفاده از تابع stdio فراخواني کتابخانه // #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) /* ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 7 تا 16 دستورات مربوط به */ 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) { float i , volt , voltage ; unsigned char lcd[16]; 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 از خط 28 تا 30 رجيسترهاي مربوط به */ ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); while (1) { i=read_adc(0); // i خواندن عددي بين 0 تا 1023 که نشان دهنده مقدار ولتاژ انالوگ روي ان پين ميکرو است و ريختن ان در متغير // volt=(i*5)/1023 ; // دستور روبرو عدد خوانده شده بين 0 تا 1023 را در بازه ي 0 تا 5 تبديل مي کند // /* از انجايي که بازه ي اندازه گيري ولتاژ ما بيش از 0 تا 5 ولت است ما با استفاده از تقسيم مقاومتي ولتاژ را کاهش داده ايم تا بتوانيم براي اندازه گيري به ميکرو بدهيم */ voltage=(volt*10)+volt ; /*طبق توضيح بالا ما ولتاژي را که کاهش داده ايم با استفاده از دستور روبرو دوباره به حالت اول برميگردانيم*/ sprintf(lcd,"voltage=%2.2f",voltage); // LCD براي نمايش روي lcd تبديل مقادير ولتاژ به رشته اي از کاراکتر و ذخيره ان در متغير // lcd_gotoxy(0,0); lcd_puts(lcd); // ذخيره شده اند lcd نمايش مقادير ولتاژ که به صورت کاراکتر در متغير // lcd_gotoxy(13,0); lcd_putsf("V"); // بعد از ولتاژ LCD روي V نوشتن کاراکتر // delay_ms(500); } } |
توضیحات قسمت های مهم برنامه نوشته شده سوالی داشتید می تونید در قسمت نظرات مطرح کنید
کلیپ شبیه سازی در پروتئوس :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام
می شود دستور زیر را توضیح دهید که چه طوری به حاول اول بر می گردد؟
voltage=(volt*10)+volt
سلام, با توجه به مقدار مقاومت های تقسیم ولتاژ (R1 و R2) فرمول ساده بالا بدست می اید. همانطور که گفته شده ما توسط این دو مقاومت ولتاژ را کاهش می دهیم و دوباره در برنامه توسط فرمول بالا ولتاژ را به حالت اولیه خود برمی گردانیم.
سلام وقتتون بخیر
برنامه رو نوشتم پرتئوس را بستم ولی روی ال سی دی فقط نوشته ولتاژ=۲f نشون میده علتش چیه ممنون میشم راهنماییم کنید
سلام, در کدویژن از مسیر Project/Configure/C Compiler/Code Generation گزینه ی s}Printf Features} را روی float, width, precision قرار دهید.
سلام وقت بخیر
اگر ورودی این مدار را رو 2کاناله کنیم یعنیa1 اضافه کنیم
بجز تغییری که تو حلقه while ایجاد میشه
کد دیگه ای تغییر میکنه؟
یا ممکنه مقدار رجیسترا عوض بشه؟
ic atmega8535
ممنون میشم راهنمایی کنید.
باسلام
اگر پروژه بالارو دوکاناله طراحی کنیم
تو برنامه نویسی به غیر از تغییر حلقه whileآیا کد دیگه ای هم تغییر میکنه؟
ممنون میشم راهنمایی کنید.
سلام خسته نباشید خدا قوت.
ببخشید اگر اشتباه نکنم شما از برنامه کد ویژن استفاده کردید
امکانش هست همین ولتمتر با بسکام برام پیاده سازی کنید ( مربوط به تمرین دانشگاه )
البته هزینش رو هم می پردازیم
سلام, برنامه نویسی بیسیک کار نکردم و متاسفانه اطلاعات کافی ندارم که بتونم راهنمایتون کنم
سلام من با فایل هگزی که تو پوشه بود ic رو پروگرام کردم ولی هیچی نمیاد روی صفحه
برای تست ic ی برنامه دیگه ای زدم و مشکلی نداشت
سلام, بررسی کنید که پایه های 30 و 32 میکرو را به VCC متصل کرده باشید. همچنین پایه های تغذیه میکرو (پایه 10 و 11) را به تغذیه متصل کرده باشید. هنگام پروگرام کردن میکرو باید فرکانس ان را روی 8 مگ داخلی تنظیم کنید و حتما فیوز بیت JTAG را هنگام پروگرام کردن غیرفعال کنید.
سلام مهندس وقتتون بخیر
ممنونم بابت پروژه خوبتون
عذرخواهی میکنم
اگه بخوام مقدار ولتاژ رو بیارم روی 7seg
باید چیکار کنم!؟
ممنون میشم راهنمایی کنید.
سلام ببخشید من میخوام یک ولتمر دی سی برنامه نویسی کنم که از صفر تا ۲۵۰ ولت رو اندازه گیری کنه چه تغیراتی باید انجام بدم ممنون میشم اگه پاسخ بدید .
سلام, باید با تقسیم مقاومتی ولتاژ را به 0 تا 5 ولت تبدیل کنی که در اینده حتما این پروژه را هم در سایت قرار خواهم داد
سلام یه مشکلی هست تو برنامه ی من که میخوام منبع 0 تا 5 ولت تعریف کنم .به تقسیم به1023 گیر میده و جواب رو همش صفر می زنه
سلام . خیلی کامل و بی نقص . هم شماتیک گذاشتید . هم برنامه رو خط به خط توضیح دادید و…. خیلی عالی . خداقوت
سلام خسته نباشید
من میخوام زمان تخلیه خازن را با استفاده از کدویژن در میکرو avr بدست بیارم اگه بتونید کمکم کنید ممنون میشم باتشکر
سلام من تو پروتئوس نسخه ۸.۵چجورب برنامه بنویسم یعنی من طبق گفته تصویر بالا ۳خط اول از پایه ۳تا ۶رو نوشتم ولی خودبع خود دستورات بعدی نیامد
سلام, متوجه سوالتون نشدم. فکر میکنم شما نیاز به اموزش بیشتری در مورد برنامه نویسی میکروکنترلر دارید. توصیه میکنم پست های مربوط به اموزش برنامه نویسی AVR را مطالعه کنید.
سلام اگر بخواهیم از 0تا30 را بسنجد کدام مقاومت ها را باید تغییر بدیم ؟ و اینکه vcc هم باید 30 ولت شود؟
سلام, لازم نیست مقاومت ها را تغییر بدید فقط از مقاومت 1 وات به بالا استفاده کنید. نه دوست عزیز تغذیه میکرو و… 5 ولته, 30 ولت ندی همشون رو بسوزونی
سلام خسته نباشید من مدا رو روی برد بورد بستم ولی رو lcd ولتاژ رو صفر نشون میده و هیچ تغییری نمیکنه نمدونم دلیلش چیه میشه کمک کنید با تشکر
سلام, پایه های 30 و 32 را به مثبت تغذیه متصل کردید؟
سلام
خسته نباشید
برای ساخت ولتمتر 220 ولت نیازی به تغییر فرمول محاسبه داخل برنامه نیست ؟ اگر هست چه تغییری باید اعمال بشه
سپاس گزار میشم راهنمایی بفرمایید
سلام, این پروژه یک ولت متر DC هست که از 0 تا 25 ولت را اندازه می گیرد و ولتاژهای خیلی زیاد را با این پروژه نمیشه اندازه گیری کرد
ببخشید اگه ولتاژ ما بجای 25ولت 5ولت باشه,مقدار مقاومتا تغییری میکنه؟
خیر نیاز به تغییر نیست
ببخشید برای طراحی ولت متر ۰تا ۳۰ ولت چه تغییری دربرنامه بالا ایجاد میشه وچطوری رو lcdنمایش میده
از مقاومت با توان بالای 1 وات استفاده کنید. نیاز به تغییر در برنامه نیست
برای کد خط ۴۰ ارو ر ‘(‘ را میگیره این یعنی چی؟؟