AVR نویز پذیر نیست! (روش هایی برای کاهش نویز میکروکنترلر AVR و کاربرد آن در صنعت)
متاسفانه یکی از شایعاتی که از موقع روی کار آمدن میکروهای AVR مطرح شد این بود که AVRها نویز پذیرند و به درد کار صنعتی نمی خورند.
علت اصلی این افکار غلط این بود که اولاً افراد انتظار داشتند یک میکرو کنترلر دقیقاً مثل یک 555 در هر شرایطی کار کند و اصلاً به حساس بودن و "کامپیوتر" بودن آن اهمیت نمی دادند و آن را در کنار هم منبع نویزی قرار می دادند، ثانیاً برای برنامه نویسی این میکرو از کامپایلرهای قفل شکسته و آپدیت نشده و پر از ایراد استفاده می کردند و ثالثاً افرادی که برای میکرو برنامه نویسی می کردند عموماً الکترونیکی بودند نه برنامه نویس و بدون دانش نرم افزاری و بدون اطلاع از پر شدن پشته میکرو کنترلر، با نوشتن یک کد غیر منطقی و پر از goto یا فراخوانی های متعدد برنامه ای می نوشتند که میکرو براحتی هنگ می کرد و تمام تقصیرها را به گردن AVR می انداختند (با بررسی سورس کد های موجود در اینترنت براحتی می توان از هر کدی ایراد های بیشمار گرفت).
اما جدا از بحث برنامه نویسی که امر مهمی بوده و بیشتر خطاهای میکرو از کد غلط ناشی می شود بخش مهم تری هم وجود دارد که آن طراحی درست سخت افزار برای پروژه صنعتی میکروکنترلری است. در این مقاله کوتاه تصمیم داریم به نکاتی که موقع ساخت یک پروژه صنعتی باید رعایت شود اشاره کنیم. شایان ذکر است که بخشی از این موارد تجربی بوده و بخشی دیگر با بررسی بردهای صنعتی واقعی و پروژه های گوناگون به دست آمده است که به صورت یکجا در این مقاله ارائه می شود.
یکی از مهم ترین بخش های هر پروژه صنعتی منبع تغذیه میکروکنترلر می باشد. منبع تغذیه برای میکرو مانند هوا برای موجود زنده است و اگر کوچکترین نویز، ریپل و یا قطعی داشته باشد براحتی بر روی مدارهای داخلی میکرو تاثیر خواهد گذاشت. بهترین منبع تغذیه برای میکرو کنترلر ترانسفورماتور، یکسوساز و رگولاتور به علاوه یک سلف در خروجی است. (از یک سلف ۱ میکروهانری توان بالا می توانید در خط مثبت خروجی استفاده کنید). این مجموعه در تمام بردهای صنعتی حرفه ای به چشم می خورد. استفاده از منبع تغذیه سوئیچینگ برای میکرو به هیچ عنوان توصیه نمی شود. هر چند جدیداً بخاطر ارزان تر تمام شدن این منابع در بردهای صنعتی بیشتر از چنین منبع تغذیه هایی استفاده می شود ولی بیشترین مراجعات برای تعمیر بردهای صنعتی بخاطر سوختن آی سی سوئیچینگ آن است. تصور کنید در منابع تغذیه سوئیچینگ یک آی سی به طور مستقیم با برق شهر در ارتباط است و با نوسانات برق که امری عادیست براحتی آسیب می بیند و حتی منفجر می شود. همچنین با مقایسه ترانس جوش های قدیمی ترانس دار و ترانس جوش های جدید سوئیچینگ ملاحظه می کنید که قدیمی ها هرگز برای تعمیر ارجاع داده نمی شوند ولی سوییچینگ ها به کرات برای تعمیر ارسال می شوند. نکته بعدی جدا بودن ترانس تغذیه میکرو از سایر بخش های غیر دیجیتال و بارهای القایی و سلفی مثل رله ها و موتورهاست. ترانس میکرو بهتر است یک ترنس کوچک ۹ ولت ۵۰۰ میلی آمپر باشد که پس از یکسو سازی و رگوله شدن با رگولاتور و ترکیب خارن های ۱۰۰۰ میکروفارد و ۱۰۰ نانوفارد به میکرو اعمال شود. برای رله ها بایستی یک ترانس دیگر به طور کاملا جدا از میکرو و با فاصله قرار داده شده و برای را اندازی رله ها و موتور ها از اپتوکوپلر استفاده شود. حتی زمین دو ترانس نیز نباید مشترک باشد.
در تصاویر زیر دو نمونه از برد های صنعتی که از ترانسفورماتور (و ATmega8) استفاده می کنند نشان داده شده است:
همانطوری که در قسمت بالا شرح داده شد برای کنترل بارهای خروجی نباید به طور مستقیم از پایه های میکرو استفاده کرد. این کار باید بوسیله تجویزگر نوری یا همان اپتوکوپلر انجام شود. ورودی ها نیز بایستی از میکرو ایزوله بوده و توسط اپتوکوپلر به میکرو متصل گردند. اتصال سیم های بلند به پایه های میکرو مانند اتصال آنتن برای دریافت نویزهای محیط و انتقال آن به میکروکنترلر است.
حتی الامکان از کریستال به انضمام دو خازن 22PF برای بخش نوسان ساز میکرو استفاده کنید. در غیر این صورت اگر از RC داخلی میکرو استفاده می کنید حتماً از فرکانس های بالا مثل ۴ یا ۸ مگاهرتز استفاده نمایید. فرکانس های پایین مثل یک مگاهرتز در سرمای شدید به شدت افت کرده (بدلیل استفاده از مقاومت در ساختار نوسان ساز RC داخلی) و به حد کیلوهرتز می رسد که همین امر موجب کارنکردن برخی از بخش ها مثل سنسور دیجیتال DS18B20 خواهد شد. این مورد کاملاً تجربی بوده و بصورت تصادفی برای یک پروژه صنعتی کنترل دما بوجود آمده بود که پس از بررسی فراوان و قرار دادن میکرو در بخش یخ ساز یخچال و آزمایش های مختلف دلیل آن پیدا شد!
اگر از Keypad در پروژه خود استفاده می کنید تمام پایه ها را با مقاومت 4,7K پول آپ کنید یعنی به + تغذیه میکرو متصل نمایید. این کار از برگرداندن اعداد تصادفی و غیر منتظره توسط کی پد جلوگیری به عمل می آورد. همچنین نکته دیگری که ربطی به نویز نداشته ولی گاهی اوقات اتفاق می افتد اینست که هرگاه کی پد به پورت C میکروهای M16 یا M32 متصل شود و فیوزبیت Jtag غیر فعال نشده باشد، مدام عدد ۷ برگردانده می شود که این امر با غیر فعال کردن فیوزبیت های Jtag و OCD برطرف خواهد شد. (در صورتی که این دو فیوزبیت غیر فعال نشوند دو پین از پایه های پورت C میکرو یا هر پورتی که Jtag بر روی آن قرار دارد کار نخواهد کرد).
در بخشهای بالا مهمترین روش های سخت افزاری برای به حداقل رساندن تاثیر نویز بر روی میکروکنترلر AVR بیان شد. در این بخش به توضیح چند مورد نرم افزاری که معمولاً نادیده گرفته می شود می پردازیم.
تایمر نگهبان یکی از مفید ترین بخش های میکروکنترلر برای ریست کردن خودکار میکرو در مواقع استثنایی و هنگ کردن میکرو به شمار می شود. این تایمر را می توان هم به صورت نرم افزاری روشن کرد و هم با تنظیم فیوزبیت ها به طور دائم روشن نگه داشت. این تایمر مستقل از میکرو عمل کرده و به محض روشن شدن میکرو و با توجه به زمانی که برای آن تنظم می شود و معمولاً روی ۱ یا ۲ ثانیه تنظیم می گردد، پس از سر رسیدن زمان تنظیم شده به طور خودکار میکرو را ریست می کند. برای جلوگیری از ریست شدن میکرو بایستی در تمام حلقه ها و خطوط برنامه که زمانبر هستند به صورت برنامه نویسی watchdog را ریست کرد تا تایمر آن خالی شود. حال در صورتی که برنامه میکرو به دلیل نویز گرفتن یا مشکل نرم افزاری هنگ کند پس از زمان تنظیم شده میکرو ریست شده و برنامه مجدداً راه اندازی می شود. دقیقاً مانند گوشی های موبایل که گاهی اوقات موقع هنگ کردن به طور خودکار ریست می شوند.
$regfile = "attiny2313.dat"
$crystal = 4000000
Config Watchdog = 2048
Start Watchdog
Reset Watchdog
do
Reset Watchdog
'your code
loop
end
در صورتی که از کامپایلر BASCOM استفاده می کنید بایستی با توجه به فراخوانی های سابروتین و متغیرهایی که در پرانتز توابع و سابروتین ها بکار برده اید و متغیر های محلی تعریف شده در توابع و سابروتین ها که با پیشوند Local به جای Dim تعریف می شوند و نیز تبدیلهای خودکار به رشته (توجه: در بسکام هرگاه جلوی LCD عبارتی به غیر از رشته بنویسید، کامپایلر به طور خودکار عدد را به رشته تبدیل می کند و برای این کار به فضایی به نام frame احتیاج دارد که توسط دستور framesize=xx بر حسب بایت در ابتدای برنامه مشخص می شود) بایستی اندازه hwstack و swstack و framesize را در ابتدای برنامه تنظیم کنید. بدست آوردن مقدار این متغیر ها مشکل بوده و بهتر است اگر SRAM کافی در اختیار دارید بر روی 64 یا 128 تنظیم کنید و اگر SRAM کافی ندارید مثل Attiny13 این مقادیر را روی 8 تنظیم کنید و برنامه را ترجیهاً ساده و بدون سابروتین و call و gosub و return بنویسید و به دلیل کم بودن framesize از lcd استفاده نکنید. همچنین توصیه می شود برنامه های مهم را با C بنویسید. البته نه کامپایلرهای قفل شکسته بلکه کامپایلرهای رایگانی مثل gcc و نسخه تحت ویندوز آن یعنی WinAVR و یا کامپایلر رایگان AVR Studio.
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
شاید بارها شاهد این بوده اید که عددی را در EEPROM داخلی میکرو کنترلر AVR ذخیره کرده اید ولی بعد از مدتی مقدار آن عوض شده و یا کلاً پاک شده است. شاید برای جبران این نقیصه از EEPROM های سریال استفاده کرده باشید. یکی از دلایلی که سبب پاک شدن EEPROM می شود تنظیم نکردن فیوزبیت های BODLEVEL و BODEN و Brown-out است. این فیوزبیت ها در میکروکنترلر AVR وظیفه دارند میکرو را پس از کم شدن ولتاژ تغذیه از حد خاصی خاموش کنند. حد خاص معمولا ۴ ولت و ۲/۷ ولت است که در برخی میکرو ها عدد ۱/۸ ولت نیز دیده می شود. ولی بهتر است که اگر از میکرو ۵ ولت استفاده می کنید همیشه این عدد را روی ۴ ولت و یا برای اطمینان بیشتر روی ۲/۷ ولت قرار دهید. در این صورت به محض کم شدن ولتاژ برق شهر و یا حتی موقع خاموش کردن میکرو که خازن منبع تغذیه به طور تدریجی خالی می شود دیگر میکرو در ولتاژهای پایین روشن نمی ماند و EEPROM آن آسیب نخواهد دید. ای ایپرام به ولتاژ های پایین حساس بوده و در این ولتاژ اگر متغیر در آن نوشته و یا از آن خوانده شود ممکن است مقدار آن بهم بریزد. همچنین موقع خواندن و نوشتن EEPROM دقیقاً پس از خواندن و نوشتن بایستی حدود ۱۰ میلی ثانیه صبر کنید. مثلا در بیسیک از دستور waitms 10 استفاده کنید تا عملیات به طور کامل انجام شود. همچنین از متغیر EEPROM به طور مستقیم در برنامه و شرط ها استفاده نکنید و در همان ابتدای برنامه متغیر EEPROM را در یک متغیر SRAM کپی کنید و هر کجا که لازم بود در متن برنامه آن را آپدیت نمایید. توجه داشته باشید که بر خلاف SRAM متغیر های EEPROM پس از 10 هزار بار خواندن و نوشتن خراب شده و سلول حافظه مورد نظر کارایی خود را از دست خواهد داد. این یعنی اگر یک متغیر EEPROM را در یک حلقه با مقدار 10000 قرار دهید براحتی سلول حافظه مورد نظر خراب می شود.
$regfile = "attiny2313.dat"
$crystal = 4000000
dim myvar as Byte
dim myvar_e as eram Byte
'default:
if key_default = 0 then
myvar_e = 0
waitms 10
end if
'Loading EEROM to SRAM:
myvar = myvar_e
waitms 10
'*************************
'your code:
if key_pressed = 0 then
incr myvar
'UPDATE EEPROM:
myvar_e = myvar
waitms 10
end if
end
اگر از BASCOM برای کدنویسی استفاده می کنید بایستی توجه داشته باشید که در عبارات های محاسباتی متغیرها حتماً باید همگی از یک نوع تعریف شوند. مسلماً این امر یک اشتباه نرم افزاری است و به طور مثال در کامپایلرهای تحت ویندوز براحتی می توان مقدار Byte را در Word جای داد. اما در بسکام این کار منجر به ایجاد خطاهای عجیب خواهد شد. اگر نیاز است که در بخشی از برنامه، محاسباتی بر روی متغیرهای خاصی انجام شده و مقدار آنها در یکدیگر قرار داده شود، همه آنها را از یک نوع تعریف کنید تا دچار این خطای منطقی ظریف نشوید.
متاسفانه درصد بالایی از کاربران از نسخه های قفل شکسته برنامه ها استفاده می کنند. این کار در درجه اول به دلیل عدم آگاهی کاربر صورت می گیرد. مثلاً شخص در محیطی بزرگ شده که هیچ قانونی برای عدم کپی نرم افزار وجود نداشته و یا رعایت نشده است. چنین شخصی بدون آگاهی، از نرم افزار به سرقت رفته و قفل شکسته استفاده می کند. غافل از اینکه برای نرم افزار مورد نظر زحمت های بسیاری کشیده شده است و برای هر نسخه آن باید مبلغی به تولید کننده پرداخت گردد. جدا از بحث اخلاقی معمولاً نرم افزارهای قفل شکسته بدین شکل ایجاد میگردند که یک فرد متخصص و برنامه نویس برنامه دمو و مدت دار یا دارای محدودیت خاص را دی اسمبل کرده و به زبان اسمبلی باز میگرداند؛ سپس با توجه به محدودیت برنامه مثلاً کامپایل 4 کیلوبایت کد یا مدت 30 روزه بخشی از برنامه را که این محدودیت را ایجاد می کند پیدا کرده (مشکل ترین قسمت همین است) و آن را پاک می کند و مجدداً برنامه را از سورس اسمبلی ایجاد می کند. این کار معمولاً باعث ایجاد باگ های خاص نرم افزاری شده و نرم افزار بدست آمده کارایی نرم افزار اصلی را نخواهد داشت. در مورد Bascom در Help این نرم افزار از زبان رئیس کمپانی می خوانیم که گفته است: لطفاً از نسخه دمو و یا خریداری شده استفاده کنید و حتماً از سایت رسمی ما دانلود شود. نسخه های قفل شکسته دارای باگ های نرم افزاری می باشند که به صورت تصادفی کدهای خطا دار تولید می کنند و به سختی قابل تشخیص است.
با رعایت شرط های بالا تابحال دستگاه های بیشماری توسط AVR64.com و Novinkit.com طراحی و تولید شده و بخوبی در محیط های صنعتی کار کرده و بدون کوچکترین مشکلی به کار خود ادامه داده اند. در تصاویر زیر برخی از این دستگاه ها و نیز محیط کاری نمایش داده شده است.