در میکروکنترلر ها توسط
برای ساخت سلف سنج و خازن سنج با میکروکنترلر avr از چه مداری استفاده کنیم؟
توسط jahandideh
یک نمونه پروژه دیگر از وبسایت سرزمین الکترونیک
https://wle.ir/wp-content/uploads/2012/11/self_sanj.rar

3 پاسخ

0 امتیاز
توسط jahandideh
 
بهترین پاسخ

با سلام، چندی پیش داش مهدی خودمون یه LC متر ساخت و من هم کنجکاو شدم که یکی بسازم! چرا که هم نکات آموزشی داره و هم اینکه تا حدودی کاربردیه!

قبل از هر چیز یه گشتی توی اینترنت زدم و دیدم که سایت ها و افراد بسیار زیادی در اینترنت هستند که در تمام سطوح ( از مبتدی تا حرفه ای ) به این موضوع پرداختن ( البته هیچکدوم فارسی نبودن! )، مثلا این سایت http://pe0fko.nl/LCMeter

اولش به خودم گفتم که ایجاد چنین تاپیکی در سایت، خیلی لطفی نداره، ولی بعدش نظرم عوض شد! پس تصمیم گرفتم که تجربیات خودم رو در این مورد با شما به اشتراک بزارم. هر چند که ممکنه برای خیلی ها جالب به نظر نیاد، ولی حتی اگر یک نفر هم از اونها بهره ای ببره، باز هم خوبه ....


و اما کشف اولیه اینکه یک خازن سنج و یا سلف سنج رو در ساده ترین شکلش با یک اسیلاتور میسازن! یعنی اینکه اون سلف و یا خازن مجهول رو در یک اسیلاتور قرار میدن و با اندازه گیری فرکانس اون اسیلاتور ، مقدار سلف و یا خازن رو محاسبه میکنند.

پس اولین اقدام طراحی یک اسیلاتور دو منظوره است که در اون از سلف و خازن بعنوان عناصر اصلی اسیلاتور استفاده شده باشه! و در مرحله بعد هم از اونجایی که اساس کار سلف و خازن سنج مورد نظر ما اندازه گیری فرکانس اسیلاتوره، در اصل ما باید یک فرکانس متر بسازیم.

پس پروژه نهایی ما یک فرکانس متر به اضافه یک خازن سنج و سلف سنج خواهد بود! :nerd:

در ادامه سخت افزاری که برای این منظور مناسب بود رو روی یک برد سوراخ دار مونتاژ کردم که نتیجه شد این :
 


توجه داشته باشید که هدف از این تاپیک، گفتگو در مورد مدار میکرو و نمایشگر و اینها نیست! ( چون در این خصوص به وفور در این سایت صحبت کردیم! البته نگران نباشید، در مورد برنامه میکرو و عملکرد اون در این مبحث، مفصلا صحبت خواهیم کرد چون اصل ماجرا همونه :biggrin: ) پس همونطور که مشاهده میکنید، سخت افزار مورد نظر ما، یک ماژول هستش که با یک پین هدر 2 در 5 به هر برد میکرویی که نمایشگر مورد نظر هم به اون متصله، مرتبط میشه.

همونطور که در پست قبلی هم اشاره شده، پروژه ما سه بخش مجزا خواهد داشت، فرکانس متر، خازن سنج و سلف سنج که در ادامه به اونها خواهیم پرداخت.

با توضیحات سخت افزاری، ادامه میدیم :

 

عکس با کیفیت بالا شماتیک


فرکانس متر :
نوسانات مورد نظر در دامنه 0 تا 5 ولت به ورودی T-Frq که در اصل ترمینال ورودی فرکانس متر میشه و T-GND اعمال شده و به پارت A مقایسه کننده LM393 که در آرایشی مشابه اشمیت تریگر بسته شده وارد میشه. این قسمت که در تصویر پست اول به رنگ سبز های لایت شده، با مربعی کردن شکل موج ورودی، اون رو برای اعمال به میکرو آماده میکنه ( اگر دامنه ورودی شما بیشتر از این حد باشه، باید ورودی رو با استفاده از مدارات ورودی مناسب به رنج قابل قبول تبدیل کنید ) در این ماژول، رله RL1 وظیفه انتخاب حالت ورودی فرکانس و یا خازن سنج - سلف سنج رو بر عهده داره.

در نهایت، نوسانات مورد نظر به ورودی T1 میکروی مورد نظر ( محدودیت مدار ) اعمال شده و فرکانس مورد نظر توسط میکرو اندازه گیری میشه.

سلف سنج و خازن سنج :
اسیلاتور مورد استفاده برای این بخش در تصویر پست اول به رنگ صورتی های لایت شده که از پارت B مقایسه کننده LM393 و قطعات مرتبط تشکیل شده و خروجی اون هم از طریق رله RL1 برای اندازه گیری نوسانات ایجاد شده به ورودی T1 میکرو اعمال خواهد شد.

فرکانس پایه اسیلاتور این بخش یا F0 توسط C0 و L0 تولید شده و با فرمول زیر قابل محاسبه است :


و مدار معادلش هم اینه :


خازن و یا سلف مجهول ( Lx یا Cx ) برای اندازه گیری به ورودی های T-L/C و T-GND متصل خواهد شد. در این زمان، رله RL2 هم انتخاب کننده حالت اندازه گیری سلف و یا خازن است.

مدار در حالت خازن سنج :

مدار در حالت سلف سنج :

 

0 امتیاز
توسط jahandideh
بعد از آشنایی با سخت افزار، دیگه نوبت میرسه به نرم افزار :
 

http://s4.picofile.com/file/7984697632/SHN_LCF_meter_44.zip.html

نکته ها :
من از یک برد با میکروی مگا 32 و LCD گرافیکی نوکیای 1100 و LCD کاراکتری 2 در 16 برای تست استفاده کردم.
پلتفرم برنامه نویسی با WinAVR و سازگار با کدویژن هستش و در AVRstudio هم قابل استفاده است.

پس از اکسترکت فایل پیوست، پنج پوشه ( پروژههای مجزا به جهت اینکه سردرگم نشید! ) خواهید داشت، یکی پوشه Proteus که فایل های تست در اون قرار داره و دو پوشه برای LCD گرافیکی و دو پوشه برای LCD کاراکتری ( هر کدوم دو پوشه با استفاده از Sprintf و بدون Sprintf )

توجه داشته باشید که استفاده از Sprintf و نمایش Float حجم کدها رو 4 الی 6 کیلو بزرگتر خواهد کرد. ضمن اینکه قبلش باید در کامپایلر مورد نظر تنظیمات Sprintf رو برای Float تنظیم کرده باشید.

جهت هرچه کمتر کردن حجم کد نهایی، بهتره که مواردی که نیاز ندارید رو با استفاده از فلگ های مربوطه غیر فعال کنید و همچنین میتونید که افکت های نوشتاری رو حذف کرده و مد نمایشگرتون رو روی مد عادی قرار بدید. در کمترین حالت، حجم کد نهایی حدود 6 کیلو و در بیشترین حالت حدود 15 کیلو خواهد بود ....

همراه این پروژه کتابخونه های زیر ارائه شده اند :
BTN برای مدیریت کلیدها با آرایش سخت افزاری معمولی تا 8 کلید.
N11 کتابخونه LCD گرافیکی نوکیای 1100
sFont کتابخونه فونت ساده برای LCD های گرافیکی
TLCD کتابخونه LCD های کاراکتری از یک خط تا 4 خط با کنترلر های HD44780 و KS0073

LCF کتابخونه جدید جهت امور فرکانس متر، خازن سنج و سلف سنج ( که میخوایم بهش بپردازیم! )

این کتابخونه ها آخرین نسخ تا امروز هستند!

----------------------

و اما ادامه بحث ما پیرامون کتابخونه LCF و توضیحات کاملی در مورد اون خواهد بود ( سایر کتابخونه ها موضوع بحث ما نیستند و در جاهای مختلف در مورد اونها و نحوه استفاده از اونها گفتگو شده )

همونطور که قبلا هم اشاره شد، این ماژول جدید ما از کتابخونه LCF استفاده میکنه و استفاده از سایر کتابخونه ها اجباری نیست و شما میتونید برای سایر موارد از هر کتابخونه ای که خواستید استفاده کنید. در ادامه توضیحات مختصری در این باره لازمه که ارائه خواهد شد.

کتابخونه LCF از سه بخش مجزا تشکیل شده، یکی فرکانس متر که پایه اصلی این کتابخونه محسوب میشه و بخش های سلف سنج و خازن سنج ....

کلیه تنظیمات مورد نظر کاربر برای این کتابخونه طبق معمول در هدر فایل کانفیگ مربوطه یا LCFconfig.h قرار داره! و تنظیمات اساسی کتابخونه که معمولا نیازی به تغییر ندارند هم در هدر فایل LCF.h هستند .....

با هدر فایل LCFconfig شروع میکنم.

در ابتدا سه تا فلگ داریم که مدهای فرکانس متر، خازن سنج و سلف سنج رو فعال و یا غیرفعال میکنند. توجه داشته باشید که در هر حالتی، بخش اعظمی از قسمت های فرکانس متر فعال باقی خواهد موند ( چون اصل ماجرا اندازه گیری فرکانسه! )

شما میتونید برای تست و بررسی عملکرد برنامه، یک پین میکرو رو بعنوان Activity Test تعریف کنید که با هر بار اندازه گیری فرکانس توسط میکرو تغییر وضعیت خواهد داشت. پس در صورت یک کردن فلگ ActivityTest لازمه که پین مربوطه نیز در همین هدر فایل تعریف بشه.

همچنین در صورت فعال بودن فلگ فرکانس متر و یکی از حالات سلف سنج و یا خازن سنج، لازمه که یک پین جهت رله انتخاب این وضعیت با وضعیت [های] دیگر هم تعریف بشه! و در صورت داشتن هر دو حالت سلف سنج و خازن سنج، تعریف یک پین برای رله مربوطه به جهت انتخاب بین این دو حالت هم الزامی است!

چونکه در مدهای خازن سنج و سلف سنج بحث کالیبراسیون هم مطرحه، در صورت فعال بودن فلگ یکی از این حالات، باید نوع نمایشگر مورد استفاده ( گرافیکی یا متنی ) و تعاریف مربوطه هم مشخص بشه، ضمن اینکه انجام تعاریف مد کالیبراسیون و نحوه نمایش و اینها هم الزامی میشه.

سه متغیر عمومی ( که در هر جایی در دسترس هستند ) برای برگردوندن مقادیر فرکانس، سلف و خازن در نظر گرفته شده اند که با توجه به تعاریف فلگ ها در دسترس هستند.

سایر موارد رو هم در جای خودش مفصلا توضیح خواهم داد .....

و اما در ادامه بررسی های کتابخونه LFC میخوایم وارد جزئیات سه بخش اصلی بشیم، پس موضوع رو با فرکانس متر دنبال میکنیم :

فرکانس متر :

روش کلی برای اندازه گیری فرکانس اینه که نوسانات مورد نظر رو برای مدت یک ثانیه ( یا کسری از یک ثانیه ) به کلاک یک شمارنده اعمال کنیم. در عمل، برای این منظور ورودی Hold کانتر رو در مدت زمان مورد نظر غیر فعال میکنند تا کانتر در اون مدت مشخص تعداد پالس ها رو شمارش بکنه. به این عمل اصطلاحا Gate کردن شمارنده گفته میشه. یعنی برای مدت مشخصی دروازه شمارش شمارنده باز و در این مدت زمان پالس ها شمارش شده و نمایش داده میشن!

در کتابخونه ما هم از همین روش برای اندازه گیری فرکانس استفاده میشه، به همین منظور، در هدر فایل LCFconfig تایمر یک میکرو رو بعنوان شمارنده اصلی، در مد نرمال و clock source خارجی تنظیم میکنیم. در این حالت پایه T1 میکرو میشه پین کلاک شمارنده اصلی ( تنها محدودیت سخت افزاری! ) که نوسانات مورد نظر رو به اون اعمال خواهیم کرد.
و سپس تایمر 2 میکرو رو بعنوان Gate شمارنده اصلی، طوری در مد CTC پیکره بندی میکنیم که وقفه compare match اون هر یک میلی ثانیه اتفاق بیافته.

پس از LCFmeter_Init ( یا پیکره بندی اولیه LCF )، ضمن پیکره بندی سخت افزار مورد نیاز این کتابخونه، این دو تایمر در حالت توقف به شکل اشاره شده پیکره بندی میشن .....

اندازه گیری فرکانس با دستور LCFmeter_Start که مقدار زمان Gate هم به میلی ثانیه به اون داده میشه آغاز خواهد شد. در این حال، متغیرها مقدار دهی اولیه شده و تایمر یک، با زمان گیری تایمر 2 به مدت مورد نظر Gate ( یا همون وقوع وقفه compare match ) شروع به شمارش تعداد پالس ها میکنه و پس از سپری شدن زمان Gate مقدار فرکانس پالس ورودی محاسبه و در متغیر عمومی فرکانس متر یا همون frqVal قرار میگیره.

فلگی به نام LCFstatus در همه احوال وضعیت این ماژول نرم افزاری رو به ما برمیگردونه!

وقتی که LCF آماده برای دستور LCFmeter_Start باشه، این فلگ LCFidel و در زمان انتظار برای وقوع وقفه Gate این فلگ LCFbusy و پس از محاسبه مقدار فرکانس و معتبر بودن مقدار متغیر frqVal این فلگ LCFready خواهد بود.
توجه داشته باشید که پس از خواندن مقدار متغیر frqVal توسط شما، باید فلگ LCFstatus توسط شما در وضعیت LCFidel قرار گیرد.

( جهت اطلاعات بیشتر به فایل main.c مراجعه کنید! )
توضیحات مفید! :
بر روی ماژول ما یک LED قرمز وجود داره که بعنوان جنرال ایندیکیتور مورد استفاده قرار میگیره و یک کلید هم بعنوان ورودی کاربر پیش بینی شده.

همونطور که در نقشه شماتیک در زیر کلید مزبور نوشته شده، با هر بار فشار دادن این کلید، تغییر وضعیت بین مد های سلف سنج و خازن سنج رخ خواهد داد و در صورتی که این کلید برای زمانی حدود 3 ثانیه فشرده نگه داشته بشه، به مد فرکانس متر خواهیم رفت و به همین ترتیب از این مد خارج خواهیم شد.

در هدر فایل HW_LCF.h تایمر صفر طوری در مد CTC تنظیم شده که وقفه compare match اون هر 10 میلی ثانیه اتفاق خواهد افتاد. با هر بار وقوع وقفه این تایمر یک متغیر عمومی به اسم SysCount یک واحد افزایش خواهد یافت. همچنین در صورتی که کلید موجود بر روی برد فشرده شده باشد، کانتر اندازه گیری مدت زمان فشرده شدن کلید نیز یک واحد افزایش می یابد. در اصل، این تایمر بعنوان شمارنده تیک سیستم مورد استفاده قرار گرفته!

در هدر فایل HW_LCF فلگی به اسم LCFdebug وجود داره که در صورتی که این فلگ یک باشه، در مد های سلف سنج و خازن سنج، مقدار فرکانس اسیلاتور مربوطه نیز در ذیل مقدار سلف و یا خازن نمایش داده خواهد شد. این حالت بیشتر جهت بررسی صحت عملکرد مدار پیش بینی شده و کاربرد خاصی نداره!
0 امتیاز
توسط jahandideh


کالیبراسیون :
همونطور که همه ما میدونیم، هر دستگاه اندازه گیری ای نیاز به کالیبره کردن داره و با توجه به تغییر مشخصه های قطعات دستگاه تحت عوامل محیطی در مدت زمان استفاده، باید کالیبراسیون در بازه های زمانی مشخصی تکرار بشه و ماژول ما هم از این قضیه مستثنی نیست!

کالیبراسیون فرکانس متر :
حالا که فرکانس متر ما راه افتاده، باید اون رو کالیبره کنیم، برای این منظور، باید یک فانکشن ژنراتور یا در ساده ترین حالت، یک سخت افزار یا نرم افزار تولید کننده پالس مثل Fg_Lite یا Visual Analyser داشته باشیم.
 

http://www.sillanumsoft.org/prod01.htm Visual Analyser 2011
http://www.marchandelec.com/fg.htm FG light


( توضیح اینکه، در حال حاضر کالیبراسیون مد فرکانس متر بصورت دستی انجام میشه، ایشالله در ورژن های بعدی کالیبراسیون نیمه خودکار این قسمت رو هم اضافه میکنیم! :mrgreen: ! )

پس در مد فرکانس متر ( و یا اینکه یک روتین کوچولو برای اینکار مینویسیم! ) قرار میگیریم و با FG_Lite به ورودی فرکانس یک پالس سینوسی حدودا 6 کیلوهرتزی با حداکثر دامنه اعمال میکنیم و مقدار رو روی نمایشگر مشاهده میکنیم و سپس در هدر فایل LCFconfig مقدار ثابت FRQcompensate رو جوری قرار میدیم که فرکانس خونده شده با مقدار تولید شده یکی بشه. حداقل مقدار این ثابت 1 و حداکثر بهتره 1000 باشه. در صورتی که در این بازه هم فرکانس متر شما کالیبره نشد، باید مقدار رجیستر OCR2 رو یک واحد کاهش و یا افزایش بدید .....

بعد از کالیبره شدن قسمت فرکانس متر میتونیم به قسمت های سلف سنج و خازن سنج بپردازیم!

کالیبراسیون سلف سنج و خازن سنج :
کالیبراسیون این قسمت ها یک بخش واحده که بطور نیمه خودکار ( با مشارکت کاربر و ماژول! ) و در دو مد مختلف انجام میشه. انتخاب مد مورد نظر برای کالیبراسیون در هدر فایل LCFconfig و با ست کردن فلگ CalibMode صورت میگیره که متعاقبا توضیح داده خواهد شد.

طی انجام مراحل کالیبراسیون، پیام هایی بر روی صفحه نمایشگر ظاهر خواهد شد. نوشتار این پیام ها بستگی به مد کالیبراسیون انتخاب داره، همچنین شکل نمایش اونها هم متفاوته و بستگی به نوع نمایشگر مورد استفاده ( گرافیکی یا متنی ) داره. به همین دلیل در هدر فابل LCFconfig باید نوع نمایشگر توسط فلگ LCDtext مشخص و در قسمت های مربوطه هم تنظیمات مربوطه در ذیل شرط های آنها بدرستی انجام بشه.

همینطور شما میتونید با تنظیم فلگ WithSprintf استفاده از توابع Sprihtf رو در نمایش مقادیر کالیبراسیون فعال و یا غیر فعال کنید ( توجه داشته باشید که فعال بودن حالت Sprintf موجب افزایش کد نهایی تا 5 کیلو خواهد شد! ) و فلگ ShowCalVals هم اساسا مشخص کننده این هست که آیا مقادیر کالیبراسیون نمایش داده بشه یا نه ....

( با توجه به حالات مختلفی که برای کالیبراسیون وجود داره و به جهت جلوگیری از پیچیده شدن کدها، روتین کالیبراسیون رو دو بار نوشتم! )

و اما ورود به بخش کالیبراسیون در دو صورت و توسط روتین LCFmeter_Calibration اتفاق خواهد افتاد.

پس از روشن شدن مدار و بوت شدن برنامه، یک پیام شروع به کار یا Splash با افکت ظاهر شده و پس از پاک شدن اون، اعتبار مقادیر اولیه کالیبراسیون سلف سنج و خازن سنج در ایپرام توسط روتین LCFmeter_NeedCalib کنترل میشه. در صورت عدم اعتبار مقادیر مزبور، صورت اول ورود به کالیبراسیون اتفاق خواهد افتاد. در غیر اینصورت، کنترل میشه که آیا کلید تعبیه شده بر روی برد فشرده و پائین نگه داشته شده است، در صورت مثبت بودن پاسخ، صورت دوم ورود به کالیبراسون رخ میده ( جهت گاهی بیشتر به main.c -> main مراجعه کنید! )، در این زمان، مدت زمانی بر حسب ثانیه به کاربر فرصت داده میشه تا با فشردن مجدد کلید، ورود به قسمت کالیبراسیون رو تائید کنه، در غیر اینصورت، ورود به کالیبراسیون انجام نخواهد شد. در زمان خروج از کالیبراسیون، مقادیر محاسبه شده کالیبراسیون سلف سنج و خازن سنج در ایپرام داخلی ذخیره و در صورت انتخاب کاربر، بر روی نمایشگر نمایش داده میشه.

همونطور که اشاره شد، کالیبراسیون این قسمت در دو مد مختلف میتونه انجام بشه ( با توجه به فلگ CalibMode )
( در توضیحات ذیل به شماتیک ها و فرمول های ارائه شده در پست دوم هم توجه کنید! )

در مد اول فرض بر این هست که مقدار واقعی C0 رو قبلا با یک خازن سنج اندازه گیری کردیم و در هدر فایل LCFconfig در ثابت Cref ثبت کردیم و مقدار واقعی L0 هم مجهوله. در این مد، پس از ورود به کالیبراسیون، مقدار Cref در C0 قرار گرفته و ماژول به مد خازن سنج میره تا فرکانس F0 رو بخونه، پس از خوندن F0 مقدار واقعی L0 از فرمول زیر محاسبه میشه
 


و در مد دوم فرض بر اینه که هر دو مقدار واقعی C0 و L0 مجهوله و کالیبراسیون باید با استفاده از یک خازن خارجی که مقدار واقعی اون رو قبلا توسط یک خازن سنج خوندیم و در هدر فایل LCFconfig در ثابت Cref ثبت کردیم انجام بشه ( این مد از کالیبراسیون در طولانی مدت و کالیبراسیون های بعدی معتبر تر خواهد بود! ) در این زمان، پس از ورود به کالیبراسیون ، پیامی مبنی بر جدا نمودن ورودیهای ماژول ظاهر میشه که باید با فشردن کلید توسط کاربر تائید بشه و بعدش F0 خونده میشه و سپس پیامی از کاربر میخواد که Cref رو به ورودی ماژول متصل کنه و کلید رو فشار بده و بعدش با خوندن مقدار Fref از طریق فرمولهای زیر اقدام به محاسبه مقدار C0 و L0 واقعی میکنه
 


برای اندازه گیری خازن یا سلف مجهول ( Cx یا Lx ) ابتدا مقدار فرکانس اسیلاتور ( یا همون Fx ) خونده شده و با مقادیر F0 و C0 و L0 ( که قبلا در روند کالیبراسیون محاسبه و ثبت شده اند )، مقدار خازن یا سلف مجهول، با استفاده از فرمول های زیر، محاسبه و در متغیر های عمومی مربوطه (capVal یا indVal ) ثبت شده و قابل استفاده خواهد بود.
 


فکر کنم به پایان رسید! ...........

و چند تا عکس ......... :mrgreen:
 

 

 

 

منبع : https://www.eca.ir/forums/thread45176.html

...