آموزش STM32 با توابع LL قسمت بیست و چهارم: ADC با سرعت دو برابر!

آموزش STM32 با توابع LL قسمت بیست و چهارم: ADC با سرعت دو برابر!

آموزش STM32 با توابع LL قسمت بیست و چهارم: ADC با سرعت دو برابر!
آموزش STM32 با توابع LL قسمت بیست و چهارم: ADC با سرعت دو برابر!

در بخش دهم، با واحد ADC آشنا شدیم و در بخش پانزدهم نحوه دریافت اطلاعات از ADC توسط DMA را دیدیم. در این بخش می‌خواهیم کاری کنم که واحد ADC با سرعت بیشتری نمونه‌برداری کند. میکروکنترلر STM32F103C8 دارای دو واحد ADC است که حداکثر سرعت نمونه‌برداری هرکدام از آن‌ها 1 Ms/s یا یک‌میلیون نمونه در ثانیه است. ما می‌توانیم با به‌کار بردن همزمان این دو ADC دو برابر یعنی 2 Ms/s دست‌یابیم. کاربرد این سرعت نمونه‌برداری برای سیگنال‌هایی است که فرکانس آن‌ها بیش از  500KHz است. در این حالت با توجه به نرخ نایکویست، فرکانس نمونه‌برداری که باید حداقل دو برابر فرکانس سیگنال باشد، بیش از 1 Ms/s می‌شود که با یک ADC امکان‌پذیر نیست.

در شکل بالا می‌بینیم که در صورت تنظیم واحدهای ADC در حالت Dual، این امکان وجود دارد که ADC با سرعت دو برابر روی یک کانال داشته باشیم.

 

ایجاد پروژه

بدین منظور باید در هنگام ایجاد پروژه بعد از تنظیم کلاک و دیباگ، کانال 0 مربوط به هر دو واحد ADC1 و ADC2 را فعال کنیم و سپس ADC1 را روی حالت Dual fast interleaved mode only تنظیم کنیم. بدین طریق ADC2 نیز در همین حالت قرار می‌گیرد. همچنین باید برای هر دو واحد ADC حالت Continuous Conversion mode را فعال کنیم و زمان نمونه‌برداری را 1.5 سیکل قرار دهیم. در آخر DMA را برای واحد ADC1 فعال می‌کنیم:

 

سپس به سراغ تایمر1 می‌رویم و کانال 1 آن را روی حالت PWM تنظیم می‌کنیم. می‌خواهیم از این شکل موج برای آزمایش سرعت نمونه‌برداری ADC استفاده کنیم. با تنظیمات زیر فرکانس شکل موج تولید شده 900KHz خواهد بود.

تایمر 2 را نیز برای شمارش تعداد پالس کلاکی‌ که انجام نمونه‌گیری طول خواهد کشید، فعال می‌کنیم:

در آخر واحد USART3 را مشابه قبل برای فرستادن اطلاعات و چک کردن عملکرد پروژه فعال می‌کنیم. کلاک میکرو را روی 72MHz تنظیم کرده و کد پروژه را مانند قبل ایجاد می‌کنیم.

 

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

در ابتدای کد باید کتابخانه stdio را برای نمایش اطلاعات توسط printf اضافه کنیم و تابع‌هایی که از قبل تعریف کرده بودیم را به برنامه اضافه کنیم و این بار عمل ریتارگت را با USART3 انجام دهیم. مرحله مربوط به Project, Manage, Run-Time Environment را نیز باید در اینجا تکرار کنیم:

بافر حافظه مورد نیاز را تعریف می‌کنیم:

اکنون تنظیم و راه‌اندازی ADC ها و DMA را انجام می‌دهیم:

در کد بالا تنها آدرس رجیستر ADC1 به‌عنوان مبدأ اطلاعات تعیین‌شده است، زیرا با تنظیم ADC ها برای کار در حالت Dual مقدار تبدیل‌شده سپس باید تایمر 1 را که در حالت PWM تنظیم کرده بودیم، راه‌اندازی کنیم و همچنین تایمر 2 را برای شمارش فعال کنیم:

حالا در فایل stm32f1xx_it.c و در تابع وقفه DMA1 کد زیر را برای چاپ تعداد پالس‌های زمان تبدیل می‌نویسیم (در این فایل نیز باید stdio.h را اضافه کنیم) :

نتیجه در ترمینال سریال قابل مشاهده است؛

 

 

اکنون برای مقایسه نحوه عملکرد دو واحد ADC به‌صورت همزمان (با سرعت دو برابر) و یک ADC، به بخش دیباگ می‌رویم و بافر حافظه را به Watch1 اضافه می‌کنیم و سپس برنامه را اجرا می‌کنیم.

 

 

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

 

 

می‌بینیم که نتیجه تبدیل ADC های 1 و 2 در 16 کم‌ارزش و 16 بیت پرارزش هر خانه از بافر قرارگرفته‌اند. برای حالتی که تنها یک ADC عمل نمونه‌برداری و تبدیل را انجام دهد، می‌توانیم از Cube MX یکی از واحدهای ADC را غیرفعال کنیم یا اینکه در کد برنامه، قسمت مربوط به فعال‌سازی ADC2 را کامنت کنیم. پس از اجرای کد در دیباگ داریم:

 

 

   همان‌طور که می‌بینیم در این حالت نصف حالت قبلی نمونه‌برداری انجام‌شده است.

   برای رسم شکل موج اطلاعات دریافت شده، می‌توانیم، کدهای printf قبلی را کامنت کنیم و کد زیر را برای حالت Dual به main.c اضافه کنیم:

برای دیدن شکل موج می‌توانیم از ابزار Serial Plotter در نرم‌افزار Arduino IDE استفاده کنیم؛

 

در بخش بعدی در مورد ارتباط I2C صحبت خواهیم کرد.

 

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

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

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

0 نفر

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

توجه

سیاوش
سیاوش

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

دیدگاه ها

0 دیدگاه

پر بحث ترین ها

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

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