ADC مخفف Analog to Digital Converter مبدل سیگنال های آنالوگ است. مثل کم و زیاد کردن شدت نور محیط، کم و زیاد شدن صدای یک بلندگو و هر آنچه که با سیگنال های آنالوگ در ارتباط است. شاید اولین موردی که به ذهنتان خطور کند، این است که رزبری پای در تمامی نسخه های ارائه شده اش، فاقد ADC بوده و است! بله بود! رزبری پای پیکو دارای ۴ پایه ADC است که برای سیگنال های آنالوگ و ارتباط سخت افزاری به برد جدید بنیاد رزبری پای اضافه شده است. در بخش چهارم از سری آموزش های رزبری پای پیکو به معرفی ADC در Pico خواهیم پرداخت. در ادامه با مرجع تخصصی میکروپایتون با رزبری پای به زبان فارسی، دیجی اسپارک همراه باشید.
رابط آنالوگ به دیجیتال ADC
در الکترونیک مبدل آنالوگ به دیجیتال برای تبدیل سیگنال های آنالوگی استفاده میشود. مثل کم و زیاد کردن صدای میکروفن و یا کاهش و افزایش شدت نور که از طریق سیگنال های آنالوگ قابل تغییر است. از ADC در Pico برای تبدیل سیگنال آنالوگ مانند ولتاژ به یک فرم دیجیتالی تا توسط میکروکنترلر قابل خواندن و پردازش باشد. بسیاری از میکروکنترلرها دارای ADC داخلی هستند و همچنین برای راحتی استفاده ماژول های آماده با قابلیت اتصال چندین ADC تولید و طراحی شده است. تا اینجا متوجه شدیم مبدل ADC، یک مبدل دیتا است که با رمزگذاری سیگنال آنالوگ در کد باینری، به بردهای امبدد مثل رزبری پای، آردوینو اجازه می دهد تا با دنیای واقعی ارتباط برقرار کنند. در دنیای واقعی ، سیگنال های آنالوگ به طور مداوم مقادیری را تغییر می دهند که از منابع و سنسورهای مختلفی گرفته می شوند که می توانند صدا ، نور ، دما یا حرکت را اندازه گیری کنند و بسیاری از سیستم های دیجیتال با اندازه گیری سیگنال های آنالوگ از این مبدل ها با محیط خود در ارتباط هستند. در حالی که سیگنال های آنالوگ به صورت مداوم دیتا را تغییر میدهند و از سمتی دیگر بردهای دیجیتال با سیگنال باینری کار می کنند که فقط دارای دو حالت گسسته هستند ، منطق “۱” (HIGH) یا منطق “۰” (LOW). یا یک یا صفر اولین نکته ای که همیشه برای یادگیری از آن استفاده میشود. دنیای دیجیتال فقط عدد ۱ یعنی فعال و عدد صفر یعنی غیرفعال را درک میکند. اما در دنیای آنالوگ بین ۰ و ۱ هزاران عدد وجود دارد که توسط سیگنال های آنالوگ قابل تفکیک است.
اکثر میکروکنترلرها دارای ADC داخلی هستند و همچنین قابلیت اتصال ADC خارجی به میکروکنترلر هم از طریق پروتکل ارتباطی I2C به میکروکنترلرها فراهم شده است. معمولا مبدل های ADC بین ۱۰ تا ۱۲ بیتی هستند که بین ۱۰۲۴ تا ۴۰۹۶ سطح متفاوتی دارند.
منظور از ADC در الکترونیک چیست؟
ADC مخفف Analog-to-Digital Converter است و به ترجمه فارسی “تبدیلکننده آنالوگ به دیجیتال” است. ADC یک بخش از مدار الکترونیکی است که وظیفه تبدیل سیگنالهای آنالوگ به فرمت دیجیتال (اعداد واحد) را دارد.در دنیای الکترونیک، سیگنالهای آنالوگ به صورت متغیر در طول زمان تغییر میکنند و به صورت مداوم اطلاعات آنالوگ را انتقال میدهند. اما بسیاری از سیستمها و دستگاهها نیاز به پردازش و تحلیل این اطلاعات به صورت دیجیتال دارند. به عنوان مثال، کامپیوترها، میکروکنترلرها و بسیاری از تجهیزات الکترونیکی دیگر به دادههای دیجیتال نیاز دارند تا بتوانند آنها را پردازش و کنترل کنند.در اینجا وظیفه ADC به کار میآید. ADC ورودیهای آنالوگ را به شکل دیجیتال تبدیل میکند. این تبدیل عملیاتی متداول در سنسورها، مبدلهای صوتی، دستگاههای تست و اندازهگیری، و بسیاری از بخشهای الکترونیکی دیگر وجود دارد.ADC عملیات تبدیل مقادیر آنالوگ به اعداد دیجیتال را با استفاده از مفاهیم مانند نرخ نمونهبرداری (Sampling Rate)، عمق بیتی (Bit Depth)، و دامنه ورودی (Input Range) انجام میدهد. مقدار خروجی از ADC به صورت دیجیتال بوده و میتواند به عنوان ورودی به میکروکنترلرها، FPGAها، کامپیوترها، یا سایر دستگاههای الکترونیکی مورد استفاده قرار گیرد.
پایه های ADC رزبری پای پیکو
تراشه RP2040 در مجموع دارای ۵ کانال ADC است که چهار پایه از آن ها به صورت ۱۲ بیت SAR است که به ترتیب GP26, GP27, GP28 و GP29 است. سیگنال ورودی برای ADC0,ADC1,ADC2, ADC3 به ترتیب به پایه های GP26, GP27,GP28,GP29 وصل شده است. بر روی برد پیکو GP29 مستقیم به VSYS وصل شده است. رنج استاندارد ADC بین ۰ تا ۳٫۳ ولت است. هر ۵ کانال ADC به سنسور دمای داخلی برد متصل است و برای اندازه گیری دما هم استفاده میشود. رابط ADC در RP2040 فاقد رفرنس است و به همین دلیل از تغذیه ۳٫۳ ولت داخلی تراشه استفاده میکند. در پیکو پایه ADC_AVDD از SMPS 3.3 ولت با استفاده از فیلتر R-C تغذیه میشود. ADC جریان زیادی در مدار مصرف میکند تا جایی که در صورت غیرفعال بودن حسگر دما تا حدود ۱۵۰ میلی آمپر جریان کشیده و به همین دلیل جریان ماسفت برابر ۱۵۰μA*200 = ~30mV خواهد بود. با استفاده از تغییر مقاومت بین پایه VREF و پایه ۳٫۳ ولت میتواند تا حدودی ماسفت و نویز ایجاد شده را کاهش دهد. برای استفاده از پایه های ADC کافیست از پین های GP26-GP27 و GP28 استفاده کنید.
کلاس ADC در Pico
کلاس ADC یک رابط برای تبدیل آنالوگ به دیجیتال فراهم میکند که ولتاژ پیوسته ای ایجاد کرده که میتوان ولتاژ را به یک مقدار از هم گسستته تبدیل کرد. روش فراخوانی کلاس به صورت زیر است. توسط دستور اول یک آبجکت ADC ساخته شده که به یک پایه نسبت داده میشود. سپس در دستور دوم مقدار خام آنالوگ از ورودی خوانده شده و این عدد دریافتی بین بازه ی ۰ تا ۶۵۵۳۵ خواهد بود.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
مثال ADC در Pico پیکو
رزبری پای پیکو دارای پین های ورودی است که میتوانند سیگنال آنالوگ را دریافت کنند. این به این معنی است که علاوه بر خواندن دیتای ۰ و ۱ دیتای دریافتی بین این دو را هم میتواند بخواند. برای اجرای یک مثال و درک عمیق تر رابط ADC به یک پتانسیومتر و یا یک ولوم نیاز داریم. برای کدنویسی در ابتدا یک پایه برای ورودی آنالوگ در برنامه تعریف میکنیم. برای اجرای پروژه به یک ولوم و رزبری پای پیکو و THONNY PYTHON IDE نیاز داریم. همانند زیر اتصالات را انجام دهید.
- پایه مقاومت متغیر یعنی پایه وسط را به GP26 پایه ۱۰ از سمت راست متصل کنید. GP26= ADC0
- پایه ی دیگر مقاومت را به پایه ۳٫۳ ولت رزبری پای پیکو یعنی ۵ پایه از سمت راست متصل کنید.
- پایه دیگر مقاومت را به یکی از پایه های GND به دلخواه اتصال دهید.
کد ADC در Pico با میکروپایتون در THONNY PYTHON IDE به صورت زیر است:
from machine import ADC, Pin import time adc = ADC(Pin(26)) while True: print(adc.read_u16()) time.sleep(1)
با حرکت شافت ولوم به راست و چپ مقادیر دریافتی از ورودی آنالوگ ADC به صورت زیر خواهد بود.
به یک روش دیگر هم میتوان کد پایتون را نوشت. این کد دقیقا عملکردی مشابه با کد اول را دارد و فقط روش فراخوانی و استفاده از کلاس ها تغییر کرده است. دیتای دریافتی از ورودی آنالوگ در یک متغیر با نام analog_value ذخیره شده است. سپس دیتا توسط کلاس adc خوانده شده و در متغیری به نام reading ذخیره شده است و در نهایت پیغام ADC به همراه reading در دستور print برای جاپ در shell تعریف شده است.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
وسایل مورد نیاز
رزبری پای پیکو Raspberry Pi PICO
جمع بندی لیدی پای
اکثر میکروکنترلرهایی که این روزها با آن ها پروژه های مختلف پیاده سازی میکنیم از رابط ADC برای تبدیل سیگنال آنالوگ به دیجیتال استفاده میکنند. بسیاری از سنسورهایی که با آن ها سر و کار داریم دارای ورودی آنالوگ هستند و برای دریافت دیتا و خواندن دیتا از آن ها نیاز به ADC خواهیم داشت. ADC در میکروکنترلرها ۱۲ تا ۱۴ بیت است که رزبری پای پیکو دارای ADC به صورت ۱۲ بیتی است. تراشه RP2040 در مجموع دارای ۵ کانال ADC است که چهار پایه از آن ها به صورت ۱۲ بیت SAR است که به ترتیب GP26, GP27, GP28 و GP29 است. سیگنال ورودی برای ADC0,ADC1,ADC2, ADC3 به ترتیب به پایه های GP26, GP27,GP28,GP29 وصل شده است که در این آموزش یک مثال برای دریافت و خواندن دیتا از پایه GP26 اجرا شده است.
چنانچه در مراحل راه اندازی برد رزبری پای پیکو Pico و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام من وقتی برد را از USB جدا میکنم و دوباره متصل میکنم، برنامه روی برد رزبری پیکو پاک میشود. راه حل خاصی داره؟
با سلام
باید اسم برنامه را main.py ذخیره کنید تا برنامه بر روی برد ذخیره شود.
با سلام آیا تمامی سنسورهای انالوگ مثل ldr microphone با رزبری پیکو راه اندازی میشه؟
با سلام
بله هیچ تفاوتی ندارد و میتوانید از تمامی سنسورهای آنالوگ استفاده کنید.
با سلام
آیا امکان تست این کد با جوی استیک هم فراهم است، اگر نیست لطفا آموزش دهید.
با سلام بله دقیقا همین کد را با جوی استیک هم میتوانید تست کنید. به زودی آموزش راه اندازی با جوی استیک هم منتشر خواهد شد.
چرا ۱۲ بیتی همه جا نوشته شده اما ۱۶ بیتی نمایش میده؟
با سلام
بله در دیتاشیت تراشه به ۱۲ بیتی بودن ADC اشاره شده است اما خروجی ADC بازه ۱۶ بیتی است و دلیل مشخصی ندارد.
سلام آیا از جوی استیک میشه برای راه اندازی برای این کد استفاده کرد
با سلام
بله به زودی آموزشی جداگانه برای آن منتشر خواهد شد.
سلام
همه جا نوشته شده که ADC به صورت ۱۲ بیتی است اما ۱۶ بیتی خروجی میدهد
با سلام
بله به صورت پیشفرض ۱۲ بیتی است اما خروجی ADC در خروجی پروژه ۱۶ بیتی است.
سلام خسته نباشید
توی یه پروژه تبدیل صدا به کلمه(wake-word) دچار مشکل شدم
از میکروفون max4466 استفاده میکنم، خروجی رو به پین ۳۱ یا GP26 متصل کردم، وقتی دیتا رو دریافت میکنم یه نویز به صورت تناوبی تکرار میشه
نمیدونم چطور توضیحش بدم، شبیه نبض زدن میمونه. یه الگوی تکرار شوندس
توی اینترنت چیز دقیقی پیدا نکردم. یسری جاها گفته بود یه قسمت از رو برد حذف کنیم درست میشه، یه جای دیگه گفته بود نیازه از یه خازن بزرگ استفاده کنیم
ضمن اینکه این اتفاق توی ماژول pulse هم میفته دقیقا
تو دانشجوکیت پیام پشتیبانی دادم برای این مساله، عکس هارو ضمیمه کردم. اگه نیازه بفرمایید همینجا هم ارسال میکنم
با سلام
در این خصوص پیشنهاد میشود داده ها را به صورت آرایه ای بنویسید تا عملکرد دقیق تری داشته باشد. همچنین ADC برای اینکار کافی نیست و بایستی از DMA استفاده کنید. DMA مخفف Direct Memory Access است. برای ذخیره داده با سرعت بالاتر از حافظه DMA در RP2040 باید استفاده کنید که این مورد در دیتاشیت تراشه RP2040 به صورت کامل آموزش داده شده است. در این خصوص بایستی از مکانیزم uctypes در میکروپایتون برای کدنویسی استفاده کنید.
میشه با استفاده از میکروپایتون و برد آردوینو ارتباط برقرار کرد و از قابلیت هاش استفاده کرد؟
سلام
بله، میتوان از طریق ارتباط سریال (Serial) بین میکروپایتون و برد آردوینو، دو دستگاه را با هم ارتباط داد و از قابلیتهای هر دو دستگاه استفاده کرد. برای این کار ابتدا باید برای برد آردوینو کد مناسبی با استفاده از زبان C++ بنویسید تا بتوانید به ازای دریافت دستوراتی از میکروپایتون، عملیاتی را روی برد انجام دهید.
چگونه میتوان از رزبری پای پیکو و میکروپایتون برای کنترل موتورها استفاده کرد؟
سلام
برای کنترل موتور بایستی از کلاس های adc , PWM در میکروپایتون استفاده کنید.