STM32F1

آموزش میکروکنترلر STM32 قسمت سوم

سومین قسمت از آموزش STM32 رو با نام و یاد خدا شروع میکنیم

مطالب این قسمت از آموزش
ADC چیست؟
در ابتدا به این میپردازیم که ADC چیه و به چه کارمون میاد و با این واحد از میکرو کنترلر چه کار هایی میتونیم انجام بدیم.
شرح توابع ADC
بعد از درست کردن پروژه در CUBEMX با توابع ACD آشنا میشیم. پروژه ای درست میکنیم که مقدار ولتاژ ورودی پتانسیومتر روی برد آموزشی رو بر روی LCD کاراکتری نمایش بده.

ویدیو تست پروژه
ویدیو تست پروژه رو با هم میبینیم.
تمرینی برای شما
با توجه به موضوعات گفته شده یه تمرین مطرح میکنم که به یادگیری شما کمک میکنه. البته هنوز کسی تمرین جلسه قبل رو برام ارسال نکرده /:
adc چیست؟

ADC یا Analog to Digital Conversion  به معنی مبدل آنالوگ به دیجیتال هست. در واقع برای اینکه بتونیم مقادیر آنالوگ رو به دیجیتال تبدیل کنیم و توی مداراتمون به کار ببریم نیاز به این واحد از میکرو کنترلر داریم.
با توجه به جدول بالا چند عامل موثر هستن توی تبدیل ما، که اونها رو پایین میتونید مشاهده کنید

  1. سرعت نمونه برداری که توی تصویر بالا با خط ها عمودی نشون داده شده و هرچه این سرعت بیشتر باشه شباهت مقدار خوانده شده ما به مقدار ورودی نزدیک تر میشه.
  2. وضوح که با توجه چند بیتی بودن واحد adc به ما مقدار مشخصی به جای ولتاژ میده. برای مثال در میکروکنترلر ما adc به صورت 12 بیتی هست یعنی به ما مقدار 0 تا 4095 رو برمیگردونه به ازای ولتاژ ورودی.
  3. ولتاژ مرجع به ولتاژی گفته میشه که میکروکنترلر ولتاژ ورودی که ما بهش میدیم رو با اون مقایسه میکنه و اون مقدار میتونه تا 3.3 ولت باشه و با توجه به اون مقدار ولتاژی که ما به پین adc خودمون میدیم نباید از اون مقدار تجاوز بکنه برای مثال من از 3.3 استفاده میکنم.
    با توجه به ولتاژ ورودی میکروی ما یه مقدار از 0 تا 4095 برمیگردونه یعنی اگه ولتاژ رفرنس 3.3 باشه و ما 3.3 به پین adc خودمون ولتاژ بدیم مقدار برگشتی adc برابر 4065 هست.
    حالا ما میتونیم با توجه به فرمول بالا مقدار برگشتی میکرو رو به ولتاژ ورودی خودمون تبددیل کنیم.
    خب اولین مبحث رو ببندیم با این موضوع که اصلا adc به چه کار ما میاد:
    حتما دوستانی که قبلا با میکروکنترلر  های avr کار کردن میدونن سنسور هایی مختلفی مثل سنسور دما lm35 خروجی آنالوگ دارن که نمیشه همینطوری وصلش کرد به میکرو پس  باید با واحد adc این کار رو انجام داد و مقدار دما رو خوند. البته من در بخش پایانی که تمرین میخوام بهتون بدم بیشتر به سنسور دما میپردازم.

    شرح توابع ADC؟

    اول میریم سراغ تنظیمات CUBE MX

با توجه به ویدیو بالا میریم سراغ شرح تواع به کار برده شده؛ منتها در ابتدا پیشنهاد میکنم اگه راه اندازی نمایشگر کاراکتری رو بلد نیستید حتما یه سری به این آموزش تو بخش کتابخانه های سایت بزنید.
من توابع به کار بررده شده رو اول برراتون قرار میدم

سوال : حالا این کد ها چیکار میکنه؟

جواب  : برتون خط به خط تابع به تابع توضیح میدم.(چون قبلا برای راه اندازی نمایشگر کاراکتری آموزش درست کردیم دیگه نیازی نیست که نحوه راه اندازی اون و توابعش رو توضیح بدم)

hadc1.Init.NbrOfConversion=9

در همین ابتدای کار بزارید تکلیف خودمون رو با عبارت hadc1 مشخص کنیم. hadc1 یک استراکچر هست که وقتی ما میخوایم از adc 1 استفاده کنیم و اون رو پیکر بندی کنیم باید از اون استفاده کنیم. این استراکچر رو میتونید در اوایل برنامه به این صورت ببینید

پس به یاد داشته با شید هر وقت نیاز به تنظیم، تغییر و … خاصی برای adc1 بود از این هندر باید استفاده کنیم. حالا در ابتدای این کد هم ما عبارت hadc1 رو میبینیم؛ ابتدا adc1 رو با این استراکت انتخاب میکنیم و در نهایت بیت مورد نظرمون رو انتخاب مبکنیم. چون بیت های adc  از 1 شروع میشه و ما از بیت 8 کانال adc1 استفاده کردیم باید اینجا در مقابل عدد 9 رو قرار بدیم برای مثال اگر از بیت 0 هم استفاه بکنیم باید عدد 1 رو قرار بدیم.

HAL_ADC_Init(&hadc1)
خب در ابتدا بیت مورد نظر adc یک رو انتخاب کردیم حالا باید با این تابع شروع کنیم به اعمال تغییرات خودمون.

HAL_ADC_Start(&hadc1)
با این تابع استارت میکنیم adc  مورد نظرمون رو که توی پرانتز استراکتش رو نوشتیم.

if(HAL_ADC_PollForConversion(&hadc1,10)== HAL_OK)

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

این تابع دو تا ورودی میگیره که اولی استراکت adc مورد نظرمون و دومی مقدار تاخیری هست که برای دریافت جواب صرف میشه و اگه تبدیل ما انجام بشه مقدار این تابع با hal_ok برابر میشه بنا ر این ما این شرط رو برای برقرار بودن تبدیل نوشتیم.

داخل این شرط ما تبدیلات و خوندن مقدار adc رو انجام میدیم که در ادامه بهش میپردازیم.

HAL_ADC_GetValue(&hadc1)
این تابع به ما مقدار تبدیل شده بیت مورد نظر از کانال خودمون رو بر میگردونه و میتونیم اون رو تو یه متغییر بریزیم این مقدار یه عدد از 0 تا 4095 با توجه به مقدار ورودی میتونه باشه. من این مقدار رو توی یه متغییر از نوع float (اعشاری) اعشاری ریختم؛ چون قراره تبدیلاتی روی اون انجام بشه که این مقدار به عدد اعشاری تبدیل میشه پس باید این متغییر اعشاری در نظر گرفته بشه.
“اسم متغییر من val بود”

تبدیلات
همونظور که بهتون گفتم مقدار برگشتی تابع بالا عددی بین 0 تا 4095 هست و با توجه به فرمول ابتدای آموزش باید به شکل زیر در کد تبدیل رو انجام بدید.

در ورودی اول تابع متغیری که تبدیل توش میره رو مینویسیم در ورودی دوم میگیم عبارت v= رو بنویسه و متغییر فلوت ما رو تا 1 و دو دهم اعشار تبدیل کنه و در ورودی آخر متغیری که مقدار فلوت ما توش قرار داره رو مینویسیم و در انتها با قرار دادن متغیر اعشاری در ورودی تابع نمایشگر کار رو به پایان میرسونیم.
ویدیو تست پروژه

اگه جایی رو تپق زدم عذر میخوام.
تمرین
به عنوان تمرین قراره مقدار دما رو توی نمایشگر نمایش بدبد. البته این تمرن هم مثل تمارین  دیگه بهش بها داده نمیشه. اما صرفا به عنوان یه چالش میتونید  بهش نگاه کنید.
همونظور که میدونید سنسور lm35 یه سنسور آنالوگه و به ازای هر درجه از دما 10 میلی ولت به شما خروجی میده.
شما آموزش بدست آوردن ولتاژ رو حالا بلدید فقط با یه تغییر کوچیک میتونید دماسنج خودتونو با stm32 درست کنید.

ممنون از اینکه با ما همراه بودید. برای دانلود فایل کتابخونه و نمونه پروژه باید وارد کانالمون توی تلگرام بشید. آموزش های بیشتر رو توی منو سایت میتونید پیدا کنید و سوالاتتون رو توی گروه کدنیک مطرح کنید.

 

 

برچسب ها
نمایش بیشتر

sahandrjb

دانشجوی الکترونیک دانشگاه چمران رشت، مدیر و بنیانگذار مجموعه کدنیک. تجربه تدریس برنامه نویسی برای میکروکنترلر ها مشتاق برای یادگیری، آماده برای تدریس.

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

دکمه بازگشت به بالا
بستن
بستن