میکروکنترلر ATmega328P، بر خلاف بسیاری از میکروکنترلرهای جدیدتر، فاقد آپ-امپ (Op-Amp) داخلی واقعی است که بتوان آن را به عنوان یک تقویتکننده خطی پیکربندی کرد. چیزی که ATmega328P دارد، یک مقایسه کننده آنالوگ (Analog Comparator) داخلی است.
این مقایسهکننده آنالوگ برای مقایسه دو ولتاژ آنالوگ طراحی شده و خروجی دیجیتال (صفر یا یک) تولید میکند که نشان میدهد کدام ولتاژ بزرگتر است. گرچه ممکن است در برخی کاربردهای بسیار خاص و با مدارات جانبی پیچیده بتوان از مقایسهکننده برای شبیهسازی عملکرد یک آپ-امپ ساده استفاده کرد (مثلا در مد اشباع)، اما این کار معمول و توصیه نمیشود و با عملکرد یک آپ-امپ واقعی متفاوت است.
نحوه استفاده از مقایسهکننده آنالوگ داخلی ATmega328P:
مقایسهکننده آنالوگ ATmega328P دارای دو ورودی آنالوگ به نامهای AIN0 (پایه مثبت) و AIN1 (پایه منفی) است. همچنین میتوانید ورودی منفی (AIN1) را به ولتاژ مرجع داخلی (Bandgap Voltage) متصل کنید. خروجی مقایسهکننده در یک بیت به نام ACO در رجیستر ACSR (Analog Comparator Control and Status Register) ذخیره میشود.
برای استفاده از این مقایسهکننده، مراحل کلی زیر را باید دنبال کنید:
- پیکربندی رجیستر ACSR:این رجیستر وظیفه کنترل و وضعیت مقایسهکننده آنالوگ را بر عهده دارد. مهمترین بیتهای این رجیستر عبارتند از:
- ACD (Analog Comparator Disable): برای فعال یا غیرفعال کردن مقایسهکننده (0 برای فعال، 1 برای غیرفعال).
- ACBG (Analog Comparator Bandgap Select): اگر این بیت 1 باشد، ورودی منفی مقایسهکننده (AIN1) به ولتاژ Bandgap داخلی میکروکنترلر (حدود 1.1 ولت) متصل میشود. اگر 0 باشد، از پایه AIN1 استفاده میشود.
- ACO (Analog Comparator Output): این بیت خروجی مقایسهکننده را نشان میدهد. اگر ولتاژ AIN0 > AIN1 باشد، ACO یک (High) میشود، در غیر این صورت صفر (Low) خواهد بود.
- ACI (Analog Comparator Interrupt Flag): پرچم وقفه مقایسهکننده. وقتی یک وقفه رخ میدهد، این بیت 1 میشود.
- ACIE (Analog Comparator Interrupt Enable): برای فعال کردن وقفه مقایسهکننده (اگر 1 باشد، وقفه فعال میشود).
- ACIC (Analog Comparator Input Capture Enable): اگر این بیت 1 شود، خروجی مقایسهکننده میتواند واحد Input Capture یکی از تایمرها را تحریک کند.
- ACIS1, ACIS0 (Analog Comparator Interrupt Select Bits): این دو بیت تعیین میکنند که وقفه در چه شرایطی رخ دهد (لبه بالا رونده، لبه پایین رونده یا هر تغییر).
- تنظیم پایهها:
- AIN0: به طور پیشفرض، ورودی مثبت مقایسهکننده به پین AIN0 (پین 12 در پکیج DIP28 ATmega328P یا پین D6 در برد آردوینو Uno) متصل است.
- AIN1: ورودی منفی مقایسهکننده به طور پیشفرض به پین AIN1 (پین 13 در پکیج DIP28 ATmega328P یا پین D7 در برد آردوینو Uno) متصل است، مگر اینکه ACBG فعال شده باشد.
- مطمئن شوید که این پایهها به عنوان ورودی (Input) پیکربندی شدهاند (DDRA یا DDRD مربوط به این پایهها باید صفر باشد).
- خواندن خروجی یا استفاده از وقفه:
- خواندن مستقیم: میتوانید با خواندن بیت ACO در رجیستر ACSR، وضعیت مقایسه را به صورت لحظهای بررسی کنید.
- استفاده از وقفه: برای واکنش به تغییرات ولتاژ بدون نیاز به پایش مداوم، میتوانید وقفه مقایسهکننده آنالوگ را فعال کنید. با فعال کردن ACIE و تنظیم ACIS1/ACIS0، میکروکنترلر به طور خودکار با تغییر خروجی مقایسهکننده، وارد روال وقفه میشود.
مثال کد (با استفاده از آردوینو IDE برای سادگی):
فرض کنید میخواهیم ولتاژ روی پایه آنالوگ A0 را با یک ولتاژ مرجع (مثلاً 2.5 ولت) مقایسه کنیم و اگر ولتاژ A0 بالاتر بود، یک LED روی پین 13 روشن شود. (توجه: A0 در آردوینو به یکی از پینهای ADC وصل است، برای استفاده از AIN0 و AIN1 باید پینهای دیجیتال 6 و 7 را به عنوان ورودیهای مقایسهکننده استفاده کرد).
// تعریف پین های آردوینو متناظر با AIN0 و AIN1
const int AIN0_PIN = 6; // D6 در آردوینو Uno
const int AIN1_PIN = 7; // D7 در آردوینو Uno
const int LED_PIN = 13; // LED داخلی آردوینو
void setup() {
// تنظیم پین LED به عنوان خروجی
pinMode(LED_PIN, OUTPUT);
// غیرفعال کردن ADC برای آزاد کردن پین ها برای مقایسه کننده آنالوگ
// اگر ADC فعال باشد و ACME تنظیم شده باشد، می توان از ورودی های ADC به عنوان ورودی منفی مقایسه کننده استفاده کرد.
// در این مثال، فرض می کنیم فقط از AIN0 و AIN1 استفاده می کنیم.
ADCSRA &= ~_BV(ADEN); // غیرفعال کردن ADC
// تنظیم رجیستر ACSR برای فعال کردن مقایسه کننده آنالوگ
// ACSR = 0x00; // پیش فرض: AIN0 ورودی مثبت، AIN1 ورودی منفی، وقفه غیرفعال
// یا برای فعال کردن وقفه در هر تغییر وضعیت خروجی:
ACSR = (1 << ACIE) | (0 << ACIS1) | (0 << ACIS0); // فعال کردن وقفه مقایسه کننده، وقفه در هر تغییر
// فعال کردن Global Interrupt
sei();
Serial.begin(9600);
Serial.println("Analog Comparator Initialized.");
}
void loop() {
// در این مثال، از وقفه استفاده می کنیم، بنابراین حلقه اصلی می تواند کارهای دیگر را انجام دهد.
// می توانید در اینجا به صورت polling هم خروجی ACO را بخوانید:
// if (bit_is_set(ACSR, ACO)) {
// digitalWrite(LED_PIN, HIGH); // AIN0 > AIN1
// } else {
// digitalWrite(LED_PIN, LOW); // AIN0 < AIN1
// }
}
// روال سرویس وقفه (Interrupt Service Routine) برای مقایسه کننده آنالوگ
ISR(ANALOG_COMP_vect) {
if (bit_is_set(ACSR, ACO)) {
// اگر AIN0 > AIN1 باشد، LED روشن شود
digitalWrite(LED_PIN, HIGH);
Serial.println("AIN0 > AIN1");
} else {
// اگر AIN0 < AIN1 باشد، LED خاموش شود
digitalWrite(LED_PIN, LOW);
Serial.println("AIN0 < AIN1");
}
}
نکات مهم:
- دیتاشیت (Datasheet) ATmega328P: همواره به دیتاشیت رسمی ATmega328P مراجعه کنید. این جامعترین منبع برای جزئیات رجیسترها و عملکرد این واحد است.
- تفاوت Op-Amp و Comparator: مهم است که تفاوت این دو را درک کنید. Op-Amp برای تقویت سیگنالهای آنالوگ با فیدبک (Feedback) طراحی شده و خروجی خطی دارد. Comparator فقط برای مقایسه دو ولتاژ و تولید خروجی دیجیتال (صفر یا یک) استفاده میشود. استفاده از آپ-امپ به جای مقایسهکننده معمولاً مشکلساز نیست، اما استفاده از مقایسهکننده به جای آپ-امپ برای تقویت خطی مناسب نیست.
- ولتاژ مرجع (Reference Voltage): میتوانید از ولتاژ Bandgap داخلی به عنوان یک ولتاژ مرجع پایدار استفاده کنید، یا یک ولتاژ مرجع خارجی به AIN1 (در صورت عدم استفاده از Bandgap) بدهید.
- مصرف توان: مقایسهکننده آنالوگ را میتوان برای صرفهجویی در مصرف توان در حالت غیرفعال (Disable) قرار داد.
با در نظر گرفتن این نکات و مطالعه دیتاشیت، میتوانید از مقایسهکننده آنالوگ ATmega328P در پروژههای خود استفاده کنید.
سایت آموزشی الکترونیک و کامپیوتر اوپن مقاله های آموزشی الکترونیک و کامپیوتر و فن آوری