در قسمت پیشین سری آموزش STM32 با توابع HAL، اولین برنامه را توسعه دادیم و با عملیات ابتدایی GPIO آشنا شدیم. در قسمت حاضر، میخواهیم در مورد جزییات بیشتر از GPIO صحبت کنیم. با سیسوگ همراه باشید.
در بخش قبلی در مورد تنظیم و استفاده از GPIO در حالت ورودی و خروجی صحبت کردیم. دیدیم که میتوان یک پایه را در حالت pull-up یا pull-down قرارداد و سیگنال ورودی متناسب را توسط آن خواند. برای پایههای خروجی نیز حالتهای مختلفی تعریف میشود. برای توضیح دقیقتر باید گفت که مدار متصل به هر پایه فیزیکی میکرو، امکان انتخاب بین حالتهای مختلفی از درایو کردن پایه موردنظر را به ما میدهد. علاوه بر اینکه پایه را قادر میسازد تا به انواع مختلفی از مدارهای آنالوگ و دیجیتال متصل شود.
در بخش قبل و بهصورت پیشفرض از حالت Push-pull استفاده شد. اما حالت دیگری نیز برای خروجی تعریف میشود که Open-Drain نام دارد. برای اینکه حالت Open-Drain و تفاوت آن با Push-pull را بهتر متوجه شویم، ابتدا به بررسی مدار Push-pull و جزییات آن میپردازیم.
Push-Pull
این حالت، رایجترین حالت مورداستفاده برای پایه خروجی است. همانطور که از نام آن مشخص است، یک پایه خروجی در حالت Push-pull، امکان درایو کردن هر دو سطح منطقی را دارد. بدینصورت که یک بخش مدار (pull)، جریان را از سمت بار به زمین میکشد و بخش دیگر (push)، جریان را از سمت منبع تغذیه به سمت بار هدایت میکند. مدار Push-pull را میتوان با یک جفت سوییچ پیادهسازی کرد که در عمل برای ساخت این مدار، از ترانزیستور بهعنوان سوییچ استفاده میشود.
شماتیک ساده شدهی یک خروجی Pull-pull.
در شکل بالا، یک خروجی Push-pull بهوسیله یک ترانزیستور PMOS و یک ترانزیستور NMOS، پیادهسازی شده است. در شکل سمت چپ، عملیات انجامشده در فاز push و در سمت راست عملیات فاز pull نشان دادهشده است.
فاز push: زمانی که سیگنال ورودی گیت ترانزیستورها، منطق low یا صفر منطقی باشد، ترانزیستور PMOS فعال میشود و جریان را از سمت VDD به پایه خروجی هدایت میکند. در این زمان ترانزیستور NMOS غیرفعال (یا مدارباز) خواهد بود و جریانی منتقل نمیکند.
فاز pull: هنگامیکه سیگنال متصل به گیت ترانزیستورها، منطق high یا یک منطقی باشد، ترانزیستور NMOS فعال میشود و جریان را از پایه خروجی به سمت زمین هدایت میکند. در این زمان ترانزیستور PMOS غیرفعال (یا مدارباز) خواهد بود و جریانی عبور نمیدهد.
در نوع خروجی Push-pull، امکان اتصال همزمان چندین دستگاه در یک ساختار BUS، وجود ندارد. Push-pull درجاهایی کاربرد دارد که خطوط ارتباطی یک طرفه یا یک جهته هستند (به این معنی که انتقال اطلاعات در یک خط، تنها در یک جهت انجام میشود، مثل ارتباط SPI، UART و …). ازآنجاییکه خروجی Push-pull به شکل پیوسته (به منطق high یا low) درایو میشود، این نوع خروجی برای کاربردهایی که slope سیگنال تولیدشده، اهمیت دارد، کارایی بهتری دارند.
بهعنوان نکته آخر در مورد Push-pull نیز باید گفت که پایه خروجی تنظیمشده در این حالت را معمولاً میتوان بهصورت دینامیکی مجدداً تنظیم کرد و آن را تبدیل به یک پایه ورودی نمود. بدینصورت که برای این منظور، هر دو ترانزیستور PMOS و NMOS، بسته میشوند و درنتیجه، خط در حالت high imedance قرار میگیرد. بنابراین دستگاههای خارجی متصل به خط، میتوانند آن را درایو کنند و بهوسیله مدار منطقی متصل به پین، حالت آن تشخیص داده میشود.
Open Drain
در این نوع خروجی، مدار متصل به پایه، تنها قابلیت درایو کردن پایه به زمین یا همان منطق صفر را دارد. حالت ممکن دیگر برای پایه نیز، high imedance (Hi-Z) است. پیادهسازی Open Drain تنها با استفاده از یک ترانزیستور صورت میگیرد. نحوه کارکرد آن به این صورت است که درصورتیکه ترمینال Drain، مدارباز باشد (ترانزیستور خاموش باشد)، پایه در حالت Hi-Z میماند. برای درایو کردن پایه به منطق high، به یک مدار یا دستگاه اضافه نیاز است. بدین منظور در بسیاری از کاربردها از یک مقاومت pull-up خارجی استفاده میشود که البته برخی میکروکنترلرها این مقاومت pull-up را بهصورت داخلی برای تنظیمات Open Drain تأمین میکنند.
شماتیک یک خروجی Open Drain.
در شکل بالا، شماتیک یک خروجی Open Drain نشان دادهشده است. مشاهده میکنیم که این مدار تنها با استفاده از یک ترانزیستور NMOS پیادهسازی شده است. زمانی که این ترانزیستور روشن باشد، جریان را از پایه خروجی به زمین میکشد و زمانی که خاموش باشد، پایه در حالت float قرار خواهد گرفت.
کاربرد اصلی خروجی Open Drain در ارتباطهایی است که در آنها، چندین دستگاه به یک خط متصل میشوند (ازجمله ارتباط I2C و One-Wire). زمانی که همه خروجیهای مربوط به دستگاههای متصل به خط، در حالت Hi-Z باشد، ولتاژ خط بهوسیله یک مقاومت pull-up، به منطق پیشفرض 1 میرود. بنابراین به دلیل ساختار Open Drain، هر یک از دستگاههای متصل به خط میتوانند ولتاژ خط را به منطق 0 ببرند و همه دستگاههای دیگر قادر به تشخیص سطح ولتاژ خط خواهند بود.
در ادامه نکات مهمی در مورد خروجی Open Drain بیان میشوند که برای استفاده از این حالت خروجی، باید مورد توجه قرار دهیم.
شیب لبه بالارونده (Rising edge slope): حضور مقاومت pull-up در کنار خازن ذاتی خط ارتباطی، موجب تشکیل یک فیلتر پایین گذر میشود. پس بسته به مقدار مقاومتی که برای pull-up استفاده میشود و همچنین مقدار ظرفیت خازنی خط، شیب لبه بالارونده ممکن است تفاوت قابلتوجه ای با شیب لبه پایینرونده، داشته باشد. بدینصورت که شیب لبه پایینرونده بسیار تیزتر است. دلیل این امر نیز نقش ترانزیستور در مسیر صفر شدن سیگنال است. ازآنجاییکه ترانزیستور مقاومت داخلی بسیارکمی دارد، در مقایسه با مسیر pull-up که یک مقاومت خارجی (با مقدار قابلتوجه) دارد، تأثیر فیلتر پایین گذر بسیار کمتر خواهد بود.
لبههای بالا رونده و پایین رونده یک سیگنال موج مربعی که توسط یک خروجی Open Drain تولید شده است.
مصرف توان و تداخل نویز: مسئله توازن مصرف توان و تداخل نویز، در انتخاب مقاومت pull-up، بدینصورت است که مقدار مقاومت کوچکتر باعث میشود که خط ارتباطی با جریان بیشتری درایو شود و درنتیجه مصرف توان افزایش یابد. از طرف دیگر مقدار مقاومت بزرگتر موجب میشود که مقدار جریان عبوری و درنتیجه مصرف توان کاهش یابد اما در مقابل تأثیر تداخلهای خارجی (یعنی نویز) نیز بر روی خط پررنگتر خواهد شد.
مقایسه Push-Pull و Open Drain
با توجه به نکات گفتهشده در مورد هر یک از مدارهای خروجی Push-pull و Open Drain، میتوان نکات مربوط به مقایسه این دو را بهصورت زیر جمعبندی کرد:
- خروجی Push-pull برای ارتباطهایی که شامل خطوط یک طرفه هستند (مثل SPI و UART) مناسبتر است. درحالیکه حالت Open Drain برای ارتباطهایی مناسب است که شامل خط دو طرفه هستند و همچنین بیش از دو دستگاه به یک خط متصل است (مثل ارتباط I2C و OneWire).
- خروجی Open Drain به نسبت Push-pull توان بیشتری مصرف میکند. زیرا در زمان pull-up در مسیر مقاومت نیز توان قابلتوجه ای صرف میشود.
اکنونکه با جزییات و تفاوتهای Open Drain و Push-pull آشنا شدیم، میخواهیم یک پروژه ساده را برای نشان دادن کاربرد Open Drain شرح دهیم.
پروژه هشدار حریق
فرض کنید که میخواهیم در فضای یک اتاق یا سالن تعدادی سنسور تشخیص دود قرار دهیم که در زمان آتشسوزی بتوانیم بهوسیله یک آژیر یا زنگ هشدار، از حادثه باخبر شویم. برای اتصال همه سنسورها به یک خط، باید از حالت Open Drain استفاده کنیم. بهصورتی که هر سنسور امکان زمین کردن خط را داشته باشد. همانطور که در مورد ویژگیهای پایه خروجی صحبت کردیم، در این موقعیت نمیتوان از حالت push-pull استفاده کرد. زیرا ترانزیستور PMOS در این مدار، از صفر شدن پایه توسط عامل خارجی جلوگیری میکند. بنابراین در این پروژه ازآنجاکه تشخیص اینکه کدام سنسور سیگنال داده است و همچنین مکان سنسور اهمیت ندارد، با یک خط ارتباطی و یک پایه در حالت Open Drain، میتوان سیگنال تمامی سنسورها را مدیریت نمود.
در این قسمت از سری آموزش STM32 با توابع HAL، در مورد جزییات GPIO صحبت کردیم و باحالت خروجی Open Drain آشنا شدیم. در قسمت بعدی، میخواهیم Exception ها و وقفهها، چگونگی تغییر روند پردازنده و رفتن به روال وقفه را بررسی کنیم.
یک سوال open-drain مگه output نیست چجوری ما تو اون مثال میفهمیم که یک سنسور صفر شده ؟
اگر به معماری opendrain نگاه کنید متوجه میشید که نیازه شما روی خط پول آپ داخلی یا خارجی رو فعال کرده باشید و شما تنها کنترل صفر کردن خط رو داشته باشید همین به تنهایی کمک میکنه که دیوایس ها قادر باشن با هم ارتباط برقرار کنند
برای درک بهتر موضوع پروتکل i2c رو مطالعه کنید.