آموزش STM32 با توابع HAL قسمت ششم: جزییات پیشرفته‌تر از GPIO

آموزش STM32 با توابع HAL قسمت ششم: جزییات پیشرفته‌تر از GPIO

آموزش STM32 با توابع HAL قسمت ششم: جزییات پیشرفته‌تر از GPIO
آموزش STM32 با توابع HAL قسمت ششم: جزییات پیشرفته‌تر از GPIO

در قسمت پیشین سری آموزش 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 و Push-pull

4 نفر

پــــســنــدیـده انـد

توجه

سیاوش
سیاوش

کارشناس ارشد الکترونیک دیجیتال، علاقه‌مند به یادگیری

دیدگاه ها

0 دیدگاه

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 3 سال پیش
راه اندازی LCD گرافیکی Nokia 1661

راه اندازی LCD گرافیکی Nokia 1661

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

Zeus ‌ Zeus ‌
  • 4 سال پیش
ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش
همه چیز درباره ریموت کنترل‌های هاپینگ

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش
مسابقه سوم: استخراج داده از رشته ها در زبان C

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش
مسابقه ششم: بزن میکروکنترلر را بسوزون!

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 12 ماه پیش
آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش
ساخت ماینر با FPGA و ARM

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

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

Mahdi.h   Mahdi.h  
  • 3 سال پیش
مسابقه چهارم: کدام حلقه سریع‌تر است؟

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک