آموزش STM32 با توابع LL قسمت پانزدهم: راه‌اندازی واحد ADC و گرفتن اطلاعات توسط DMA

آموزش STM32 با توابع LL قسمت پانزدهم: راه‌اندازی واحد ADC و گرفتن اطلاعات توسط DMA

آموزش STM32 با توابع LL قسمت پانزدهم: راه‌اندازی واحد ADC و گرفتن اطلاعات توسط DMA
آموزش STM32 با توابع LL قسمت پانزدهم: راه‌اندازی واحد ADC و گرفتن اطلاعات توسط DMA

در بخش دهم، با واحد ADC آشنا شدیم. در این بخش، می‌خواهیم نحوه‌ی راه‌اندازی واحد ADC (بورد Blue Pill) را توضیح دهیم و به کمک واحد DMA از این واحد اطلاعات را دریافت و در حافظه ذخیره کنیم. واحد DMA یا Direct Memory Access همانطور که از نام آن مشخص است برای کنترل ارتباط با حافظه به کار می‌رود. مزیت استفاده از DMA این است که این واحد مستقل از پردازنده اصلی می‌تواند ورود و خروج اطلاعات بین وسایل جانبی و حافظه را کنترل کند، در نتیجه توان پردازشی پردازنده می‌تواند صرف انجام کارهای دیگر شود.

 

مرحله اول ایجاد پروژه در محیط STM32CubeMX

مثل قبل تنظیمات کلاک و دیباگ و انتخاب پین‌های ورودی و خروجی مورد نیاز انجام می‌شود. در صورت نیاز به ارسال اطلاعات دریافتی از ADC، تنظیم USART نیز باید به همان شکل قبل انجام شود. برای تنظیم ADC در منوی Analog، واحد ADC1 را انتخاب می‌کنیم. در بخش Mode کانال‌های مورد نیاز انتخاب می‌شوند (در اینجا کانال 0 و کانال 1 انتخاب شده‌اند). در بخش Configuration و از تب پارامترها Continuous Conversion Mode را در حالت Enable قرار می‌دهیم (زیرا میخواهیم به طور پیوسته مقدار ورودی در کانال‌های ADC را بخوانیم) در صورتی که مانند این مثال بیش از یک کانال انتخاب شده باشند باید Scan Conversion Mode نیز فعال کنیم. بدین منظور ابتدا Number Of Conversion را روی تعداد مورد نظر تنظیم می‌‎کنیم (در اینجا 2) اولویت تبدیل کانال‌ها و همچنین مدت زمان نمونه برداری را نیز طبق شکل زیر تنظیم می‌شوند:

نکته: تب بعدی که برای کار با واحد ADC، در صورت نیاز تنظیم می‌شود، NVIC یا تنظیم وقفه است. که در اینجا چون ما از DMA استفاده می‌کنیم، نیازی به تنظیم این بخش نیست.

سپس باید از تب DMA و کلید Add یک کانال از DMA را به ADC1 اختصاص دهیم. همچنین از بخش Mode در این تب، حالت انتقال اطلاعات را انتخاب می‌کنیم (در اینجا Circular انتخاب شده زیرا می‌خواهیم انتقال اطلاعات از ADC به طور پیوسته انجام شود).

بخش‌های Clock و Project Manager نیز مانند گذشته تنظیم می‌شوند.

 

مرحله دوم نوشتن کد پروژه

ابتدا باید کدهای مربوط به تنظیم و راه‌اندازی واحد ADC و DMA را بنویسیم. برای واحد ADC، به کدهای فعال‌سازی، کالیبره کردن، و استارت نرم‌افزاری تبدیل (و در صورت نیاز به فعال سازی وقفه) نیاز داریم:

 ثابت مربوط به اندازه حافظه مورد نیاز و همچنین متغیرهای مورد استفاده را به کد اضافه می‌کنیم:

و سپس کدهای مربوط به تنظیم و شروع به کار DMA را می‌نویسیم:

با نوشتن این کد، آدرس اولین خانه حافظه مورد نظر، و آدرس رجیستر مربوط به داده تبدیل شده توسط ADC1 تنظیم شده‌اند. همچنین مقدار اطلاعاتی که میخواهیم منتقل شوند(در اینجا 2) مشخص شده است.

اکنون می‌توانیم در بخش Debug و با تنظیم متغیر adc_read درwatch1 مشاهده کنیم که مقادیر دو کانال 0 و 1 ADC پس از تبدیل در دو خانه حافظه که تعریف کرده‌ایم نوشته می‌شوند:

   همچنین می‌توان این اطلاعات ذخیره شده در حافظه را از طریق واحد USART ارسال کرد، بدین منظور می‌توانیم کد زیر را در حلقه while(1) قرار دهیم:

   خروجی در ترمینال :

خطاهای احتمالی

  • دستورات مربوط به تنظیم فعال‌سازی ADC و DMA، باید حتما در تابع int main و بعد از فراخوانی SystemClock_Config نوشته شود. در غیر این صورت، برنامه دچار خطا خواهد شد.
  • دقت شود که واحد ADC، حتما در مود Circular تنظیم شود. در غیر این صورت پس از یک بار تبدیل و یک بار پر شدن حافظه، اجرا متوقف خواهد شد و اطلاعات دیگری دریافت و در حافظه ثبت نمی‌شود.
  • دو تابع تنظیم آدرس و تنظیم مقدار داده‌هایی که باید منتقل شوند برای واحد DMA باید به درستی تنظیم شوند(مشابه کد ارائه شده)، زیرا در غیر این صورت واحد DMA راه‌اندازی نمی‌شود.

   در بخش بعد با نحوه ارسال اطلاعات به وسیله USART و از طریق DMA آشنا خواهیم شد.

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

حمایت از سیاوش

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

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

توجه

سیاوش
سیاوش

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

دیدگاه ها

4 دیدگاه

  • محسن
    ۱ دی ۱۴۰۰

    سلام. از اموزش خوبتون ممنونم . اگه امکانش هست رابط i2c رو با توابع ll hal هم اموزش دهید ممنون

    • سیاوش ایرانپاک
      سیاوش
      ۴ دی ۱۴۰۰

      سلام دوست عزیز. مرسی از همراهی شما. رابط I2C در قسمت 25ام این آموزش گفته میشه که در آینده منتشرش می‌کنیم.

      • محسن
        ۴ دی ۱۴۰۰

        سلام . ممنون از وقتی که گذاشتید . سوالم اینه که آیا توابع وقفه ای که در فایل وقفه وجود دارند رو میشه در فایل main باز نویسی کرد که هر وقت وقفه ای رخ می دهد cpu تو همون فایل main به اون رسیدگی کنه و وارد فایل وقفه نشه . منظورم از فایل وقفه فایل
        Stm32f2xx_it.c هست

        ممنونم

        • سیاوش ایرانپاک
          سیاوش
          ۵ دی ۱۴۰۰

          سلام مجدد. خواهش میکنم. بله امکان این کار وجود داره، به شرط اینکه تابع مورد نظرتون رو توی فایل stm32f2xx_it.c حذف یا کامنت کنین و توی فایل main.c تعریفشون کنین.

پر بحث ترین ها

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

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

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

Zeus ‌ Zeus ‌
  • 4 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 9 ماه پیش

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

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

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

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

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

Zeus ‌ Zeus ‌
  • 3 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 1 سال پیش

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

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

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

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