مقایسه میکروکنترلرها همیشه یک جنگ خونین بوده و هست. متاسفانه افراد تعصبات زیادی روی ابزارهایی که استفاده میکنند دارند و در اغلبموارد معتقدند که ابزار و لوازم مورداستفاده خودشون بهترین ابزارموجود در جهان که نه، بلکه در کهکشان است؛ بنابرهمین استدلال، حاضر نیستند حتی اپسیلونی از مواضع خودشون کوتاه بیان و یک بحث منطقی رو شکل بدهند؛ نمونه زیاده مثلا “لینوکس بهتر است یا ویندوز؟” یا “کامپایلر Keil بهتر است یا IAR” و… معمولا چنین بحثهایی بینتیجه و بیسرانجام میمونه و تهش هم افراد ازهم رنجیدهخاطر میشوند، ما در این مقاله قصدنداریم که به این دعوا دامن بزنیم یا بهش بپردازیم؛ همیشه معتقد بودم ابزاری که کارم رو سادهتر کنه؛ پس بهترینه(البته بهشرطیکه ندزدیده باشم؛ یا خریده باشم یا رایگان بودهباشه)پس در این مقاله همین رویکرد رو خواهیمداشت و از برخورد احساسی درمورد این مقوله دوری خواهیمکرد. با ما همراه باشید.
ما در این مقاله قصد نداریم پرفال به پرفال میکروکنترلرهای موردبحث را بررسیکنیم؛ بلکه قصدداریم نکاتکلیدی را مطرحکنیم که در تصمیمگیری حائز اهمیت است.
میکروکنترلر و کمیاز تاریخچه آن در ایران
سالها پیش؛ شاید بشهگفت سالهای بسیاردور، سالهایی که هنوز میکروکنترلرهای ۸بیتی مثل AVR پادشاهی داشتند؛ زمانیکه تازه میکروکنترلرهای ARM وارد عرصهی رقابت شدهبودند؛ اونموقع مثل الان شروع ساده نبود؛ منابع خیلی محدود بود و آموزشها همه به زبانانگلیسی و محدود؛ اول سالها برای راهاندازی یه میکروکنترلرARM باید چندتا ولتاژ درستمیکردی؛ باید شبکهRC برای بخشPLL درست میکردی؛ پروگرامر و دیباگر دردسترس نبود و همه ازطریق بوتلودرهای تعبیهشده روی آیسی اقدامبه برنامهریزی اون میکردند؛ فکرکنید توی چنین شرایطی اول سروکله LPC1768 (البته اگر از سری LPC2368 بگذریم) پیدا شد؛ اگر در اون دوره زندگی کردهباشید حتما بهیاددارید؛ اغلب از میکروکنترلرهای Atmel استفاده میکردند با شماره At91Sam7 که تمام این دنگ و فنگهایی که توضیحدادم (توی عکسفوق میتونید تنها برد راهاندازش رو ببینید) رو داشت. حالا فکرکنید بهتون میگن میکروکنترلری اومده که برای راهاندازی فقط ولتاژ۳.۳ لازمداره؛ هیچکدوم از این خازن مقاومتها رو هم نمیخواد؛ تازه بوتلودرشم ازطریق پورت سریال هست؛ واقعا باورنکردنی بود. اینطور شد که شاید حدود ۱سال با میکروکنترلر LPC1768 کار کردیم و بعد میکروکنترلرهای STM32 وارد بازار شدند و کمکم جای خودشون رو باز کردند. اون اوایل علاقه زیادی بهشون نداشتم(نه بهخاطر LPC1768 بلکه بخاطر دلایل منطقی که در ادامه بیان میکنم) ولی کمکم گذشتوگذشت جوریکه الان شاید حدود ۵سالی میشه که سراغ LPC1768 نرفتم البته بهتازگی با LPC1788 دارم کار میکنم. همین شد جرقه نوشتن این پست که بپردازیم به این که کدام میکروکنترلرها چه قابلیتهایی دارند و استفادهاز کدوم میکروکنترلر منطقیتر است و کجا نمیشه از کدوم میکروکنترلر استفادهکرد.
انتخاب منصفانه رقبا برای مقایسه
درمقایسه انصاف رو باید رعایتکرد؛ برایهمین انتخاب کاندید مناسب یکیاز جنبههای انصاف است، ملاکهایی که مدنظر قرارمیدهیم برای انتخاب؛ اول رایجبودن شماره مذکور هست و دوم هم داشتن هسته پردازشی یکسان است. برای هسته پردازشی سراغ هستههای Cortex خواهیمرفت؛ مخصوصا هسته Cortex-M3؛ چراکه این هسته در بیشتر میکروکنترلرها مورداستفاده قرارمیگیرد؛ البته هسته سری M خاص میکروکنترلر طراحیشده برای این سراغ هسته Cortex-M3 میرویم چون رایجتر هست. در خانواده NXP میکروکنترلر رایج این هسته LPC1768 است و در خانواده ST هم سراغ سری STM32F10X میرویم چراکه رایجترین شمارهی ممکن این خانواده هست.
بررسی ساختار میکروکنترلرها
وقتی از میکروکنترلر LPC17xx استفاده میکنید؛ دقیقا این حس رو داره که دارید از یک میکروکنترلر۳۲بیتی استفاده میکنید؛ چراکه تمام رجیسترها ۳۲بیتی هستند، ولی این حس رو در کارکردن با ST ندارید! دقیقا به ایندلیل که در
میکروکنترلرهای شرکت ST اغلب رجیسترهای بهصورت ۱۶بیتی هستند انگارکه هسته ۳۲بیتی رو روی بدنه یه میکروکنترلر ۱۶بیتی سوارکردهباشند! البته نمیشهگفت این بده ولی وقتی بخواید یه پورت ۳۲بیتی داشتهباشید که اطلاعات رو بهصورت مستفیم بریزید روش بدون دخالت CPU شما رو دچارمشکل خواهدکرد.
همپوشانی ناخوشایند
همه اطلاعداریم که میکروکنترلرهای ST از قیمتهای خیلی مناسبی نسبت به NXP برخوردار هستند؛ و فکرمیکنم یکیاز دلایلاصلی فراگیرشدن این میکروکنترلرها همین مساله میباشد؛ اما چطور این قیمتمناسب ممکنمیشود؟ اگر بخواهیم در سطح سلیکون به این مساله بپردازیم؛ کاهشحجم سلیکون میتونه دلیل عمده این مساله باشه؛ بهعنواننمونه شما در خانواده F1 قادرنیستید که همزمان هم از رابط USB و هم از رابط Can استفادهکنید؛ چون این دو از یک RAM یکسان استفاده میکنند این درحالیست که چنین محدودیتی در میکروکنترلرهای NXP وجود ندارد. از دیگرموارد آزاردهنده این همپوشانیها بحث Remap است، منظور از Remap تغییر پایههای مورداستفاده یک پرفال است. در میکروکنترلر LPC17xx این بحث بهصورت بیتبهبیت پیادهسازی شدهاست درحالیکه در میکروکنترلرهای STM32 این بحث بهصورت پرفالی دیدهشدهاست که چندانجالبنیست! بگذارید برای روشنترشدن مساله با مثالی این موضوع را بررسیکنیم؛ درحالت عادی Uart1 در میکروکنترلر STM32 برروی پایههای PA9 و PA10 است؛ اگر پایه PA9 را بهعنوان ورودی تایمر استفادهکردهباشید و قصدداشتهباشید از Uart1 استفادهکنید حتما باید از پایههای PB6 و PB7 استفادهکنید و امکان استفادهاز PA10 را نخواهیدداشت. یعنی مجبوربه جابجایی هردو پایه هستید درحالیکه میکروکنترلر LPC17xx این امکان را بهشما میدهد. گاهی در طراحی PCB امکان مپکردن بهصورت بیتی موجب سادهشدن طرح خواهدشد.
ضرایب دردسرساز
PLL از اجزاء جدانشدنی مدارات میکروکنترلر جدید است؛ درواقع کار PLL افزایش فرکانس ورودی است، وجود PLL باعث میشود که میکروکنترلر با یک کریستال ۱۲مگاهرتزی قادر باشد با ۱۰۰مگاهرتز کار کند. در میکروکنترلرهای LPC17xx بخش PLL بهنحوی طراحیشدهاست که تقریبا شما را قادر میسازد با اکثر فرکانسهای ورودی فرکانس موردنیاز خودتان را ایجاد کنید؛ چراکه یک عدد ۱۴بیتی بهعنوان ضربکننده دریافت میکنید و یک عدد ۸بیتی بهعنوان تفسیمکننده! اما در میکروکنترلرهای STM32 مقداری قضیه متفاوت است و شما تنها قادربه انتخاب بین ضرایب هستند و نمیتوانید هر عدد دلخواهی را ضربوتقسیم کنید. همین مساله برای کلاک ورودی تایمرها و باسهای داخلی نیز صادق است.
پاراللکردن سختافزاری
فرضکنید در پروژهای لازمدارید که یک تایمر ۳۲بیتی داشتهباشید، با میکروکنترلر LPC17xx نیازنیست نگرانچیزیباشید چراکه تایمرها بهصورت پیشفرض ۳۲بیتی هستند؛ اما وقتیکه از میکروکنترلرهای STM32 استفاده میکنید؛ واقعا جای نگرانی وجود دارد؛ چراکه تمام تایمرهای ۱۶بیتی هستند همیندلیل باعث ایجاد چالشهای زیادی در طراحی و پیادهسازی خواهدشد.
خوشبختانه STM32 قابلیتی دارد که میتوانید چند سختافزار را بههم متصلکنید و از حداکثر راندمان آن استفادهکنید.
این قابلیتیاست که اجازه میدهد قادرباشید دو یا حتی سه تایمر ۱۶بیتی را باهم لینککنید و بتوانید یک تایمر ۳۲بیتی یا ۴۸بیتی داشتهباشید. اما قابلیت لینککردن بههمینجا محدود نمیشود؛ تا حالا فکر کردهاید چرا میکروکنترلرهای STM32 در برخیموارد ۲ یا ۳ واحد ADC مجزا دارند؟ دقیقا شما قادر هستید این دو یا سه واحد مجزا را باهم بهنحوی ترکیبکنید تا سمپل ریت را ۲تا ۳برابر افزایشدهید. این قابلیتیاست که در میکروکنترلرهای LPC17xx وجود ندارد.
کلیدیترین موضوع
همیشه مقایسه میان میکروکنترلرها با سنجش میزان فرکانس کاری CPU؛ میزان حافظه RAM و Flash و… انجاممیشه که مقایسه صحیحی نیست؛ مهمترین و اساسیترین مساله جامعه استفادهکننده و پشتیبانیکننده است. بذارید با مثالی موضوع رو روشنکنم؛ فرضکنید میکروکنترلری به اسم XVR وجود داره که یک دلار قیمت داره، با ۱ گیگاهرتز فرکانس CPU و ۶۴مگابایت رم و ۱ گیگابیت حافظه Flash؛ از اونطرفهم میکروکنترلر AVR همین قیمت رو داره؛ شما کدوم میکروکنترلر رو انتخابخواهیدکرد؟ تا اینجا فکرنمیکنم شکداشتهباشید بین XVR و AVR! ولی شما مساله اصلی رو فراموشکردید، میکروکنترلرXVR تنها یک دیتاشیت داره که قابلیتها و پایههای میکروکنترلر داخلش توضیحداده نه انجمن و نه سایتی برای پشتیبانی نداره؛ ولی درمقابل AVR انجمن فعال و کاربرهای فعالی داره که درصورت بهوجودآمدن مشکل یا خطا میتونید مساله رو مطرحکنید و در کوتاهترین زمان ممکن به جوابدلخواه برسید! حالا کدام را انتخاب میکنید؟ من که باشم قطعا بهسراغ AVR خواهمرفت، درواقع مساله مهمتر از قابلیتهای فنی؛ گستردگی جامعه استفادهکننده است همین باعث میشه که شما بتونید بهسادگی پروژه خودتون رو پیشببرید و درصورت بروز مشکل، هرچه سریعتر مشکلتون رو برطرف کند. اگر بخوام مقایسه رو بین میکروکنترلرهای NXP و ST انجامبدم؛ بهجرات میتونم بگم که ST جامعه بزرگتری از استفادهکنندهها رو داره و فروم فعالی داره که بهسادگی مشکلاتتون رو برطرفکنید؛ درمقابل شرکت NXP در این زمینه چندانموفق عملنکرده و جامعه استفادهکنندگان چندان بزرگی هم نداره و همین مساله قطعا در آینده شما رو با مشکل مواجهخواهدکرد. ازطرفدیگر شرکت NXP ایران رو تحریمکرده و سایتش برای دوستان مقیم ایران دردسترس نیست که شرایط استفادهاز مستنداتش رو دوچندان سختتر خواهدکرد!
منبع:سیسوگ