GebraBit

مبدل آنالوگ به دیجیتال در میکروکنترلرهای STM32

متن سربرگ خود را وارد کنید

مبدل آنالوگ به دیجیتال در میکروکنترلرهای STM32

  1. خانه
  2. »
  3. میکروکنترلر
  4. »
  5. مبدل آنالوگ به دیجیتال در میکروکنترلرهای STM32

بررسی

اتصال قطعات آنالوگ به میکروکنترلرها بسیار رایج است. در عصر دیجیتال، هنوز دستگاه‌های زیادی وجود دارند که سیگنال‌های آنالوگ تولید می‌کنند: سنسورها، پتانسیومترها، مبدل‌ها و لوازم جانبی صوتی ، تنها نمونه‌هایی از دستگاه‌های آنالوگ هستند که ولتاژ متغیری را در یک بازه زمانی ثابت تولید می‌کنند. با خواندن این ولتاژ، می توانیم آن را به عددی مفید برای پردازش توسط سیستم عامل تبدیل کنیم. به عنوان مثال، TMP36 سنسور دمایی است که متناسب با دمای محیط ، ولتاژ متغیری تولید می‌کند.

همه میکروکنترلرهای STM32 حداقل یک مبدل آنالوگ به دیجیتال (ADC) ارائه می‌کنند، یک واحد جانبی که می‌تواند چندین ولتاژ ورودی را از طریق  I/O   های اختصاصی دریافت و آنها را به عدد تبدیل کند. ولتاژ ورودی با یک ولتاژ مشخص و ثابت که ولتاژ مرجع نام دارد ، مقایسه می شود. ولتاژ مرجع می تواند از VDDA گرفته شود یا در میکروکنترلرهایی که تعداد بالایی پین دارند، توسط یک ولتاژ مرجع خارجی تامین شود (این میکروکنترلر ها یک پایه اختصاصی به نام VREF+ دارند). اکثر میکروکنترلر های STM32 دارای یک ADC 12 بیتی هستند. (برخی از نمونه های سری STM32F3 دارای ADC   16 بیتی هستند.)

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

قبل از اینکه ویژگی‌های ارائه شده ADC در میکروکنترلر های STM32 و کتابخانه CubeHAL مربوطه را تجزیه و تحلیل کنیم، بهتر است نگاهی سریع به نحوه عملکرد این واحد جانبی داشته باشیم.

مقدمه ای بر SAR ADC

تقریباً در همه میکروکنترلرهای STM32، ADC به عنوان یک رجیستر تقریب متوالی 12 بیتی successive Approximation Register ADC پیاده سازی می شود. با توجه به پکیج مورد استفاده، می تواند چندین کانال  ورودی مالتی پلکس شده (معمولا بیش از ده کانال در اکثر MCU های STM32) داشته باشد ، که امکان اندازه گیری انواع سیگنال ها از منابع خارجی را فراهم می کند. علاوه بر این، برخی از کانال های داخلی نیز در دسترس هستند: یک کانال برای سنسور دمای داخلی (VSENSE)، یک کانال برای ولتاژ مرجع داخلی (VREF INT)، یکی برای نظارت بر منبع تغذیه VBAT خارجی و یک کانال برای نظارت بر ولتاژ  LCD  آن دسته از میکروهایی که کنترل کننده monochrome passive LCD  را ارائه می دهند. (به عنوان مثال STM32L053 یکی از این موارد است).واحدهای ADC  در سری STM32F3 و اکثر میکرو های STM32L4 قادر به تبدیل ولتاژ های ورودی به صورت دیفرانسیلی هستند. جدول زیر تعداد دقیق  واحدهای جانبی ADC و تعداد کانال ورودی برای برد های Nucleo را نشان داده است:

تنظیمات پروژه تایمر

در این قسمت قصد داریم 2 تایمر را به ترتیب با 250 میلی ثانیه و 1 ثانیه راه اندازی کرده و با هر کدام یک متغیر را بشماریم. راه اندازی تایمرهای دیگر نیز به همین روال است. برای این منظور مطابق شکل زیر  در قسمت تایمرها و بخش TIM1، منبع کلاک به عنوان کلاک داخلی تنظیم شده است. در قسمت تنظیمات پارامتر، Prescaler را روی 7999 و Counter Period را روی 249 قرار می دهیم. سپس از قسمت تنظیمات NVIC، وقفه آپدیت TIM1 را فعال می کنیم.

برای فعال سازی TIM6 آیکون مربوطه را انتخاب می کنیم. در قسمت تنظیمات پارامتر، Prescaler را روی 7999 و Counter Period را روی 999 قرار می دهیم. سپس از قسمت تنظیمات NVIC، وقفه سراسری TIM6 را همانطور که در شکل زیر نشان داده شده است فعال می کنیم.

همانطور که در شکل زیر نشان داده شده است، فرکانس های APB1 (TIM6) و تایمر APB2 (TIM1) 8 مگاهرتز انتخاب شده اند. برای تولید وقفه های TIM1 در هر 250 میلی ثانیه، مقدار Prescaler برابر با 7999 را انتخاب کنید تا فرکانس 8 مگاهرتز TIM1 را به 8000 (از 0 تا 7999) تقسیم کنید تا فرکانس 1 کیلوهرتز با دوره 1 میلی ثانیه تولید شود. برای Counter Period ، 249 (از 0 تا 249) را برای تولید 250 میلی ثانیه انتخاب کنید. به طور مشابه، برای تولید وقفه های TIM6 در هر 1 ثانیه، مقدار Prescaler را برابر با 7999 انتخاب کنید تا فرکانس 8 مگاهرتز TIM6 را به 8000 (از 0 تا 7999) تقسیم کنید تا فرکانس 1 کیلوهرتز با دوره 1 میلی ثانیه تولید شود. همچنین، برای Counter Period، 999 (از 0 تا 999) را برای تولید 1s انتخاب کنید. همانطور که در شکل زیر نشان داده شده است، برای تعیین اولویت وقفه از قسمت پیکربندی NVIC، 1 را برای TIM1 و 2 را برای TIM6 Preemption Priority انتخاب کنید.

پس از وارد کردن تنظیمات بالا، از تب مدیریت پروژه ، کد پروژه را تولید کنید:

پس از ایجاد پروژه و باز کردن فایل مربوطه بدنه تایمر های 1 و 6  در داخل فایل stm32f1xx_hal_tim.c هستند که در شکل زیر نشان داده شده است:

تنظیمات HAL_ADC Module

 پس از معرفی مختصر مهم ترین ویژگی های ارائه شده توسط واحد جانبی ADC در میکروکنترلرهای STM32، زمان مناسبی است که به API های CubeHAL مربوطه بپردازیم.

برای انجام تنظیمات واحد جانبی ADC، HAL ساختار ADC_HandleTypeDef را تعریف می کند که به صورت زیر تعریف می شود:

typedef struct {

ADC_TypeDef *Instance; /* Pointer to ADC descriptor */

ADC_InitTypeDef Init; /* ADC initialization parameters */

 __IO uint32_t NbrOfCurrentConversionRank; /* ADC number of current conversion rank */

DMA_HandleTypeDef *DMA_Handle; /* Pointer to the DMA Handler */

HAL_LockTypeDef Lock; /* ADC locking object */

__IO uint32_t State; /* ADC communication state */

 __IO uint32_t ErrorCode; /* Error code */

} ADC_HandleTypeDef;

مهم ترین بخش های این ساختار :

  • Instance: اشاره گر به توصیف کننده ADC ایست که می خواهیم از آن استفاده کنیم. به عنوان مثال، ADC1 توصیف کننده اولین واحد جانبی ADC است.
  • Init: نمونه ای از ساختار ADC_InitTypeDef است که برای پیکربندی ADC استفاده می شود.
  • NbrOfCurrentConversionRank: مربوط به کانال i-امین فعلی (rank) در یک گروه تبدیل معمولی است.
  • DMA_Handle: اشاره گر به کنترل کننده DMA است که برای انجام تبدیل A/D در حالت DMA پیکربندی شده است. به طور خودکار توسط ماکرو __HAL_LINKDMA() پیکربندی می شود.

تنظیمات ADC با استفاده از نمونه ای از ساختار ADC_InitTypeDef انجام می شود که به صورت زیر تعریف می شود:

این مقاله را با دوستانتان به اشتراک بگذارید!

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

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

Shopping cart
Start typing to see posts you are looking for.

Sign in

No account yet?