جلسه ششم:
استفاده از ADC در MicroPython
مبحث جلسه قبل در مورد زمان بندی در میکروپایتون بود. مطلب این جلسه در مورد استفاده از مبدل دیجیتال به آنالوگ در MicroPython است. برای آموزش از برد ESP32 NodeMCU استفاده میکنیم اما برای ESP8266 هم با اندکی تفاوت قابل استفاده است. این تفاوتها را در انتهای جلسه بررسی میکنیم. پیش نیاز این جلسه، جلسات قبلی آموزش میکروپایتون مقدماتی است که از انتهای این صفحه میتوانید به آنها مراجعه کنید.
مقدمه
ADC مخفف Analog to Digital Converter است یا همان مبدل آنالوگ به دیجیتال. به طور کلی و خلاصه برای تبدیل یک ولتاژ از صفر تا ولتاژ رفرنس به یک عدد صفر تا 1023 (برای 10 بیت) استفاده میشود. برای آشنایی بیشتر با ADC از این لینک استفاده کنید.
استفاده از ADC در ESP32
برای استفاده از ADC در ESP32 از class مربوط به آن که در ماژول machine قرار دارد استفاده میکنیم.
قبل از شروع کد نویسی در مورد ADC در ESP32 توضیح میدهیم. برای استفاده از مبدل آنالوگ به دیجیتال از پایه های 32 تا 39 (ADC1)استفاده میکنیم. البته پایه های ADC2 نیز قابل استفاده است اما محدودیت هایی دارد که باعث دردسر میشود. مثلا همزمان با wifi قابل استفاده نیست و یا pin0 ، pin5 و pin15 در شرایط خاصی قابل استفاده است و در حالت عادی قابل استفاده نیست.
رزولوشن ADC در ESP32
میزان رزولوشن ADC در ESP32 به مقادیر زیر قابل تنظیم است:
- 9 بیت از 0 تا 511
- 10 بیت از 0 تا 1023
- 11بیت از 0 تا 2023
- 12 بیت از 0 تا 4096
from machine import ADC
adc.width(ADC.WIDTH_9BIT)
ولتاژ رفرنس ADC در ESP32
در حالت عادی نمیشود ولتاژ بالای 1 ولت را به ADC مربوط به ESP32 داد زیرا به ازای همه مقادیر بالای 1 ولت عدد 4095 را نشان میدهد. البته برای این مشکل راه حل استفاده از مقادیر مختلف attenuation در برنامه است. مقدار ولتاژ رفرنس در ESP32 به مقادیر زیر قابل تنظیم است:
- 0dB برای ولتاژ 0 تا حداکثر 1v
- 2.5dB برای ولتاژ 0 تا حداکثر 1.34v
- 6dB برای ولتاژ 0 تا حداکثر 2v
- 11dB برای ولتاژ 0 تا حداکثر 3.6v
این تغییرات از طریق کد قابل تنظیم است و نیازی به تغییر در سخت افزار نیست.
توجه کنید که حداکثر ولتاژ مجاز برای پایههای ESP32 مقدار 3.6 ولت است و ولتاژ بالاتر ممکن است به آن آسیب بزند.
from machine import ADC
adc.atten(ADC.ATTN_11DB) # set 11dB input attenuation (voltage range roughly 0.0v - 3.6v)
برنامه نمونه
کد زیر یک برنامه نمونه برای نمونه گیری از ولتاژ Pin32 به صورت 5 ثانیه یکبار است:
from machine import ADC,Pin
from time import sleep
adc = ADC(Pin(32)) # create ADC object on ADC pin
adc.atten(ADC.ATTN_11DB) # set 11dB input attenuation (voltage range roughly 0.0v - 3.6v)
adc.width(ADC.WIDTH_12BIT) # set 12 bit return values (returned range 0-4095)
while True:
val=adc.read()
print('adc val:',val)
print('Voltage:',(val*3.6)/4095)
sleep(5)
این کد را در یک فایل به نام adc.py ذخیره میکنیم و آن را در حافظه فلش ماژول ذخیره میکنیم و در main.py کد import adc را استفادهمیکنیم. بعد از فشردن دکمه ریست کد اجرا میشود.
تفاوتهای ADC در ESP8266 و ESP32
در ESP8266 استفاده از ADC متفاوت است و تفاوتها به صورت زیر است:
- 1- فقط یک Pin برای ADC قابل استفاده است.
- 2- مقدار ولتاژ فقط و فقط میتواند بین 0 تا 1 ولت باشد.
- 3- رزولوشن قابل تنظیم نیست و فقط 10 بیت است یعنی از 0 تا 1023.
برنامه نمونه در ESP8266
برای نمونه کد اجرا شده روی ESP32 به صورت زیر تغییر میکند:
from machine import ADC
from time import sleep
adc = ADC(0) # create ADC object on ADC pin
while True:
adc.read() # read value, 0-1024
print('adc val:',val)
print('Voltage:',val/1024)
sleep(5)
جمع بندی جلسه ششم آموزش Micropython
موضوع جلسه در مورد مبدل آنالوگ به دیجیتال (ADC) بود امیدوارم برای شما مفید باشد. موضوع جلسه بعد در مورد PWM در میکروپایتون است.
۱ comments
با عرض سلام و تشکر از شما که علم و وقتتان را برای آموزش هموطنانتان صرف میکنید.
من هر هفته منتظر آموزش های کاربردی شما هستم.