آموزش STM32 با توابع LL, توصیه شده

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

ارتباط 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) کد زیر را برای دریافت دما و چاپ آن می‌نویسیم:

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

 

نتیجه دما در ترمینال

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

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

5 دیدگاه در “ارتباط OneWire در STM32 | قسمت 35 آموزش STM32 توابع LL

  1. Avatar for بهنام بهنام گفت:

    سلام
    در برنامه onewire.c در بخش OneWire_Input با این پیغام خطا مواجه میشم:
    ‘use of undeclared identifier ‘LL_GPIO_InitTypeDef
    و همین خطا برای GPIO_InitStruct هم تکرار شده
    ممنون میشم راهنمایی بفرمایید

    1. Avatar photo سیاوش گفت:

      سلام دوست عزیز.
      مشکلی که باهاش مواجه شدین ناشی از include نشدن فایل‌های .h مورد نیاز برنامه‌است. توی چند خط ابتدایی فایل onewire.h این فایل‌ها به برنامه اضافه شدن. باید از تنظیمات ide مسیرهای include رو به پروژه معرفی بکنید و مطمئین بشین که به “stm32f1xx_ll_gpio.h” دسترسی وجود داره.

      1. Avatar for بهنام بهنام گفت:

        ممنون از راهنمایی شما
        تا جایی که بلد بودم چک کردم و ظاهراً همه چیز سر جاش قرار داره
        از uvision5 استفاده میکنم لطف میکنید اگر توضیح بیشتری راجع به کاری که باید انجام بشه بدین

  2. Avatar for احسان احسان گفت:

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

    1. Avatar for elahe elahe گفت:

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *