راه اندازی ADC رزبری پای پیکو – Raspberry Pi Pico ADC
ADC رزبری پای پیکو امکان خواندن سیگنالهای آنالوگ را برای این برد فراهم میکند و از این رو دارای اهمیت بالایی است. خروجی بسیاری از سنسورها و مدارات الکترونیکی آنالوگ است و برای کار با آنها نیازمند واحد ADC خواهید بود. در این مقاله ابتدا توضیحاتی در مورد اینکه ADC چیست آورده شده است، سپس مشخصات واحد ADC رزبری پای پیکو را بیان کردهایم و در انتها نحوه راه اندازی ADC رزبری پای پیکو به زبان پایتون را آموزش دادهایم.
ADC چیست؟
پردازندهها تنها توانایی پردازش سیگنالهای دیجیتال را دارند و برای آنکه بتوانند از اطلاعات یک سیگنال آنالوگ استفاده کنند ابتدا باید این سیگنال به فرمت دیجیتال تبدیل شود. یعنی اینکه اولا از حالت پیوسته در زمان به حالت گسسته در زمان درآیند و ثانیا دامنه سیگنال از حالت پیوسته به حالت گسسته درآید. یک سیگنال دیجیتال آرایهای از اعداد است که هر عدد معرف دامنه سیگنال در آن لحظه از زمان میباشد. عملیات گسسته کردن سیگنال آنالوگ در زمان را نمونه برداری و عملیات گسسته کردن دامنه سیگنال آنالوگ را کوانتیزاسیون نامند.
وظیفه ADC تبدیل سیگنال آنالوگ به دیجتال است تا پردازنده بتواند از آن استفاده کند. سه پارامتر مهم در ADCها عبارتند از
- حداکثر نرخ نمونه برداری
- رزولوشن
- ENOB
نرخ نمونه برداری یعنی اینکه ADC با چه سرعتی میتواند از سیگنال آنالوگ نمونه برداری کند. به عنوان مثال یک ADC با نرخ نمونه برداری 100KSPS میتواند در هر ثانیه 100 هزار نمونه از سیگنال بردارد که معادل زمان هر 10 میکروثانیه یک نمونه است.
رزولوشن نمونه برداری یعنی اینکه اعداد دیجیتالی که از نمونهها بدست آمدهاند چندبیتی هستند. به بیان سادهتر رزولوشن نمونه برداری قدرت تفکیک بین مقدار نمونهها است. رزولوشنهای پرکاربرد عبارتند از 8bit, 10bit, 12bit, 16bit, 24bit, 32bit
ENOB معیاری برای ارزیابی کیفیت ADC است. مدارات ADC دارای نویزهایی هستند که بر کیفیت دادهبرداری اثر میگذارند. در یک ADC ایدهآل عدد ENOB همان رزولوشن ADC است اما در دنیای واقعی ENOB عددی کمتر از رزولوشن است و در واقع تعداد بیتهایی است که در اثر تغییر در سیگنال ورودی ایجاد میشوند و نه نویز مدارات داخلی ADC. به عنوان مثال ENOB یک ADC با رزولوشن 16bit ممکن است به 14bitهم نرسد.
اگر فرکانس نمونه برداری یا رزولوشن کافی نباشند برخی از اطلاعات سیگنال از دست خواهند رفت. مقدار فرکانس نمونه برداری توسط رابطه نایکوییست (حداقل دو برابر بالاترین فرکانس موجود در سیگنال) و رزولوشن توسط ماهیت سیگنال و نوع استفادهای که قرار است از آن بشود بدست میآید.
البته به جز نرخ نمونهبرداری و رزولوشن، پارامترهای دیگری در ADCها وجود دارد که مورد بحث این مقاله نیستند مانند
- تعداد کانالها
- میزان اثر کانالها بر یکدیگر (برای چند کانالهها)
- نوع تغذیه
- رنج ورودی
- فرمت خروجی
- درگاه ارتباطی
- تحمل شرایط محیطی
واحد ADC رزبری پای پیکو
میکروکنترلر RP2040 که برد Raspberry Pi Pico بر اساس آن توسعه داده شده است دارای یک ADC پنج کاناله است که کانال پنجم به صورت داخلی به سنسور دمای چیپ RP2040 متصل شده است. چهار کانال دیگر از چیپ بیرون آورده شدهاند و روی پایههای GP26, GP27, GP28, GP29 در دسترس هستند.البته کانال چهارم درون برد برای خواندن ولتاژ ورودی به برد (VSYS) مورد استفاده قرار گرفته و سه کانال دیگر برای استفاده کاربر از برد بیرون آورده شدهاند.
GP26 | ADC channel 0 |
GP27 | ADC channel 1 |
GP28 | ADC channel 2 |
VSYS | ADC channel 3 |
Internal Temperature Sensor | ADC channel 4 |
دادهبرداری این کانالها به صورت کاملا همزمان نیست بلکه هر کانال از طریق مالتیپلکسر به بخش دادهبردار ADC متصل شده است و هنگام استفاده از چند کانال این مالتیپلکسر به ترتیب کانالها را به دادهبردار متصل میکند. البته برای بسیاری از کاربردها این مقدار تاخیر بین کانالها قابل صرف نظر است.
ویژگیهای اصلی واحد ADC رزبری پای پیکو عبارتند از
- ساختار SAR
- ماکزیمم نرخ نمونهبرداری 500KSPS
- رزولوش 12bit
- کیفیت 8.7ENOB
- 5 کانال مالتی پلکس شده
- درای بافر FIFO ورودی
- مجهز به اینتراپت
- مجهز به DMA
اگر مایل به مطالعه عمیقتر در مورد بخش ADC هستید میتوانید به دیتاشیت RP2040 مراجعه کنید.
راه اندازی ADC رزبری پای پیکو
برای راهاندازی ADC رزبری پای پیکو ابتدا باید یک ولتاژ آنالوگ روی یکی از کانالهای ADC ایجاد کنیم. راههای متنوعی برای این کار وجود دارد مانند تقسیم مقاومت، استفاده از سنسورهای با خروجی آنالوگ (مانند LM35) ، استفاده از مدارهای مبدل پالس به آنالوگ (مانند انتگرالگیر). سادهترین راه استفاده از یک پتانسیومتر به عنوان مقسم ولتاژ است که در خروجی یک ولتاژ آنالوگ بین 0 تا VCC را ایجاد خواهد کرد. برای این کار از پایه 38 برد (به عنوان GND)، پایه 36 برد (به عنوان VCC) و پایه 34 برد (به عنوان ورودی آنالوگ) به صورت زیر استفاده میکنیم.
برای نوشتن کد در اولین قدم کلاس ADC و کلاس Pin را از ماژول machine فراخوانی میکنیم. کلاس ADC برای کار با واحد ADC رزبری پای پیکو استفاده میشود و کلاس Pin برای اختصاص دادن پین ورودی به ADC مورد نیاز است. همچنین از ماژول utime متد sleep_ms را فراخوانی میکنیم تا برای ایجاد تاخیر در کد از آن استفاده کنیم.
from machine import ADC, Pin from utime import sleep_ms
در ادامه یک آبجکت با نام pot_adc از کلاس ADC ساخته و Pin(28) را به عنوان پایه ورودی ADC به آن معرفی میکنیم. دقت داشته باشید Pin(28) میکروکنترلر RP2040 روی برد به پایه 34 متصل است. اگر تمایل به مطالعه بیشتر در مورد کلاس Port و نحوه استفاده از آن در میکروپایتون دارید میتوانید به مقاله راه اندازی پایه های رزبری پای پیکو مراجعه کنید.
pot_adc = ADC(Pin(28))
در نهایت با استفاده از متد read_u16 مقدار ADC را در قالب یک عدد 16bit می خوانیم. دقت داشته باشید رزولوشن ADC رزبری پای پیکو 12 بیتی است و این عدد 16 بیتی حاصل کتابخانه پایتون است که در واقع با یک عملیات ریاضی به رنج 16 بیت scale شده است. برای تبدیل این عدد 16 بیتی به مقدار واقعی ولتاژ باید ابتدا آن را به عدد 65535 تقسیم کرده و سپس در عدد 3.3 ضرب کنید.
while True : pot_value_u16 = pot_adc.read_u16() pot_value_voltage = (pot_value_u16/65535)*3.3 print(pot_value_voltage) sleep_ms(1000)
کد کامل راهاندازی ADC رزبری پای پیکو به صورت زیر است :
from machine import ADC, Pin from utime import sleep_ms pot_adc = ADC(Pin(28)) while True : pot_value_u16 = pot_adc.read_u16() pot_value_voltage = (pot_value_u16/65535)*3.3 print(pot_value_voltage) sleep_ms(1000)
در پایان
در این مقاله توضیحاتی راجع به این موضوع که ADC چیست بیان کردیم و در ادامه واحد ADC رزبری پای پیکو را راهاندازی کردیم. بسیار خوشحال خواهیم شده اگر تجربهای در مورد کار با ADC رزبری پای پیکو دارید و یا راجع به مقاله نظری دارید آن را در بخش نظرات با ما و دیگر دوستانتان به اشتراک بگذارید.
دیدگاهتان را بنویسید