
با ترمیستورها و نحوه راه اندازی آنها برای اندازه گیری دما آشنا شوید
آیا تا به حال به این موضوع فکر کرده اید که چگونه برخی از دستگاه ها مانند ترموستات ، هیت بد پرینتر سه بعدی ، موتور خودرو یا فرها دما را اندازه گیری می کنند؟ با این آموزش ، می توانید متوجه شوید!
دانستن درجه حرارت یک قطعه در یک پروژه می تواند بسیار مفید باشد. آگاهی از دما می تواند دمای اتاق را برای یک محیط کاملا راحت تنظیم کند ، اطمینان حاصل کند که هیت بد پرینتر سه بعدی به اندازه کافی داغ است تا موادی مانند ABS به سطح آن بچسبد ، از گرم شدن بیش از حد موتور جلوگیری کرده و از سوختن غذا در فر جلوگیری کند.
در این مقاله ، ما فقط به یک نوع سنسور که می تواند دما را اندازه گیری کند ، توجه داریم. این سنسور ترمیستور نامیده می شود.
ترمیستور مقاومتی را نشان می دهد که نسبت به سایر انواع مقاومت ها نسبت به دما بسیار حساس تر است.
در زیر تصویری از ترمیستور مورد استفاده از نوع ntc مهره ای در این مقاله نشان داده شده است:
تئوری
در کاربرد های عادی یک مقوامت معمولی ، شما نمی خواهید مقاومت با تغییر دما تغییر کند. این در عمل واقعاً امکان پذیر نیست اما می توان با تغییر زیاد دما فقط یک تغییر کوچک در مقاومت را تضمین کرد. اگر اینطور نبود ، مقاومت ها اتفاقات عجیبی را در مدارها ایجاد می کردند ، مانند LED که با تغییر دمای محیط بسیار روشن تر و کم نورتر می شود.
اما ، اگر واقعاً می خواهید روشنایی LED تابعی از دما باشد؟ این همان جایی است که ترمیستور وارد می شود. همانطور که احتمالاً حدس زده اید ، یک ترمیستور با تغییر جزئی دما ، تغییر زیادی در مقاومت دارد. برای نشان دادن این مفهوم ، نمودرا منحنی مشخصه معمولی ترمیستور را بررسی کنید:
منحنی مشخصه ترمیستور
در نمودار بالا تنها واحدهای اندازه گیری نشان داده می شوند و مقادیر در نمودار حذف شده اند زیرا یک ترمیستور بسته به نوع خرید شما می تواند در محدوده های مختلف تنظیم شود. همانطور که می بینید ، هرچه دما بالا می رود ، مقاومت کمتر است. این یک ویژگی مقاومت ضریب دما منفی (به اختصار NTC) است.
همچنین ترمیستورهایی وجود دارند که دارای ضریب دمای مثبت (به طور خلاصه PTC) هستند ، بدین معنا که با افزایش دما ، مقاومت افزایش می یابد. با این حال ، ترمیستورهای PTC دارای نوعی نقطه عطف هستند و مقاومت را در برخی از دماها بسیار تغییر می دهند. این امر باعث می شود تا راه اندازی ترمیستور PTC کمی سخت تر شود. به همین دلیل ، برای اکثر اندازه گیری دما که هزینه زیادی نمی طلبد ، ترمیستورهای NTC ترجیح داده می شوند.
از این به بعد در طول مقاله ، با دیدن عبارت ترمیستور در ذهن داشته باشید که به ترمیستور های ntc اشاره می شود.
چهار روش مناسب برای راه اندازی ترمیستور کدامند؟
اکنون که ما با رفتار کلی ترمیستورها آشنا شده ایم، ممکن است تعجب کنید که چگونه می توانیم از میکروکنترلر برای اندازه گیری دما استفاده کنیم در حالی که نمودار ترمیستور خطی نمی باشد. منحنی در نمودار بالا غیر خطی است و بنابراین ، یک معادله خطی ساده به نظر نمی رسد. (در حقیقت ، ما می توانیم یک معادله بنویسیم ، اما بعداً در این مورد بیشتر توضیح داده می شود.)
پس چه باید کرد؟
قبل از خواندن ، به این فکر کنید که چگونه می توانید این کار را در میکروکنترلر یا حتی در مدار بدون ریزپردازنده انجام دهید.
چند راه برای حل این مشکل وجود دارد که در زیر ذکر شده است. این به هیچ وجه لیستی از همه تکنیک های موجود نیست ، اما برخی از روش های رایج را به شما نشان می دهد.
روش یک:
برخی از تولیدکنندگان به اندازه کافی خوبند که یک نمودار کامل از اطلاعات آن را در اختیار شما قرار می دهند این اطلاعات دارای طیف وسیعی از دیتای دما و مقاومت است (مقادیر معمولی). اطلاعات مربوط به ترمیستورها را می توانید در وب سایت شرکت Vishay بیابید.
اما بعدا می نشینید و فکر می کنید که چگونه می توانید این کار را با میکروکنترلر انجام دهید. شما باید همه این مقادیر را به صورت دیتا در یک آرایه ذخیره کنید
اما اگر تولید کننده اطلاعات کامل از قطعه ساخته شده را ارائه ندهد ،برای ایجاد نمودار پیوسته ی هر نقطه از دما ، باید خودتان برای اندازه گیری و ثبت داده ها اقدام کنید. مطمئنا این برای یک برنامه نویس اصلا خوشایند نیست. اما این روش اگر مجبور باشید زیاد بد نیست و جای خود را دارد. اگر پروژه مورد نظر فقط چند نقطه یا حتی چند محدوده جزئی دما را بررسی می کند ، ممکن است این راه ترجیحی باشد. به عنوان مثال ، یکی از این شرایط این است که فقط می خواهید اندازه گیری کنید که مقادیر در محدوده دمایی انتخاب شده قرار دارند یا خیر و در نهایت یک LED را برای روشن کردن این وضعیت تنظیم می کنید.
اما برای پروژه خود ، ما می خواهیم یک محدوده تقریباً پیوسته را اندازه گیری کرده و آن را بر روی ال سی دی ۱۶x2 نمایش دهیم ، بنابراین از این روش استفاده نخواهد شد.
روش دوم:
شما می توانید نمودار پاسخ ترمیستور را با افزودن قطعات خارجی به آن “خطی” کنید.
یک روش رایج برای انجام این کار اتصال یک مقاومت به موازات ترمیستور است. برخی از IC ها هم هستند که اینکار را برای شما انجام می دهند.
تعیین چگونگی انتخاب و خطی سازی یک نمودار غیر خطی با انتخاب مقدار مناسب مقاومت خارجی ، به تنهایی یک مقاله است. اگر ریزپدازنده (مانند PICAXE) از متغیر اعشاری پشتیبانی نکند ، به نظر می رسد این روش بسیار عالی است ، زیرا تغییرات دما به صورت خطی پاسخ داده می شود و اندازه گیری آن توسط ریزپردازنده بسیار ساده می باشد همچنین طراحی مدار بدون ریزپردازنده برای اندازه گیری دما را آسان تر می کند.
اما ما در این مقاله یک ریزپردازنده کامل داریم و می خواهیم که رنج کاملی از دما را داشته باشیم بنابراین از این روش استفاده نمی کنیم.
روش سوم:
شما می توانید اطلاعات یا داده های نمودار قطعه را از دیتاشیت یا (اگر از وقت کافی برخوردار باشید) می توانید داده ها را برای نقاط اندازه گیری کرده و تهیه کنید سپس نمودار را در نرم افزار هایی مانند Excel با داده هایی که برای نقاط بدست آورده اید ایجاد کنید. و پس از آن ، می توانید از ویژگی curve fitting برای ایجاد یک فرمول برای منحنی مشخصه استفاده کنید. این ایده بدی نیست و در نهایت می تواند فورمول خروجی را ارائه دهد – اما این کار به زمان و پردازش اولیه اطالاعات نیاز دارد.
اگرچه این یک روش نسبتا خوبی است ، اما ما نمی خواهیم در تجزیه و تحلیل همه این اطلاعات ترمیستور دچار مشکل شویم. بعلاوه اینکه اطلاعت مربوط به، هر ترمیستور کمی متفاوت است (البته اگر برای شما قابل تحمل است می توانید اطلاعات مربوط به هر ترمیستور را جداگانه بدست آورید و آن را در نرم افزار پردازش کنید).
روش چهارم:
به نظر می رسد یک فرمول یا معادله مناسب برای منحنی مشخصه المانهایی مانند ترمیستورها وجود دارد. این معادله ، معادله اشتاین هارت نامیده می شود. یک نمونه از آن در زیر نشان داده شده است (نمونه های دیگر معادله از عبارت مربع و همچنین عبارت مکعبی استفاده می کنند):
که R مقاومت ترمیستور در دمای T (در کلوین) است.
این یک معادله متناسب با منحنی مشخصه کلی است تا همه مقاومتهای نوع NTC را در خود جای دهد. تقریب یا تخمین رابطه دما و مقاومت برای بیشتر کاربردها “به اندازه کافی خوب” است.
توجه داشته باشید که این معادله به ثابت های A ، B و C نیاز دارد. که این برای هر ترمیستور متفاوت است و باید توسط دیتاشیت داده شود یا توسط خودتان محاسبه شود. از آنجا که سه مجهول وجود دارد ، شما نیاز به سه اندازه گیری مقاومت در دمای مشخص دارید که می تواند برای ایجاد سه معادله برای حل این ثابت ها مورد استفاده قرار گیرد.
حتی برای ما که نابغه های جبری هستیم ، این معدله اشتاین هارت هنوز کلی کار دارد.
در عوض ، یک معادله ساده تر وجود دارد که دقت کمتری نسبت به معادله اشتاین هارت دارد و فقط یک ثابت دارد. ثابت با β نشان داده می شود و بنابراین معادله را معادله β می نامند.
که Ro مقومت قرائت شده در دمای مرجع مانند دمای اتاق است. β معمولاً در برگه اطلاعات یا دیتاشیت قطعه داده می شود – و در غیر این صورت ، به یک اندازه گیری برای محاسبه آن (معادله) نیاز دارید. این معادله ای است که من برای خواندن دمای ترمیستور خود از آن استفاده خواهم کرد زیرا کد نویسی آن بسیار ساده است و ساده ترین معادله ای است که بدون نیاز به خطی سازی ، ترمیستور پاسخ قابل قبولی را میدهد.
اندازه گیری مقاومت با میکروکنترلر:
اکنون که مشخص شد از روش چهارم استفاده می کنیم ، باید بدانیم که چگونه می توان مقاومت را توسط میکروکنترلر اندازه گیری کرد تا بتوانیم این اطلاعات را در معادله β وارد کنیم. ما می توانیم این کار را با استفاده از تقسیم ولتاژ انجام دهیم:
این مدار ترمیستور ما خواهد بود. هنگامی که ترمیستور تغییر دما را حس می کند ، ولتاژ خروجی Vout نیز تغییر خواهد یافت.
معمولاً از تقسیم ولتاژ با معادله زیر استفاده می کنیم:
اما ما Vout را به عنوان پاسخ نمی خواهیم – ما Rthermistor را می خواهیم. بنابراین از معادله بالا به معادله زیر می رسیم:
معادله بالا تقریبا درست است ، اما ما باید خروجی ولتاژ خود را توسط میکروکنترلر و همچنین ولتاژ منبع را اندازه گیری کنیم. اینجاست که ما از ADC داخلی میکروکنترلر استفاده می کنیم.ما می توانیم ولتاژ را به عنوان یک عدد دیجیتال در محدوده مشخص نشان دهیم. بنابراین در نهایت معادله بالا به معادله زیر تغییر داده می شود:
این معادله از نظر ریاضی درست است زیرا مهم نیست که چگونه ولتاژ را نشان می دهیم (به صورت آنالوگ یا دیجیتال) ، این مقادیر اندازه گیری شده ولتاژ در صورتی که مجهول نباشند باعث از بین رفتن کسر می شوند و در واقع عددی بدون کسر باقی می گذارد. سپس یک واحد از آن کاسته شده ، و نهایتا در مقاومت بالانس ضرب می شود تا پاسخی به واحد اهم را دریافت کنیم.
Dmax برای ما ۱۰۲۳ خواهد بود زیرا این بالاترین عددی است که توسط ADC ده بیتی ما ایجاد می شود. مقدار adc ده بیتی اندازه گیری شده می تواند بین ۰ تا ۱۰۲۳ متغیر باشد
یادآوری:
پیش به سوی ساخت!
توضیحات شماتیک:
من از ترمیستور TH10K استفاده کردم.
همچنین از یک مقاومت ۱۰k اهم برای Rbalance در تقسیم ولتاژ استفاده کردم. مقدار β در دیتاشیت ذکر نشده بود ، بنابراین من خودم باید آن را محاسبه کنم.(می توانید مقدار β را از اینجا بدست آورید)
در زیر یک شماتیک کامل از مدار نشان داده شده است.
:Basic Code (Bascom-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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
$regfile="m8def.dat" $crystal=8000000 const SAMPLE_NUMBER = 10 const BALANCE_RESISTOR = 10000 const MAX_ADC = 1023 const BETA = 3974 const ROOM_TEMP = 298.15 const RESISTOR_ROOM_TEMP = 10000 const thermistorPin = 0 '===============================www.mculibrary.ir=============================== ' Variables '===============================www.mculibrary.ir=============================== dim currentTemperature as single dim rThermistor as single dim tKelvin as single dim tCelsius as single dim adcAverage as single dim adcSamples(SAMPLE_NUMBER) as word dim i as byte '===============================www.mculibrary.ir=============================== Deflcdchar 0,6,9,9,6,32,32,32,32' replace [x] with number (0-7) Deflcdchar 1,32,32,10,32,17,14,32,32' replace [x] with number (0-7) Deflcdchar 2,32,32,10,32,32,31,32,32' replace [x] with number (0-7) Deflcdchar 3,32,32,10,32,14,17,32,32' replace [x] with number (0-7) '===============================www.mculibrary.ir=============================== ' Initialization '===============================www.mculibrary.ir=============================== Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0 config lcd=16*2 cursor off Config Adc = Single , Prescaler = Auto,reference=aref CONFIG SINGLE = SCIENTIFIC , DIGITS = 2 start adc '===============================www.mculibrary.ir=============================== ' declaration '===============================www.mculibrary.ir=============================== Declare Function readThermistor() as single '===============================www.mculibrary.ir=============================== cls home lcd " MCULIBRARY.IR " wait 2 cls do currentTemperature = readThermistor() home lcd "T:";currentTemperature;chr(0);"C " waitms 200 if currentTemperature > 20 and currentTemperature < 24 then locate 1,16 lcd chr(1); elseif currentTemperature >= 24 and currentTemperature<45 then locate 1,16 lcd chr(2); elseif currentTemperature<=20 and currentTemperature>5 then locate 1,16 lcd chr(2); elseif currentTemperature<=5 or currentTemperature>=45 then locate 1,16 lcd chr(3); endif loop '===============================www.mculibrary.ir=============================== ' Functions Read Thermistor '===============================www.mculibrary.ir=============================== ' (Ground) ----\/\/\/-------|-------\/\/\/---- V_supply ' R_balance | R_thermistor ' | ' V out '===============================www.mculibrary.ir=============================== Function readThermistor() as single rThermistor=0:tKelvin=0:tCelsius=0:adcAverage=0:i=0 for i=1 to SAMPLE_NUMBER step 1 adcSamples(i) = getadc(thermistorPin) waitms 10 next '============ for i=1 to SAMPLE_NUMBER step 1 adcAverage = adcAverage+adcSamples(i) next adcAverage=adcAverage / SAMPLE_NUMBER rThermistor=MAX_ADC / adcAverage rThermistor=rThermistor-1 rThermistor=rThermistor* BALANCE_RESISTOR rThermistor=rThermistor/ RESISTOR_ROOM_TEMP rThermistor=log(rThermistor) rThermistor=rThermistor*ROOM_TEMP rThermistor=rThermistor+BETA tKelvin = BETA * ROOM_TEMP tKelvin=tKelvin/rThermistor tCelsius = tKelvin - 273.15 ' convert kelvin to celsius readThermistor = tCelsius ' Return the temperature in Celsius end function |
توضیحات ضروری کد
تعریف ثابت ها برای آماده سازی و استفاده در فورمول:
خط ۳:
تعریف ثابت SAMPLE_NUMBER برای تعداد نمونه برداری از adc
خط ۴:
تعریف ثابت BALANCE_RESISTOR برای ذخیره کردن مقدار مقاومت بالانس که در این مثال ۱۰ کیلو انتخاب شده و حتما باید به واحد اهم وارد شود
خط ۵:
تعریف ثابت MAX_ADC که بیشترین مقدار adc را ذخیره می کند
خط ۶:
تعریف ثابت BETA که این ثابت یا در دیتاشیت معمولا داده می شود یا خودتان از این لینک آن را بدست می آورید.
خط ۷:
تعریف ثابت ROOM_TEMP که دمای ۲۵ درجه سانتی گراد به واحد کلوین در این ثابت برای استفاده در فورمول ذخیره می شود
خط ۸:
در این ثابت مقدار مقاومت ترمیستور را به واحد اهم وارد می کنید اگر ntc خریده شده ده کیلو باشد مقدار ۱۰۰۰۰ و اگر ntc پنج کیلو باشد مقدار ۵۰۰۰ را در این ثابت ذخیره می کنید
خط ۹:
این ثابت شماره کانال adc را در خود ذخیره می کند که در اینجا ما به پورت A.0 و کانال ADC0 وصل کرده ایم
تعریف متغیرها
خط ۱۳:
دمای نهایی خوانده شده از فورمول در این متغیر ذخیره می شود
خط ۱۴:
بعد از خواندن کانال adc باید مقدار adc تبدیل به مقدار مقاومت ترمیستور شود که بعد از تبدیل در این متغیر ذخیره میشود که نهایتا از این متغیر در فورمول استفاده خواهد شد
خط ۱۵:
خروجی فورمول به واحد کلوین می باشد پس مقدار نهایی فورمول به واحد کلوین در این متغیر ذخیره خواهد شد
خط ۱۶:
بعد از تبدیل واحد کلوین به سیلسیوس مقدار به واحد سلسیوس یا درجه سانتگراد در این متغیر ذخیره می شود
خط ۱۷:
میانگین نمونه برداری از کانال adc در این متغیر ذخیره می شود نمونه برداری چند باره و گرفتن میانگین میزان دقت کانال adc را افزایش می دهد و عدد میانگین از اعتبار بلالایی برخوردار است
خط ۱۸:
نمونه های گرفته شده از کانال adc در این آرایه ذخیره می شود
خط ۱۹:
متغیر معمولی و از نوع ۸ بیتی یا بایت برای ایجاد حلقه for و گرفتن نمونه برداری ها
خط ۲۸:
تعیین و کانفیگ پایه های ال سی دی
خط ۲۹:
تعیین تعداد سطر و ستون ال سی دی
خط ۳۰:
خاموش کردن مکان نمای ال سی دی
خط ۳۱:
تنظیم کانال adc و استفاده از پایه AREF به عنوان ولتاژ مرجع
خط ۳۲:
تنظیم حداکثر تعداد رقم اعشار
خط ۳۷:
تعریف نام تابع readThermistor با مقدار برگشتی از نوع اعشار و شناساندن تابع قبل از استفاده برای کامپایلر
خط ۴۵:
صدا زدن تابع و اجرای آن و ذخیره مقدار برگشتی از تابع در متغیر currentTemperature
توضیحات مربوط به تابع
خطوط ۷۳ تا ۷۶:
ایجاد حلقه for برای نمونه برداری از کانال adc
حلقه به تعداد ۱ تا SAMPLE_NUMBER بار اجرا می گردد
در داخل حلقه هر بار نمونه برداری انجام شده و در ارایه adcSamples ذخیره می شود
مقدار تاخیر فاصله نمونه برداری در این حلقه ده میلی ثانیه در نظر گرفته شده است
خطوط ۷۸ تا ۸۰:
میانگین نمونه برداری محاسبه شده و در متغیر adcAverage ذخیره می شود
خطوط ۸۱ تا ۹۰:
ثابت ها و متغیر های مورد نیاز را در فورمول جایگذاری می کنیم و فورمول را حل می کنیم
خط ۹۱:
تبدیل واحد کلوین به سلسیوس و ذخیره در متغیر tCelsius
خط ۹۲:
و در نهایت برگشت دادن مقدار متغیر tCelsius
سپس این مقدار در ال سی دی نمایش داده شده است
:C++ CODE(CodeVision-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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
//===============================www.mculibrary.ir=============================== #include <mega8.h> #include <delay.h> #include <alcd.h> #include <stdlib.h> #include <math.h> //===============================www.mculibrary.ir=============================== // Defines... //===============================www.mculibrary.ir=============================== #define SAMPLE_NUMBER 10 #define BALANCE_RESISTOR 10000 #define MAX_ADC 1023 #define BETA 3974 #define ROOM_TEMP 298.15 #define RESISTOR_ROOM_TEMP 10000 #define thermistorPin 0 //===============================www.mculibrary.ir=============================== unsigned char CustomChar_1[]={6,9,9,6,32,32,32,32}; unsigned char CustomChar_2[]={32,32,10,32,17,14,32,32}; unsigned char CustomChar_3[]={32,32,10,32,32,31,32,32}; unsigned char CustomChar_4[]={32,32,10,32,14,17,32,32}; //===============================www.mculibrary.ir=============================== //===============================www.mculibrary.ir=============================== // Function definition //===============================www.mculibrary.ir=============================== void CreateCustomCharacter(unsigned char *addr_CustomChar, unsigned char Location); float readThermistor(); //===============================www.mculibrary.ir=============================== //===============================www.mculibrary.ir=============================== // Initialization and function read_adc... //===============================www.mculibrary.ir=============================== // Voltage Reference: AREF pin #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) 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; } //===============================www.mculibrary.ir=============================== // main //===============================www.mculibrary.ir=============================== void main(void) { float currentTemperature=0; char str[10]; DDRB=0xFF; PORTB=0x00; DDRC=0x00; DDRD=0xFF; PORTD=0x00; // ADC initialization // ADC Clock frequency: 500.000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ACME); // Alphanumeric LCD initialization // RS - PORTB Bit 0 // RW - PORTB Bit 1 // EN - PORTB Bit 2 // D4 - PORTB Bit 4 // D5 - PORTB Bit 5 // D6 - PORTB Bit 6 // D7 - PORTB Bit 7 // Characters/line: 16 lcd_init(16); delay_ms(10); _lcd_write_data(0x0F); //lcd blink of //==============www.mculibrary.ir============== // create custom character //==============www.mculibrary.ir============== CreateCustomCharacter(CustomChar_1,0); CreateCustomCharacter(CustomChar_2,1); CreateCustomCharacter(CustomChar_3,2); CreateCustomCharacter(CustomChar_4,3); //==============www.mculibrary.ir============== lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(" MCULIBRARY.IR "); delay_ms(2000); lcd_clear(); while (1) { currentTemperature = readThermistor(); lcd_gotoxy(0,0); lcd_putsf("T:"); ftoa(currentTemperature,2,str); lcd_puts(str); lcd_putchar(0); lcd_putsf("C "); delay_ms(200); if(currentTemperature > 20 & currentTemperature < 24){ lcd_gotoxy(15,0); lcd_putchar(1); } else if(currentTemperature >= 24 & currentTemperature<45){ lcd_gotoxy(15,0); lcd_putchar(2); } else if(currentTemperature<=20 & currentTemperature>5){ lcd_gotoxy(15,0); lcd_putchar(2); } else if(currentTemperature<=5 | currentTemperature>=45){ lcd_gotoxy(15,0); lcd_putchar(3); } } } //===============================www.mculibrary.ir=============================== // CreateCustomCharacter //===============================www.mculibrary.ir=============================== void CreateCustomCharacter(unsigned char *addr_CustomChar, unsigned char Location){ unsigned char i=0; for (i=0; i<8;i++) lcd_write_byte(((Location*8)|0x40)+i,addr_CustomChar[i]); } /*===============================www.mculibrary.ir=============================== // readThermistor //===============================www.mculibrary.ir=============================== (Ground) ----\/\/\/-------|-------\/\/\/---- V_supply R_balance | R_thermistor | Analog Pin */ float readThermistor() { float rThermistor = 0; float tKelvin = 0; float tCelsius = 0; float adcAverage = 0; unsigned char i = 0; int adcSamples[SAMPLE_NUMBER]; for (i = 0; i < SAMPLE_NUMBER; i++){ adcSamples[i] = read_adc(thermistorPin); delay_ms(10); } for (i = 0; i < SAMPLE_NUMBER; i++){adcAverage += adcSamples[i];} adcAverage /= SAMPLE_NUMBER; rThermistor = BALANCE_RESISTOR * ( (MAX_ADC / adcAverage) - 1); tKelvin = (BETA * ROOM_TEMP) / (BETA + (ROOM_TEMP * log(rThermistor / RESISTOR_ROOM_TEMP))); tCelsius = tKelvin - 273.15; // convert kelvin to celsius return tCelsius; } |
نیازی به توضیح کد ها نیست کد دقیقا ترجمه شده کد بیسیک بوده و در صورت لزوم توضیحات مربوط به کد بیسیک را بخوانید
و در نهایت عملکرد پروژه در گیف زیر قابل مشاهده است
در گیف زیر هر چه بتا دقیقتر تنظیم شود و در عمل هم از ترمیستور های یک درصد استفاده شود دقت عالی خواهد بود(می توانید مقدار β را از اینجا بدست آورید)
دانلود سورس کد و پروتیوس Bascom-avr
- ورژن مورد نیاز پروتیوس برای اجرا: 8.10 به بالا
- ورژن بسکام 2.0.8.2 به بالا
- رمز فایل:www.mculibrary.ir
دانلود سورس کد و پروتیوس CodeVision-avr
- ورژن مورد نیاز پروتیوس برای اجرا: 8.10 به بالا
- ورژن کامپایلر کدویژن 3.12 به بالا
- رمز فایل:www.mculibrary.ir
سلام واقعا از کارتون لذت بردم. نه بخاطر انجام این پروژه. چون پروژه به نسبت ساده ایه، بلکه بخاطر توضیحات شفاف و دقیقی که در مورد بخش به بخش این پروژه و قطعه NTC دادید. به هر حال بسیار سپاسگذارم.
سلام و تشکر از لطفی که دارید
از اینکه مطلب برای شما مفید واقع شده خوشحالیم
موفق و موید باشید.
سلام هر کی هستی خدا خیرت بده واقعا دمت گرم یه دمت گرمی که ته نداشته باشه . کارت درسته کار مارو راه انداختی . درررررررووووووود
سلام و تشکر از لطفی که دارید
از اینکه مطلب برای شما مفید واقع شده خوشحالیم
موفق و موید باشید دوست عزیز.
نمیدونم با چه بیان وزبانی ازتون سپاسگزاری کنم.از راه دور کشور المان درود ما را پذیرا باشید.
سلام و درود از یران برای شما دوست عزیز
خوشحالیم که مطلب مفید واقع شده
موفق و موید باشید...