در جلسه گذشته، به راهاندازی اینتراپت خارجی(EXTI) در میکروکنترلر STM32f103 پرداختیم و یک کد ساده برای راه اندازی آن به وسیلهی کتابخانه HAL نوشتیم. در این جلسه قصد داریم تا به مبحث بسیار مهم و پرکاربرد مبدل آنالوگ به دیجیتال میکروکنترلر(یا همان ADC) بپردازیم. با ما همراه باشید…
مبدل آنالوگ به دیجیتال چیست؟
ابتدا قبل از شروع پروژه لازم است تا با مبدل آنالوگ به دیجیتال میکروکنترلر و کاربرد آن آشنا شویم.
اگرچه دنیای امروژه به سمت دیجیتال شدن پیش میرود اما هنوز آنالوگ کاربرد خود را از دست نداده است و بسیاری از موارد استفاده میگردد. در نتیجه؛ از آنجا که میکروکنترلرها به صورت دیجیتال پردازش می کنند، لازم است واحدی در انها تعبیه شود تا دنیای دیجتال را به دنیای انالوگ متصل کند و این مهم بر عهده ADC است.
امروزه در میکروکنترلرها مبدل آنالوگ به دیجیتال(ADC) قابلیت مهمی به شمار میآید. زیرا در بسیاری از کابردها نظیر خواندن مقادیر سنسورها، اندازه گیری ولتاژ و امثالهم استفاده می گردد تا مقادیر انالوگ آنها را به صورت دیجیتال برای میکروکنترلر فراهم نموده تا میکروکنترلر به کمک فرامین خود بتواند آنها را پردازش کند.
ویژگیهای مبدل آنالوگ به دیجیتال STM32f103
با استفاده از رفرنس منوال (Reference Manual) میکروی موردنظر میتوان به ویژگی های آن میکرو پی برد. با استفاده از این فایل یا جلسه اول آموزش میکروکنترلرSTM32 به ویژگی های اشاره شده در زیر در رابطه با واحد آنالوگ به دیجیتال میکروکنترلر می رسیم:
در این Reference Manual بیان شده که این میکروکنترلر دارای ADC 12 بیت ای میباشد که این تعداد بر رزولوشن مقدار خواندن تاثیر گذار است. و همچنین دارای یک مالتی پلاکس ۱۸ کاناله است که ۱۶ کانال آن برای ارتباط با محیط خارج و ۲ کانال آن برای محیط داخلی( سنسور دمای داخلی و Vrefint) میباشد.
همچنین برای تنظیم کلاک این واحد باید به PCLK2 مراجعه کرده( در نرم افزار CubeMX) و آن را طوری تنظیم میکنیم تا ، فرکانس کاری این واحد پس از عبور از تقسیم کننده ها ، حداکثر ۱۴ مگاهرتز شود.
برای مطالعه بیشتر باقی ویژگی ها می توانید به بخش ADC این فایل(Reference Manual) و اپلیکیشن نوت مربوط به این قسمت(App. note) مراجعه کنید.
ساخت پروژه در نرمافزار CubeMX
در گام اول با استفاده از نرم افزار CubeMX پروژه را ساخته و تنظیمات آنرا تا بخش کلاک به مانند جلسه ۲ انجام میدهیم. در ادامه در بخش تنظیم پایه های میکروکنترلر مانند تصاویر تنظیم کرده و ورودی PA0 را به عنوان ورودی آنالوگ ADC1 و پایه PB15 را تحت نام LED1 به عنوان خروجی تعریف میکنیم.
و تنظیمات آن مانند شکل زیر تنظیم می گردد.
در قسمت اول نوع ADC را انتخاب می کنیم که می تواند در چندین حالت کار کند. ما برای این پروژه از همان حالت پیش فرض استفاده می کند که به صورت عموم استفاده می گردد.
در اولین قسمت مشخص شده(continuous conversion mode) گزینه فعال را می زنیم. این قسمت برای به طور پیوسته کار کردن واحد آنالوگ به دیجیتال می باشد.
در ادامه در بخش regular تعداد conversion را برابر ۱ قرار می دهیم( چون از یک پایه برای خواندن ADC استفاده می کنیم) و آن را بر روی کانال ۰ (یا هر کانال دیگر) قرار می دهیم و تعداد sample time آن را که در ادامه نحوه محاسبه اش بیان خواهد شد، برابر ۱۳٫۵ سیکل قرار داده شده است و این تعداد برای سوییچ کردن میان دو کانال مختلف ADC است.
با تنظیمات فوق، واحد ADC را در حالت single و به صورت پیوسته برای پایه PA0 فعال کرده ایم.
حال نحوه محاسبه مقادیر فوق بیان خواهد شد.
مطابق تصویر بالا که از Reference Manual این میکرو آورده شده، مدت زمانی که َadc بین دوکانال سوییچ می کند مطابق تصویر فوق است. یعنی در تنظیمات cubemx از آنجا که ما مدت زمان sample time را برابر ۱۳٫۵ دوره درنظر گرفتیم، مدت زمان خواندن هر داده ی adc مطابق فرمول بالا خواهد بود.
Tconv=13.5+12.5=26 cycles
۱۴MHz=کلاک ADC
در نتیجه
Tconv= 26*1/14M=26/14000000=1.85 usec
یعنی برای ۱٫۸۵ میکروثانیه طول خواهد کشید تا از کانال خوانده شده به کانال دیگر برای خواندن برود.
تا به اینجا تنظیمات لازم پروژه در محیط نرمافزار CubeMX انجام شده و میتوان با تولید کد توسط این نرمافزار و مراجعه به نرمافزار KEIL ادامه کد نویسی پروژه را انجام داد.
ادامه پروژه در نرمافزار KEIL
فایل پروژه برای نرمافزار KEIL را از مسیر انتخاب شده و واقع در پوشه MDK-ARM پروژه انتخاب کردن و باز میکنیم.
در بخش فانکشن در نوار سمت چپ نرمافزار زیر گروه adc را باز کرده و توابع مربوط به این کتابخانه را در آن مشاهده می کنید و توضیحات هر تابع در کد هر قسمت موجود است. منتها در ادامه هر بخش از استفاده از واحد ADC توضیح داده می شود.
سه قطعه کد ای که در این قسمت از پروژه از انها استفاده می شود به شرح زیر است:
HAL_ADC_Start(ADC_HandleTypeDef* hadc)
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
قطعه کد اول جهت فعال کردن واحد ADC به کار می رود و با فعال کردن آن تا زمانی که از کد HAL_ADC_Stop(ADC_HandleTypeDef* hadc) استفاده نشود نیازی به استفاده دوباره آن نخواهد بود.
تابع دوم برای گرفتن مقدار ADC است و با ریختن اطلاعات آن در یک متغیر uint32_t که یک متغیر اینتجر(عددی) و ۳۲ بیتی بدون علامت است( برای اطلاعات بیشتر به انواع متغیرها در زبان C مراجعه کنید) ان را در آن متغیر ذخیره می کتد.
تابع سوم برای این است که در صورتی که واحد ADC به صورت کامل عمل تبدیل دیجیتال به آنالوگ را انجام نداده باشد، میکروکنترلر منتظر می ماند تا این عمل صورت گیرد.
حال با نوشتن کد زیر برنامه را کامل میکنیم
و متغیر adcval نیز در بالا به صورت گفته شده(uint32_t) تعریف شده است.
و همانطور که گفته شد با استفاده از کد موجود در خط ۹۴ واحد آنالولوگ به دیجیتال(ADC) را فعال کرده،
و در خط ۱۰۵ با ایجاد شرط کامل بودن تبدیل آنالوگ به دیجیتال، به خط ۱۰۶ رفته و با خواندن مقدار آن و دادن آن به متغیر adcval کار خواندن را تمام می کنیم. و از انجا که این تابع به صورت continuous conversion mode می باشد، دوباره بعد از تکرار در حلقه while عدد جدیدی در متغیر ذخیره می گردد. در صورتی که این واحد به صورت continuous conversion mode نبود و این قسمت غیر فعال می بود، با تکرار دوباره کد در حلقه while عمل خاصی صورت نمی پذیرف و عدد خوانده شده همان عدد قبلی می بود.
در جلسه بعدی به آموزش بخش دیگری از واحد آنالوگ به دیجیتال میکروکنترلر (ADC) میپردازیم.
نویسنده: اشکان راکی