ARM, STM, آموزش, آموزش STM32, آموزش STM32 با توابع LL, توصیه شده, مقاله های سیسوگ

آموزش STM32 با توابع LL قسمت 24: ADC با سرعت دو برابر

در قسمت قبلی آموزش ساخت تایمر 32 و 64 بیتی را فرا گرفتید و در بخش دهم، با واحد 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 صحبت خواهیم کرد.

 

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

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

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

بازگشت به لیست

نوشته های مشابه

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

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