
آموزش ADC در Raspberry Pi Pico با MicroPython؛ خواندن سنسور آنالوگ
راهاندازی سنسورهای آنالوگ با Raspberry Pi Pico؛ آموزش ADC و تبدیل مقدار به ولتاژ
بسیاری از سنسورهای الکترونیکی، اطلاعات محیط را به شکل یک ولتاژ متغیر ارائه میکنند. برای مثال، خروجی یک سنسور نور، مدار اندازهگیری باتری یا بعضی سنسورهای دما ممکن است با تغییر کمیت اندازهگیریشده، تغییر کند. اما میکروکنترلر چگونه این ولتاژ را میخواند و به یک عدد قابل استفاده در برنامه تبدیل میکند؟
۱. مبدل ADC چیست و چه کاربردی دارد؟
مبدل آنالوگ به دیجیتال (Analog-to-Digital Converter) یا ADC، ولتاژ آنالوگ ورودی را به یک مقدار عددی تبدیل میکند تا میکروکنترلر بتواند آن را پردازش کند.
برای مثال، فرض کنید یک سنسور نور در شرایط مختلف ولتاژهای متفاوتی تولید میکند. میکروکنترلر بهتنهایی نمیتواند این ولتاژ پیوسته را مانند یک عدد در برنامه استفاده کند؛ ADC ولتاژ را نمونهبرداری کرده و متناسب با سطح آن، یک عدد دیجیتال تولید میکند.
در Raspberry Pi Pico نسل اول، تراشه RP2040 دارای ADC با وضوح اسمی ۱۲ بیت است. این مبدل میتواند مقدار ورودی را در ۴۰۹۶ سطح عددی، از ۰ تا ۴۰۹۵، کدگذاری کند.
البته این تعداد سطح به معنی دقت تضمینشده اندازهگیری نیست. نویز، کیفیت تغذیه، خطای مرجع ولتاژ و مشخصات واقعی ADC نیز بر نتیجه تأثیر میگذارند.
از ADC میتوان در پروژههای مختلفی استفاده کرد، از جمله:
- خواندن خروجی آنالوگ سنسورهای نور و دما
- اندازهگیری ولتاژ باتری با مدار تقسیم ولتاژ مناسب
- خواندن موقعیت یک پتانسیومتر
- اندازهگیری خروجی مدارهای تقویتکننده و حسگرهای آنالوگ
- پایش تغییرات ولتاژ در سامانههای اندازهگیری و کنترل
۲. پایههای ADC در Raspberry Pi Pico
در برد Raspberry Pi Pico مبتنی بر RP2040، ورودیهای ADC روی پایههای زیر در دسترس هستند:
| پایه GPIO | کانال ADC | کاربرد |
|---|---|---|
| GP26 | ADC0 | ورودی آنالوگ خارجی |
| GP27 | ADC1 | ورودی آنالوگ خارجی |
| GP28 | ADC2 | ورودی آنالوگ خارجی |
| GP29 | ADC3 | متصل به مدار اندازهگیری VSYS روی برد |
برای تمرینهای معمول، بهتر است از GP26، GP27 یا GP28 استفاده کنید. پایه GP29 در طراحی برد برای اندازهگیری ولتاژ VSYS از طریق یک تقسیمکننده ولتاژ داخلی به کار رفته است؛ بنابراین نباید آن را مانند یک ورودی آنالوگ آزاد و مستقل در نظر گرفت.
نکته مهم دیگر، محدوده ولتاژ ورودی است. در این برد، بازه معمول اندازهگیری ADC حدود ۰ تا ۳٫۳ ولت است. پایههای میکروکنترلر برای تحمل ولتاژهای بالاتر از محدوده مجاز طراحی نشدهاند. حتی اگر برنامه بتواند عددی از ADC بخواند، این موضوع به معنی ایمن بودن ولتاژ ورودی نیست.
اگر خروجی سنسور بیشتر از محدوده مجاز باشد، باید پیش از اتصال به Pico از مدار مناسب، مانند تقسیمکننده ولتاژ طراحیشده بر اساس مشخصات ورودی و خروجی سنسور، استفاده کنید. در این حالت نیز باید ولتاژ واقعی روی پایه ADC محاسبه شود.
۳. اتصال پتانسیومتر برای آزمایش ADC
برای اینکه بدون نیاز به سنسور خاصی عملکرد ADC را بررسی کنیم، از یک پتانسیومتر استفاده میکنیم. پتانسیومتر سه پایه دارد و با چرخاندن محور آن، ولتاژ پایه وسط تغییر میکند.
قطعات موردنیاز
- یک برد Raspberry Pi Pico
- یک پتانسیومتر ۱۰ کیلواهم
- بردبورد و سیم اتصال
- کابل USB برای تغذیه و اجرای برنامه
روش اتصال
پتانسیومتر را به شکل زیر به برد وصل کنید:
| پایه پتانسیومتر | اتصال به Pico |
|---|---|
| پایه کناری اول | 3V3(OUT) |
| پایه کناری دوم | GND |
| پایه وسط یا جاروبک | GP26 |
دو پایه کناری را میتوان جابهجا کرد؛ تنها جهت افزایش یا کاهش ولتاژ هنگام چرخاندن محور تغییر خواهد کرد.
در این مدار، پتانسیومتر مانند یک تقسیمکننده ولتاژ عمل میکند. با چرخاندن محور، ولتاژ پایه وسط در محدودهای بین زمین و ولتاژ تغذیه ۳٫۳ ولت تغییر میکند.
هشدار: پیش از اتصال مدار، مطمئن شوید پایهها را درست شناسایی کردهاید. هیچگاه ۵ ولت USB یا خروجی ۵ ولتی یک سنسور را مستقیماً به GP26 متصل نکنید.
۴. راهاندازی ADC با MicroPython
پس از نصب MicroPython روی برد و برقراری ارتباط با محیط اجرای برنامه، میتوان ADC را با استفاده از ماژول machine راهاندازی کرد.
کد زیر مقدار خام ADC را از پایه GP26 میخواند و در خروجی نمایش میدهد:
|
1 2 3 4 5 6 7 8 9 |
from machine import ADC, Pin import time adc = ADC(Pin(26)) while True: value = adc.read_u16() print(value) time.sleep(0.5) |
در این برنامه:
- با دستور
ADC(Pin(26))ورودی ADC مربوط به پایه GP26 انتخاب میشود. - تابع
read_u16()یک مقدار عددی بین ۰ تا ۶۵۵۳۵ برمیگرداند. - دستور
print()مقدار خواندهشده را در محیط سریال نمایش میدهد. - دستور
time.sleep(0.5)بین خواندنهای متوالی نیم ثانیه فاصله ایجاد میکند.
با چرخاندن پتانسیومتر، باید تغییر مقدار خواندهشده را مشاهده کنید. در یک مدار ایدهآل، با تغییر ولتاژ از نزدیک صفر تا نزدیک ۳٫۳ ولت، مقدار ADC نیز از نزدیک صفر تا نزدیک ۶۵۵۳۵ تغییر خواهد کرد.
در عمل، رسیدن دقیق به دو انتهای بازه تضمینشده نیست و ممکن است به دلیل تلرانس قطعات، نویز یا شرایط اندازهگیری، مقدار کمی اختلاف مشاهده شود.
۵. تبدیل مقدار ADC به ولتاژ واقعی
عدد خام ADC بهتنهایی نشان نمیدهد ولتاژ ورودی چند ولت بوده است. برای تبدیل آن به ولتاژ تخمینی، باید مقیاس عددی خروجی تابع read_u16() را در نظر بگیریم.
در MicroPython، مقدار ADC در بازه ۰ تا ۶۵۵۳۵ نمایش داده میشود. برای تخمین ولتاژ ورودی، میتوان از رابطه متنی زیر استفاده کرد:
ولتاژ ورودی = مقدار ADC × ولتاژ مرجع / ۶۵۵۳۵
اگر ولتاژ مرجع را برای محاسبه اولیه ۳٫۳ ولت در نظر بگیریم:
ولتاژ ورودی = مقدار ADC × ۳٫۳ / ۶۵۵۳۵
این رابطه یک تخمین اولیه است و فرض میکند بازه کامل ADC با ولتاژ مرجع ۳٫۳ ولت متناظر است. برای اندازهگیری دقیقتر، ولتاژ واقعی مرجع و ویژگیهای ADC باید در نظر گرفته شوند.
مثال محاسباتی
فرض کنید برنامه عدد ۳۲۷۶۸ را از ADC دریافت کرده است. با فرض ولتاژ مرجع ۳٫۳ ولت، محاسبه به شکل زیر خواهد بود:
ولتاژ ورودی = ۳۲۷۶۸ × ۳٫۳ / ۶۵۵۳۵
ولتاژ ورودی تقریباً برابر با ۱٫۶۵ ولت است.
این مقدار نشان میدهد ولتاژ ورودی تقریباً در نیمه بازه اندازهگیری قرار دارد. عدد بهدستآمده یک مثال محاسباتی است و نتیجه آزمایش فیزیکی با برد نیست.
نمایش همزمان مقدار خام و ولتاژ
برای مشاهده هر دو مقدار، میتوانیم برنامه را به شکل زیر تغییر دهیم:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from machine import ADC, Pin import time adc = ADC(Pin(26)) VREF = 3.3 while True: raw = adc.read_u16() voltage = raw * VREF / 65535 print("ADC:", raw, "Voltage:", voltage, "V") time.sleep(0.5) |
در این برنامه، مقدار VREF بهعنوان فرض محاسباتی ولتاژ مرجع تعریف شده است. اگر ولتاژ واقعی مرجع با این مقدار تفاوت داشته باشد، نتیجه محاسبه نیز با ولتاژ واقعی ورودی اختلاف خواهد داشت.
برای کاربردهای حساس، بهتر است ولتاژ مرجع یا تغذیه مرتبط را با ابزار مناسب اندازهگیری کنید و در صورت نیاز، خطای اندازهگیری را با کالیبراسیون کاهش دهید.
۶. خواندن سنسور آنالوگ با ADC
پس از آزمایش با پتانسیومتر، میتوان از همین روش برای خواندن سنسورهای آنالوگ استفاده کرد. در این حالت، پایه خروجی آنالوگ سنسور به یکی از ورودیهای ADC متصل میشود.
برای نمونه، اگر سنسوری خروجی آنالوگ داشته باشد، مسیر کار به این صورت خواهد بود:
- سنسور را مطابق دیتاشیت و با تغذیه مناسب راهاندازی کنید.
- زمین سنسور و برد Pico را در مدارهای غیرایزوله به یک مرجع مشترک متصل کنید.
- خروجی آنالوگ سنسور را به GP26، GP27 یا GP28 وصل کنید؛ البته تنها در صورتی که محدوده ولتاژ خروجی با محدوده مجاز ورودی ADC سازگار باشد.
- مقدار ADC را با MicroPython بخوانید.
- مقدار خام را به ولتاژ تخمینی تبدیل کنید.
- با استفاده از رابطه مشخصشده در دیتاشیت سنسور، ولتاژ را به کمیت موردنظر تبدیل کنید.
نکته کلیدی این است که تبدیل ولتاژ به یک کمیت فیزیکی، برای همه سنسورها یکسان نیست. بعضی سنسورها رابطه خطی دارند، بعضی به مدار تقویتکننده یا کالیبراسیون نیاز دارند و برخی دیگر به روش تبدیل اختصاصی نیازمندند.
برای مثال، اگر دیتاشیت یک سنسور رابطه خطی زیر را مشخص کرده باشد:
کمیت اندازهگیریشده = (ولتاژ خروجی – ولتاژ آفست) / حساسیت سنسور
میتوان پس از اندازهگیری ولتاژ، مقدار کمیت را با استفاده از آفست و حساسیت تعیینشده در دیتاشیت محاسبه کرد. واحدها باید با یکدیگر سازگار باشند؛ برای نمونه، اگر حساسیت بر حسب ولت بر درجه سلسیوس بیان شده باشد، نتیجه محاسبه بر حسب درجه سلسیوس خواهد بود.
این رابطه صرفاً یک الگوی عمومی است. پیش از استفاده از آن، باید مطمئن شوید مدل واقعی سنسور از همین رابطه پیروی میکند.
۷. افزایش پایداری و دقت اندازهگیری
خواندن ADC همیشه بدون نوسان نیست. حتی وقتی ولتاژ ورودی تقریباً ثابت است، ممکن است اعداد متوالی کمی با یکدیگر تفاوت داشته باشند. این اختلاف میتواند ناشی از نویز مدار، تغییرات تغذیه، امپدانس منبع سیگنال یا محدودیتهای ADC باشد.
چند روش برای بهبود نتیجه وجود دارد.
میانگینگیری از چند نمونه
یکی از روشهای ساده، خواندن چند نمونه و محاسبه میانگین آنهاست. این روش میتواند نوسانهای تصادفی را کاهش دهد، اما خطای سیستماتیک یا مشکل طراحی مدار را بهتنهایی برطرف نمیکند.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from machine import ADC, Pin import time adc = ADC(Pin(26)) VREF = 3.3 SAMPLES = 16 while True: total = 0 for _ in range(SAMPLES): total += adc.read_u16() time.sleep_ms(2) average = total / SAMPLES voltage = average * VREF / 65535 print("Average ADC:", average) print("Voltage:", voltage, "V") time.sleep(0.5) |
در این برنامه، ۱۶ نمونه خوانده میشود و میانگین آنها برای تخمین ولتاژ استفاده میشود. تعداد نمونهها و فاصله زمانی بین آنها را باید متناسب با سرعت تغییر سیگنال انتخاب کرد. اگر سیگنال سریع تغییر کند، میانگینگیری طولانی ممکن است جزئیات تغییرات را از بین ببرد.
توجه به امپدانس منبع سیگنال
اگر خروجی سنسور یا مدار اندازهگیری امپدانس بالایی داشته باشد، ممکن است شارژشدن خازن نمونهبرداری ADC در زمان لازم بهخوبی انجام نشود. در چنین شرایطی، نتیجه میتواند از مقدار واقعی فاصله بگیرد.
در صورت مشاهده خطاهای غیرعادی، باید مشخصات منبع سیگنال، مدار ورودی و الزامات راهاندازی ADC در دیتاشیت بررسی شود. در بعضی مدارها استفاده از بافر مناسب یا تغییر طراحی بخش آنالوگ میتواند مفید باشد.
مدیریت نویز و سیمکشی
سیمهای بلند، مسیرهای مشترک جریانهای پرنویز و تغذیه نامناسب میتوانند روی اندازهگیری تأثیر بگذارند. بهتر است سیم سیگنال آنالوگ تا حد امکان کوتاه باشد و مسیر زمین و تغذیه سنسور به شکل مناسبی طراحی شود.
اگر سنسور به تغذیه جداگانه نیاز دارد، پیش از اتصال خروجی آن به Pico باید سطح ولتاژ و سازگاری الکتریکی آن بررسی شود. اتصال زمین مشترک نیز فقط برای مدارهایی مناسب است که طراحی آنها اتصال الکتریکی مشترک را مجاز میداند.
کالیبراسیون
اگر هدف، اندازهگیری دقیق ولتاژ یا کمیتهای فیزیکی است، صرف استفاده از فرمول تبدیل کافی نیست. میتوان ولتاژ ورودی را در چند نقطه با مولتیمتر مناسب مقایسه کرد و در صورت نیاز، ضرایب تبدیل را اصلاح کرد.
کالیبراسیون باید بر اساس اندازهگیری واقعی انجام شود؛ تغییر یک عدد در برنامه بدون مقایسه با مرجع معتبر، بهتنهایی کالیبراسیون محسوب نمیشود.
۸. خطاهای رایج هنگام استفاده از ADC
مقدار ADC همیشه صفر است
ابتدا اتصال پایه خروجی سنسور و زمین را بررسی کنید. مطمئن شوید پایه انتخابشده قابلیت ADC دارد و سنسور بهدرستی تغذیه میشود. اگر از پتانسیومتر استفاده میکنید، اتصال پایه وسط را بررسی کنید.
مقدار ADC همیشه نزدیک بیشینه است
احتمال دارد ورودی نزدیک ولتاژ مرجع باشد یا سیمکشی پتانسیومتر اشتباه انجام شده باشد. همچنین باید مطمئن شوید پایه ورودی ناخواسته به ۳٫۳ ولت متصل نشده است.
مقدار خواندهشده نوسان زیادی دارد
تغذیه، اتصالات، طول سیمها و کیفیت منبع سیگنال را بررسی کنید. در صورت نیاز، میانگینگیری یا فیلتر مناسب را به کار ببرید؛ اما پیش از آن، علتهای سختافزاری را نادیده نگیرید.
ولتاژ محاسبهشده با مولتیمتر متفاوت است
ابتدا مطمئن شوید مولتیمتر و ADC دقیقاً یک نقطه از مدار را اندازهگیری میکنند. سپس مقدار واقعی ولتاژ مرجع، اتصال زمین، مشخصات سنسور و دقت موردنیاز را بررسی کنید. استفاده از عدد ثابت ۳٫۳ ولت در برنامه، تضمین نمیکند که ولتاژ واقعی مرجع دقیقاً همین مقدار باشد.
سنسور خروجی ۵ ولتی دارد
خروجی ۵ ولتی را مستقیماً به ورودی ADC متصل نکنید. ابتدا دیتاشیت سنسور و محدوده مجاز پایههای RP2040 را بررسی کنید و در صورت نیاز از مدار تطبیق سطح ولتاژ مناسب استفاده کنید. طراحی این مدار باید طوری باشد که حتی در شرایط بیشینه خروجی سنسور، ولتاژ ورودی از محدوده مجاز تجاوز نکند.
جمعبندی
با استفاده از ADC در Raspberry Pi Pico میتوان ولتاژ خروجی سنسورهای آنالوگ را خواند و در برنامه MicroPython از آن استفاده کرد. برای شروع، اتصال یک پتانسیومتر به GP26 روش سادهای برای بررسی عملکرد ADC است. سپس میتوان مقدار خواندهشده با read_u16() را با در نظر گرفتن ولتاژ مرجع به یک ولتاژ تخمینی تبدیل کرد.
برای کاربردهای واقعی، تنها خواندن مقدار ADC کافی نیست. رعایت محدوده مجاز ولتاژ، انتخاب پایه صحیح، توجه به نویز، شناخت رابطه خروجی سنسور و در صورت نیاز کالیبراسیون، بخش مهمی از یک طراحی قابل اعتماد هستند.
اگر قصد دارید یک سنسور مشخص را به Pico متصل کنید، قدم بعدی بررسی دیتاشیت همان سنسور و تعیین محدوده خروجی آن است؛ پس از آن میتوان مدار اتصال و رابطه تبدیل خروجی به کمیت موردنظر را دقیقتر طراحی کرد.
منابع فنی






