آموزش STM32 با توابع LL قسمت 35: ارتباط OneWire

آموزش STM32 با توابع LL قسمت 35: ارتباط OneWire

آموزش STM32 با توابع LL قسمت 35: ارتباط OneWire
آموزش STM32 با توابع LL قسمت 35: ارتباط OneWire

در قسمت قبلی درباره‌ی رابط گرافیکی برای wave player صحبت کردیم، اما در این بخش می‌خواهیم درباره‌ی ارتباط OneWire که بخش مهمی در دنیای الکترونیک هست صحبتی داشته باشیم.

در طول این آموزش با پروتکل‌های ارتباطی مختلفی کارکردیم که هرکدام مزیت‌ها و کاربردهای خودشان را داشتند. در این بخش می‌خواهیم ارتباط OneWire را بررسی کنیم. سپس به‌وسیله این پروتکل ارتباطی یک دماسنج را راه‌اندازی کنیم. برای ادامه آموزش با سیسوگ همراه باشید.

 

ارتباط OneWire

ارتباط میکروکنتلر با سنسور DS18B20 از طریق پروتکل OneWire.

 

ارتباط OneWire

همان‌طور که در تصویر بالا مشخص است، این ارتباط تنها از یک سیم برای انتقال اطلاعات استفاده می‌کند. سیم دوم که وجود آن ضرورت دارد GND یا زمین است. وجود سیم سوم برای VDD (3.3 یا 5 ولت)، الزامی نیست و این ولتاژ می‌تواند از طریق همان پایه انتقال سیگنال، در زمان‌های مناسب، اعمال شود. البته در پروژه‌ای که در این آموزش بررسی می‌کنیم، از حالت 3 سیمه این پروتکل بهره می‌گیریم. مزیت‌های این ارتباط تعداد سیم مورد نیاز آن و همچنین امکان استفاده آن در فواصل نسبتاً طولانی (تا حدود 300 متر) است.

در ارتباط OneWire به‌صورت سه سیمه، از یک مقاومت برای Pull-up بین دو پایه DATA و VDD استفاده می‌شود. این ارتباط به‌صورت Half Duplex است. به این معنی که هم امکان ارسال و هم دریافت اطلاعات وجود دارد اما در هر زمان فقط یکی از این دو عمل انجام می‌شود. به عبارتی در هر زمان تنها یک دستگاه در این پروتکل می‌تواند داده ارسال کند.

نحوه انتقال اطلاعات نیز به این صورت است که وقتی فرستنده می‌خواهد مثلاً منطق صفر ارسال کند باید برای مدت‌زمان مشخصی سطح ولتاژ DATA را روی صفر نگه دارد و سپس خط داده را رها کند، در این زمان مقدار ولتاژ خط داده به‌وسیله مقاومت Pull-up به VDD بازگردانده می‌شود. به همین ترتیب برای ارسال منطق یک نیز سطح ولتاژ DATA برای مدت‌زمان مشخصی روی صفر نگه‌داشته می‌شود (معمولاً زمانی کوتاه‌تر، به نسبت منطق صفر) و سپس رها می‌شود. برای عمل خواندن (توسط Master) یک ولتاژ صفر به خط DATA اعمال و سپس رها می‌شود، بعدازآن کنترل خط داده توسط دستگاه جانبی یا Slave انجام می‌گیرد، در این حین Master از سطح ولتاژ نمونه‌گیری می‌کند. یک دیاگرام نمونه از انتقال اطلاعات با این پروتکل در شکل زیر نشان داده‌شده است:

 

ارتباط OneWire

 

دماسنج 18B20

در این پروژه قصد داریم از این پروتکل برای ارتباط با 18B20 (یک سنسور دماسنج)  استفاده کنیم.

ارتباط OneWire

این قطعه، با اسم پکیج‌ها متفاوت و توسط تولیدکننده‌های مختلفی عرضه می‌شود. در این آموزش از 7Q-tek 18B20 استفاده‌شده است. اما به‌صورت کلی، دماسنج 18B20 یک سنسور دیجیتال اندازه‌گیری دما است که از ارتباط one-wire استفاده می‌کند. این سنسور قابلیت اندازه‌گیری دما در بازه -55 تا +125 درجه سانتی‌گراد را دارد. همچنین دقت این دماسنج‌ها، بسته به مدل و تولیدکننده آن‌ها معمولاً حدود 0.5± درجه سانتی‌گراد است. مشخصات کامل این دماسنج به‌صورت زیر است:

 

  • Usable temperature range: -55 to 125°C (-67°F to +257°F)
  • 9 to 12 bit selectable resolution
  • Uses 1-Wire interface- requires only one digital pin for communication
  • Unique 64 bit ID burned into chip
  • Multiple sensors can share one pin
  • ±0.5°C Accuracy from -10°C to +85°C
  • Temperature-limit alarm system
  • Query time is less than 750ms
  • Usable with 3.0V to 5.5V power/data

 

اکنون‌که با جزییات کار آشنا شدیم به سراغ ایجاد پروژه می‌رویم.

 

ایجاد پروژه

برای این پروژه تنها به یک پین GPIO نیاز داریم. البته برای نمایش اطلاعات مثل پروژه‌های قبلی واحد USART1 را نیز فعال می‌کنیم. مانند گذشته کلاک و دیباگ رو تنظیم می‌کنیم و به سراغ تنظیم پین GPIO می‌رویم؛

 

ارتباط OneWire

همان‌طور که در تصویر هم مشخص است، پایه خروجی (در اینجا PA8) باید در حالت Open Drain و NO pull-up and no pull-d تنظیم شود.

اکنون پروژه را ایجاد می‌کنیم و به سراغ نوشتن کد می‌رویم.

 

نوشتن کد پروژه

برای شروع کار، باید توابع موردنیاز برای راه‌اندازی پروتکل OneWire را بنویسیم و سپس با استفاده از این توابع به سنسور دما فرمان بدهیم و یا اطلاعات آن را بخوانیم. پس فایل‌های onewire.c و onewire.h را برای نوشتن توابع ایجاد می‌کنیم.

ابتدا به سراغ فایل onewire.h می‌رویم. کد موردنیاز برای این فایل به‌صورت زیر نوشته می‌شود:

همان‌طور که در این کد دیده می‌شود، ابتدا در سه خط اول، کتابخانه‌های موردنیاز، اضافه‌شده‌اند. سپس یک structure مربوط به ارتباط OneWire تعریف‌شده است که پین و پورت مورداستفاده و دیگر مشخصات مربوط به این ارتباط، در آن ذخیره می‌شود. پس‌ازآن نیز کد هگز مربوط به دستورات مختلف OneWire تعریف‌شده‌اند. در آخر، توابع موردنیاز اعلان می‌شوند.

اکنون وارد فایل onewire.c می‌شویم. در این فایل ابتدا onewire.h را اضافه می‌کنیم؛

اولین تابع، یعنی OneWire_Delay، برای ایجاد زمان‌بندی‌های موردنیاز در ارتباط OneWire به‌کار می‌رود. این تابع به‌صورت زیر تعریف می‌شود:

همان‌طور که از کد مشخص است، این تابع تنها یک تأخیر به‌اندازه مقدار دریافت شده در ورودی و با واحد میکروثانیه ایجاد می‌کند. پس‌ازآن، تعریف توابع OneWire_Low و OneWire_High که به ترتیب برای 0 و 1 کردن خط OneWire استفاده می‌شوند، به‌صورت زیر است:

توابع OneWire_Input و OneWire_Output برای ورودی و خروجی کردن پین OneWire کاربرد دارند و به‌صورت زیر تعریف می‌شوند:

تابع بعدی، OneWire_Init است که برای راه‌اندازی ارتباط OneWire استفاده می‌شود. این تابع را به‌صورت زیر تعریف می‌کنیم:

تابع OneWire_Reset برای ریست کردن ارتباط OneWIre کاربرد دارد و تعریف آن به شکل زیر است:

دو تابع OneWire_WriteBit و OneWire_ReadBit برای نوشتن و خواندن یک بیت در ارتباط OneWire به کار می‌روند. این دو تابع را به این صورت می‌نویسیم:

در آخر، توابع OneWire_WriteByte و OneWire_ReadByte برای نوشتن و خواندن یک بایت در ارتباط OneWire، به ترتیب با استفاده از OneWire_WriteBit و OneWire_ReadBit تعریف می‌شوند؛

در این مرحله، کتابخانه موردنیاز برای ارتباط OneWire را ایجاد کرده‌ایم. اکنون باید با استفاده از این کتابخانه، یک کتابخانه برای سنسور دماسنج 18B20 بنویسیم. پس سه فایل دیگر به نام‌های DS18B20Config.h، ‌DS18B20.h و DS18B20.c، ایجاد می‌کنیم، ابتدا به سراغ فایل DS18B20Config.h می‌رویم، این فایل برای تنظیم برخی پارامترهای مربوط به سنسور ایجادشده است. کد زیر را در این فایل می‌نویسیم:

اکنون وارد فایل DS18B20.h می‌شویم. در این فایل ابتدا فایل‌های موردنیاز را اضافه می‌کنیم:

سپس کدهای هگز OneWire مربوط به سنسور و دیگر ثابت‌های موردنیاز را تعریف می‌نماییم:

درنهایت به اعلان توابع می‌پردازیم:

اکنون باید توابع اعلان‌شده را در فایل DS18B20.c تعریف کنیم. وارد این فایل می‌شویم و ابتدا DS18B20.h را اضافه و متغیرهای موردنیاز را تعریف می‌کنیم:

تعریف تابع اول یعنی DS18B20_Init که برای راه‌اندازی سنسور استفاده می‌شود، به‌صورت است:

در این تابع، تنها تابع راه‌اندازی ارتباط OneWire فراخوانی شده است. تابع دوم، برای ارسال دستور convert یا همین تبدیل دما به سنسور و بازگرداندن مقدار دما خوانده‌شده است. این تابع را به شکل زیر تعریف می‌کنیم:

اکنون کتابخانه سنسور DS18B20.c تکمیل‌شده است و می‌توانیم از آن استفاده کنیم، به این منظور به main.c می‌رویم و کتابخانه‌ها را اضافه می‌کنیم:

سپس در بدنه حلقه while(1) کد زیر را برای دریافت دما و چاپ آن می‌نویسیم:

 حالا کد را کامپایل می‌کنیم و آن را روی میکرو می‌ریزیم. در صورت انجام صحیح همه مراحل و اتصال صحیح مدار، می‌توانیم دما خوانده‌شده از محیط را در ترمینال سریال مشاهده کنیم:

 

لینک فایل این پروژه روی گیت‌هاب

1 نفر

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

توجه

سیاوش
سیاوش

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

دیدگاه ها

2 دیدگاه

  • احسان
    ۱۲ شهریور ۱۴۰۱

    ممنون بابت پشتکار و عزم محکمی که در آموزش LL بکار گرفتی. من به شخصه هر بار که در تلگرامم پستی از سیسوگ میاد، چک میکنم میبینم ادامه LL هست خیلی خوشحالتر میشم

    • Elahe Khabaz
      elahe
      ۱۹ شهریور ۱۴۰۱

      ممنون که حمایت میکنید دوست عزیز!
      سیسوگ رو به دوستانتون معرفی کنید?

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان 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 سال پیش
سیـــســـوگ

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