پرش به محتوا

آموزش توابع آردوینو – ورودی و خروجی آنالوگ

در تمامی پلتفرم ها (آردوینو) و پردازنده های الکترونیکی، واژه آنالوگ معنا و مفهوم مشخصی دارد که شامل یک داده چند بیتی می شود. این داده در رجیستر پورت های آنالوگ میکروکنترلر قرار میگیرد؛ هر چه ارزش این داده بیشتر می شود ولتاژ پایه مربوطه به سطح ولتاژ تغذیه نزدیک تر می شود و هر چه ارزش آن کم شود ولتاژ آن پایه به زمین یا صفر ولت نزدیک می شود. به طور کلی ولتاژ پایه های آنالوگ محدود به سطوح منطقی نیستند و میتواند به صورت متغییر چه در حالت ورودی و چه در حالت خروجی پورت آنالوگ باشد.
آموزش توابع آردوینو

;()analogRead

شرح:

مقدار را از پایه ورودی آنالوگ (ارتباطی با خروجی های آنالوگ ندارد) مشخص شده می خواند. برد آردوینو شامل 6 کانال  (8 کانال در آردوینو مینی و آردوینو نانو ، 16 کانال در آردوینو مگا) ، مبدل 10 بیتی آنالوگ به دیجیتال است.  این بدان معنی است که ولتاژ های ورودی بین 0 تا 5 ولت را به مقادیر عدد صحیح بین 0 تا 1023 می رساند.

این دقت برای خواندن ولتاژ  های صفر تا 5 ولت شامل  1024 واحد یا 0.0049 ولت (4.9 میلی ولت) در واحد ایجاد می کند. دامنه و وضوح ورودی با استفاده از ()analogReference قابل تغییر است. خواندن ورودی آنالوگ حدود 100 میکروثانیه (0.0001 ثانیه) طول می کشد ، بنابراین حداکثر سرعت خواندن در حدود 10،000 بار در ثانیه است.

آموزش توابع آردوینو دقت هر برد

 * پایه A0 تا A5 بر روی برد نشان داده شده است ، پایه A6  تا A11 به ترتیب در پین های 4 ، 6 ، 8 ، 9 ، 10 و 12 قرار دارد.
 ** وضوح پیش فرض ()analogRead برای این بردها 10 بیت است ، برای تغییر در 12 بیت شما باید از ()analogReadResolution  استفاده کنید.

ساختار کد دستور:

analogRead (پایه)


مولفه ها:

پایه: شماره پایه ورودی آنالوگ برای خواندن از (0 تا 5 در بیشتر بردها ، 0 تا 7 در آردوینو مینی و آردوینو نانو، 0 تا 15 در آردوینو مگا)

نتیجه:

یک عدد صحیح (int) بین 0 تا 1023 برای برد های 10 بیتی و 0 تا 4095 برای برد های 12 بیتی برمیگرداند.

کد نمونه:

این کد ولتاژ را در analogPin 0 می خواند و آن را نشان می دهد.

				
					int analogPin = 0;                       // پتانسیومتر متصل به پین آنالوگ 0
// در خارج به زمین و + 5 ولت منتهی می شود     
int val = 0;                             // متغیر برای ذخیره مقدار خوانده شده
void setup()				
{					
Serial.begin(9600);                      // راه اندازی سریال
}
void loop()
{
val = analogRead(analogPin);             // پین ورودی را میخواند و در متغیر ذخیره میکند
Serial.println(val);                     // ارسال متغیر به سریال
}

				
			

یادداشت ها و اخطارها:

اگر پایه ورودی آنالوگ به هر چیزی متصل نباشد ، مقدار برگشتی توسط  ()analogRead بر اساس تعدادی از فاکتورها تغییر می کند (به عنوان مثال مقادیر ورودی های دیگر آنالوگ ، چقدر دست شما به برد و دیگر المان ها نزدیک است.)

      برای رفتن به لیست توابع کلیک کنید

;()analogReference

شرح:

ولتاژ مرجع مورد استفاده برای ورودی آنالوگ را تنظیم می کند. (یعنی مقدار استفاده شده به عنوان بالای دامنه ورودی) گزینه ها عبارتند از:

 

برد های آردوینو تحت میکروکنترلر های AVR (Uno ، Mega ، و غیره)

  • EDEFAULT: مرجع آنالوگ پیش فرض 5 ولت (روی برد های 5 ولت آردوینو) یا 3.3 ولت (روی برد های 3.3 ولت آردوینو)
  • INTERNAL: یک مرجع داخلی ، برابر با 1.1 ولت در ATmega168 یا ATmega328P و  2.56 ولت (در ATmega8 و آردوینو مگا موجود نیست)
  • INTERNAL1V1: یک مرجع داخلی V1.1 ( فقط آردوینو مگا)
  • INTERNAL2V56: یک مرجع داخلی V2.56 (فقط آردوینو مگا)
  • XEXTERNAL : ولتاژ وارد شده به پین AREF  (فقط 0 تا 5 ولت) به عنوان مرجع استفاده می شود.

 

تابلوهای Arduino SAMD (Zero و غیره )

  • AR_DEFAULT: مرجع آنالوگ پیش فرض 3.3V
  • AR_INTERNAL: یک مرجع داخلی 2.23V
  • AR_INTERNAL1V0: یک مرجع داخلی 1.0V
  • AR_INTERNAL1V65: یک مرجع داخلی 1.65V
  • AR_INTERNAL2V23: یک مرجع داخلی 2.23V
  • AR_EXTERNAL: ولتاژ وارد شده به پایه ​​AREF به عنوان مرجع استفاده می شود

 

برد آردوینو megaAVR (Uno WiFi Rev2)

  • DEFAULT: یک مرجع داخلی 0.55 ولت
  • INTERNAL: یک مرجع داخلی 0.55 ولت
  • Vdd : VDD از ATmega4809  با 5 ولت در Uno WiFi Rev2
  • INTERNAL0V55: یک مرجع داخلی 0.55 ولت
  • INTERNAL1V1: یک مرجع داخلی 1.1 ولت
  • INTERNAL1V5: یک مرجع داخلی 1.5 ولت
  • INTERNAL2V5: مرجع 2.5 ولت داخلی
  • INTERNAL4V3: یک مرجع داخلی 4.3 ولت
  • EXTERNAL: ولتاژ اعمال شده به پایه AREF (فقط 0 تا 5 ولت) به عنوان مرجع استفاده می شود.

 

برد های Arduino SAM (Due)

  • AR_DEFAULT: مرجع آنالوگ پیش فرض 3.3V. این تنها گزینه پشتیبانی شده برای Due است.

بردهای نانو سیستم عامل Arduino Mbed (Nano 33 BLE)، بردهای Arduino Mbed OS Edge (Edge Control)

AR_VDD: مرجع پیش فرض 3.3 ولت

AR_INTERNAL: مرجع داخلی 0.6 ولت

AR_INTERNAL1V2: مرجع 1.2 ولت (مرجع داخلی 0.6 ولت با بهره 2 برابری)

AR_INTERNAL2V4: مرجع 2.4 ولت (مرجع داخلی 0.6 ولت با بهره 4 برابری)

ساختار کد دستور:

analogReference (نوع)

مولفه ها:

نوع: کدام نوع مرجع استفاده شود (لیست توضیحات را در قسمت شرح تابع مشاهده کنید)

نتیجه:

تغیر ولتاژ مرجع برای پورت آنالوگ

یادداشت ها و اخطارها:

پس از تغییر مرجع آنالوگ ، ممکن است چند قرائت اول از ()analogRead دقیق نباشد. برای ولتاژ مرجع خارجی در پایه AREF از چیزی کمتر از 0 ولت یا بیشتر از 5 ولت استفاده نکنید!

اگر از یک مرجع خارجی در پایه AREF استفاده می کنید ، باید مرجع آنالوگ را بر روی EXTERNAL تنظیم کنید.

قبل از فراخوانی ()analogRead روی برد آردوینو از طرف دیگر ، می توانید ولتاژ مرجع خارجی را از طریق یک مقاومت 5K به پایه​​AREF متصل کنید ، به این ترتیب می توانید بین ولتاژهای مرجع خارجی و داخلی جابجایی کنید.

توجه داشته باشید که مقاومت ولتاژ مورد استفاده را به عنوان مرجع تغییر می دهد زیرا یک مقاومت داخلی 32K در پایه AREF وجود دارد.

این دو به عنوان یک تقسیم ولتاژ عمل می کنند ، به عنوان مثال ، 2.5 ولت که از طریق مقاومت استفاده می شود؛ در پایه AREF حاصل 2.5 * 32 / (32 + 5) = 2.2V  به دست می آید.

      برای رفتن به لیست توابع کلیک کنید

;()analogWrite

شرح:

مقدار خروجی آنالوگ (ارتباطی با ورودی های آنالوگ ندارد) موج (PWM) را روی پین می نویسد. می توان برای روشنایی یک LED در روشنایی های مختلف یا حرکت یک موتور با سرعت های مختلف استفاده کرد. (آموزش جامل عملکرد موج PWM)

پس از فراخوانی ()analogWrite ، پین موج مربعی پایدار از چرخه وظیفه مشخص شده را تا زمان فراخوانی بعدی  ()analogWrite یا فراخوانی ()digitalRead یا ()digitalWrite در همان پایه خروجی آنالوگ ایجاد می کند.

فرکانس خروجی آنالوگ:

فرکانس سیگنال PWM در بیشتر پین ها تقریباً 490 هرتز است. در برد های Uno و مشابه ، پین های 5 و 6 فرکانس تقریبی 980 هرتز دارند.
در اکثر تابلوهای آردوینو  (آنهایی که دارای ATmega168 یا ATmega328P هستند) ؛
این عملکرد بر روی پایه های 3 ، 5 ، 6 ، 9 ، 10 و 11 کار می کند.
در آردوینو مگا ، روی پایه های 2 – 13 و 44 – 46 کار می کند.
برد هایی با ATmega8 فقط از ()analogWrite در پین های 9 ، 10 و 11 پشتیبانی می کنند.

آردوینو DUE از  ()analogWrite در پین های 2 تا 13 پشتیبانی می کند ، به علاوه پین ​​های DAC0 و DAC1. برخلاف پین های PWM ، DAC0 و DAC1 از مبدل های دیجیتال به آنالوگ هستند و به عنوان خروجی های آنالوگ واقعی عمل می کنند.

برای تنظیم پایه به عنوان خروجی آنالوگ قبل از فراخوانی ()analogWrite ، نیازی به فراخوانی ()pinMode ندارید.

عملکرد analogWrite هیچ ارتباطی با پایه های ورودی آنالوگ یا عملکرد analogRead ندارد!

آموزش توابع آردوینو خروجی آنالوگ

* علاوه بر قابلیت های PWM در پایه های ذکر شده در بالا ، تابلوهای MKR و Zero هنگام استفاده از ()analogWrite در پایه DAC0 (A0)  دارای خروجی آنالوگ واقعی هستند.
** علاوه بر قابلیت های PWM در پین های ذکر شده در بالا ، با توجه به استفاده از ()analogWrite در پایه DAC0 (A0)   DAC1 (A1)  دارای خروجی آنالوگ واقعی هستند.

برای استفاده از ()analogWrite نیازی به تنظیم پایه به عنوان خروجی با ()pinMode ندارید.  

عملکرد analogWrite ربطی به پایه های آنالوگ یا عملکرد analogRead ندارد!

ساختار کد دستور:

analogWrite(pin, value);

مولفه ها:

pin: شماره پایه برای نوشتن موج (داده مجاز:  int )
value: چرخه وظیفه؛ بین 0 (همیشه خاموش) و 255 (همیشه روشن) (داده مجاز: int )

نتیجه:

مقدار داده شده به نسبت از ولتاژ مرجع روی پین اعمال میشود. (با توجه به فرکانس هر پین)

کد نمونه:

این کد خروجی را به LED متناسب با مقدار خوانده شده از پتانسیومتر تنظیم می کند.

				
					int ledPin = 6;            // به پین دیجیتال 6 متصل است LED 
int analogPin = 0;         // پتانسیومتر به پین آنالوگ 0 متصل است
int val = 0;               // متغیر برای ذخیره مقدار خوانده شده
void setup()
{
pinMode(ledPin, OUTPUT);   // پین را به عنوان خروجی تنظیم می کند
}
void loop()
{
val = analogRead(analogPin); // پین ورودی را میخواند
// مقادیر خوانده شده عددی بین 0 تا 1023 هستند که به دامنه 0 تا 255 تبدیل میکنیم و در پایه مورد نظر موج را ایجاد میکنیم
analogWrite(ledPin, val / 4);
}

				
			

یادداشت ها و اخطارها:

خروجی های PWM تولید شده روی پین های 5 و 6 بالاتر از چرخه های وظیفه غیرمنتظره خواهند بود. این به دلیل تعامل با ()millis  و توابع ()delay است ، که همان تایمر داخلی استفاده شده برای تولید آن خروجی PWM را دارند. این امر بیشتر در تنظیمات چرخه کم کار (به عنوان مثال 0 – 10) مشاهده می شود و ممکن است به مقدار 0 منجر شود که خروجی را روی پین های 5 و 6 خاموش کند.

      برای رفتن به لیست توابع کلیک کنید

مخصوص برد های آردوینو از خانواده Zero, Due و MKR

در برخی از پردازنده ها امکانات مضاعفی برای برنامه نویسی حرفه ای تر در اختیار دارید. عمدتاً پردازنده های 32 بیتی مانند خانواده میکروکنترلر های ARM یا پردازنده های وای فای که از هسته 32 بیتی استفاده میکنند، توابع بیشتری برای دسترسی عمیق تر به جزئیات پردازشگر را در اختیار شما قرار می دهد. در بخش قبلی توابع ورودی و خروجی آنالوگ مورد برسی قرار گرفت. به طور پیش فرض برای خواندن مقادیر آنالوگ، دقت 10 بیتی (0 تا 1023) و برای نوشتن (PWM) دقت 8 بیتی (0 تا 255) در اختیار داشتید. اما در آموزش توابع آردوینو…

در آموزش توابع آردوینو به کمک 2 تابع فوق دقت رجیستر های ورودی و خروجی آنالوگ میکروکنترلر را کنترل میکنیم. (فقط در برد های نامبرده قابل استفاده است!)
جهت شرکت در دوره، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.

      برای رفتن به لیست توابع کلیک کنید

;()analogReadResolution

شرح:

 ()analogReadResolution پسوند API ورودی آنالوگ (ارتباطی با خروجی های آنالوگ ندارد) برای خانواده برد های آردوینو Zero، Due، MKR، Nano 33 (BLE و IoT) و Portenta است.
اندازه (در بیت) مقدار برگشتی توسط ()analogRead را تنظیم می کند. این دقت 10 بیت (مقادیر بین 0 تا 1023) برای سازگاری با برد های مبتنی بر AVR است.
برد های آردوینو Zero, Due و MKR از قابلیت ADC 12 بیتی برخوردار هستند که می توانید با تغییر دقت ورودی آنالوگ به 12 دسترسی پیدا کنید.  ()analogRead این مقادیر را از 0 تا 4095 باز می گرداند.

برد های Portenta H7 دارای  ADC 16 بیتی است، که به شما مقادیر بین 0 تا 65535 را در دسترس قرار می دهد.

ساختار کد دستور:

analogReadResolution (بیت);

مولفه ها:

بیت: دقت (در بیت) مقدار برگشتی را تعیین می کند. شما می توانید این را بین 1 تا 32 تنظیم کنید. (رزولوشن های بالاتر از 12 یا 16 بیت های پشتیبانی شده را تنظیم کنید)

اما مقادیر بازگردانده شده توسط ()analogRead دچار تقریب خواهند شد. برای جزئیات به یادداشت زیر مراجعه کنید.

 کد نمونه:

این کد نحوه استفاده از ADC را با دقت های مختلف را نشان می دهد.

				
					void setup() 
{
Serial.begin(9600);                         // تنظیم اتصال سریال
}
void loop() 
{
analogReadResolution(10);                   //  با وضوح پیش فرض (10 بیت) A0 خواندن ورودی در 
Serial.print("ADC 10-bit (default): ");
Serial.print(analogRead(A0));               // و آن را از طریق سریال ارسال کنید
analogReadResolution(12);                   // را بخوانید A0وضوح را به 12 بیت تغییر دهید و 
Serial.print(", 12-bit: ");
Serial.print(analogRead(A0));
analogReadResolution(16);                   // را بخوانید A0وضوح را به 16 بیت تغییر دهید و
Serial.print(", 16-bit: ");
Serial.print(analogRead(A0));
analogReadResolution(8);                    // را بخوانید A0وضوح را به 8 بیت تغییر دهید و
Serial.print(", 8-bit: ");
Serial.println(analogRead(A0));
delay(100;(                                 // کمی تاخیر برای هنگ نکردن سریال مانیتور
}

				
			

یادداشت ها و اخطارها:

اگر مقدار ()analogReadResolution را روی مقداری بالاتر از قابلیت های برد خود تنظیم کنید، آردوینو فقط با بالاترین دقت خود گزارش می دهد و بیت های اضافی را با صفر پر می کند.

به عنوان مثال: برای استفاده از analogReadResolution(16) با برد آردوینو Due یک عدد تقریبی 16 بیتی به شما می دهد که 12 بیت اول حاوی ADC واقعی و 4 بیت آخر با صفر هستند. اگر مقدار ()analogReadResolution را روی مقداری کمتر از قابلیت‌های برد خود تنظیم کنید، بیت‌های کم‌ اهمیت خواندنی از ADC کنار گذاشته می‌شوند.

استفاده از رزولوشن 16 بیتی (یا هر رزولوشن بالاتر از قابلیت های سخت افزاری واقعی) به شما امکان می دهد برنامه هایی بنویسید که به طور خودکار در برد های آردوینو با دقت ADC بالاتر که در برد های آینده در دسترس قرار می گیرند بدون تغییر برنامه قابل استفاده باشند.

      برای رفتن به لیست توابع کلیک کنید

;()analogWriteResolution

شرح:

()analogWriteResolution پسوند API خروجی آنالوگ (ارتباطی با ورودی های آنالوگ ندارد) برای آردوینو due است.
()analogWriteResolution  دقت تابع ()analogWrite را تعیین می کند. برای سازگاری با برد های مبتنی بر AVR، پیش‌فرض 8 بیت (مقادیر بین 0 تا 255) است.

Due دارای قابلیت های سخت افزاری زیر است:

  • 12 پایه که به طور پیش فرض PWM دقت 8 بیتی هستند، (مانند بردهای مبتنی بر AVR) این ها را می توان به دقت 12 بیت تغییر داد.
  • 2 پایه DAC با دقت 12 بیتی (تبدیل دیجیتال به آنالوگ)
  • با تنظیم دقت نوشتن بر روی 12، می توانید از ()analogWrite با مقادیر بین 0 تا 4095 برای بهره برداری از وضوح کامل DAC یا تنظیم سیگنال PWM بدون چرخش استفاده کنید.

Zero دارای قابلیت های سخت افزاری زیر است:

  • 10 پایه که به طور پیش فرض روی PWM با دقت 8 بیت هستند، مانند بردهای مبتنی بر AVR. این ها را می توان به وضوح 12 بیت تغییر داد.
  • 1 پایه DAC با دقت 10 بیتی (تبدیل دیجیتال به آنالوگ).
  • با تنظیم رزولوشن نوشتن روی 10، می توانید از ()analogWrite با مقادیر بین 0 تا 1023 برای بهره برداری از وضوح کامل DAC استفاده کنید.

خانواده بردهای MKR دارای قابلیت های سخت افزاری زیر است:

  • 4 پایه که به طور پیش فرض روی PWM با دقت 8 بیت هستند، مانند بردهای مبتنی بر AVR. این ها را می توان از 8 (پیش فرض) به دقت 12 بیت تغییر داد.
  • 1 پایه DAC با دقت 10 بیتی (تبدیل دیجیتال به آنالوگ)
  • با تنظیم دقت نوشتن روی 12 بیت، می توانید از ()analogWrite با مقادیر بین 0 تا 4095 برای سیگنال های PWM استفاده کنید. 10 بیت را روی پین DAC تنظیم کنید تا از وضوح کامل DAC 1024 استفاده کند.

ساختار کد دستور:

analogWriteResolution (بیت);

مولفه ها:

بیت:  دقت (در بیت) مقادیر مورد استفاده در تابع ()analogWrite را تعیین می کند. مقدار می تواند از 1 تا 32 باشد. اگر دقت خروجی آنالوگ بالاتر یا پایین تر از قابلیت های سخت افزاری خود انتخاب کنید ، مقدار استفاده شده در ()analogWrite اگر خیلی بزرگ باشد، کوچک می شود یا اگر خیلی کوچک باشد با صفر پر می شود. برای جزئیات به یادداشت زیر مراجعه کنید.

کد نمونه:

مقدار پتانسیومتر متصل به ورودی آنالوگ را میخواند و با سه دقت بر روی سه خروجی آنالوگ PWM تولید میکند.

				
					void setup() {
// اتصال سریال را باز کنید
Serial.begin(9600);
//پین دیجیتال را به یک خروجی تبدیل می کند 
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
// ورودی را در A0 بخوانید و آن را روی یک پین PWM قرار دهید
// با یک LED وصل شده
int sensorVal = analogRead(A0);
Serial.print("Analog Read:");
Serial.print(sensorVal);
وضوح پیش فرض // PWM
analogWriteResolution(8);
analogWrite(11, map(sensorVal, 0, 1023, 0 ,255));
Serial.print(" , 8-bit PWM value :");
Serial.print(map(sensorVal, 0, 1023, 0 ,255));
//وضوح PWM را به 12 بیت تغییر دهید
//وضوح کامل 12 بیتی فقط پشتیبانی می شود
//درDue
analogWriteResolution(12);
analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));
Serial.print(" , 12-bit PWM value :");
Serial.print(map(sensorVal, 0, 1023, 0, 4095));
//   وضوح موج تولید شده را به 4 بیت تغییر دهید 
analogWriteResolution(4);
analogWrite(13, map(sensorVal, 0, 1023, 0, 15));
Serial.print(", 4-bit PWM value :");
Serial.println(map(sensorVal, 0, 1023, 0, 15));
delay(5);
}

				
			

یادداشت ها و اخطارها:

اگر مقدار ()analogWriteResolution را روی مقداری بالاتر از قابلیت های برد خود تنظیم کنید ، آردوینو بیت های اضافی را دور می زند.  به عنوان مثال: با استفاده از analogWriteResolution(16) در برد آردوینو Due  در DAC یک پایه 12 بیتی ، فقط 12 بیت اول مقادیر منتقل شده به ()analogWrite استفاده خواهد شد و 4 بیت آخر دور انداخته می شوند.
اگر مقدار ()analogWriteResolution را روی مقداری پایین تر از قابلیت های برد خود تنظیم کنید ، بیت های مفقود شده برای پر کردن اندازه مورد نیاز سخت افزار با صفرها جمع می شوند. به عنوان مثال: با استفاده از analogWriteResolution(8) در برد آردوینو Due در DAC پایه 12 بیتی ، آردوینو  برای بدست آوردن 12 بیت موردنیاز ، 4 بیت صفر را به مقدار 8 بیتی مورد استفاده در ()analogWrite اضافه می کند.

      برای رفتن به لیست توابع کلیک کنید

اشتراک گذاری این نوشته

دانشجوی مکاترونیک هستم و در زمینه اتوماسیون و توسعه صنعت فعالیت میکنم. به اشتراک گذاری تجربیات و خورده دانشی که از الکترونیک دارم علاقمند هستم.

شاید این مطالب براتون جذاب باشه!

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری