قابل استفاده برای تمامی مدلهای ESP-0806
در این آموزش با روش آدرسدهی ورودیهای دیجیتال و نحوه استفاده از آنها در پیالسی ایرانی ESP-0806 آشنا میشوید.
این آموزش برای برنامهنویسان صنعتی طراحی شده که با زبان Structured Text (STL) کار میکنند و قصد دارند پروژههای خود را سریعتر و دقیقتر پیادهسازی کنند.
این مقاله بخشی از مجموعهی آموزشهای کاربردی دستورات STL برای مدلهای مختلف ESP-0806 است.
پی ال سی های ESP-0806 دارای 8 ورودی دیجیتال می باشند که با آرایه I0[0] – I0[7] مشخص می شوند. I0 به اولین کارت پی ال سی یا همان CPU اشاره دارد و شماره 0-7 مربوط به ورودی های I0 الی I7 ماژول CPU می باشد.
ورودی های CPU در زبان STL با ساختاری بنام Input تعریف شده اند که دارای عناصر زیر می باشد:
– Value: نشان دهنده مقدار ورودی دیجیتال است که میتواند 0 یا 1 باشد.
– Rising: نشان دهنده لبه بالارونده ورودی دیجیتال است که بمدت یک سیکل اسکن فعال می شود.
– Falling: نشاندهنده لبه پایین رونده ورودی دیجیتال است که بمدت یک سیکل اسکن فعال می شود.
– FilterTime: زمان تنظیمی برای فیلتر ورودی دیجیتال است. مقدار پیش گزیده آن 10 میلی ثانیه است و در صورت نیاز می توان تغییر داد. – – InterruptEnable: اگر بخواهیم با فعال شدن هر کدام از ورودی ها, سرویس اینتراپت مخصوص آن اجرا شود,
// خواندن مقدار ورودی if (I0[0].Value) { // ورودی فعال است (HIGH) } else { // ورودی غیرفعال است (LOW) } // لبه صعودی: تشخیص تغییر از 0 به 1 if (I0[0].Rising) { // ورودی از LOW به HIGH تغییر کرده // این کد فقط یک بار اجرا میشود // لبه نزولی: تشخیص تغییر از 1 به 0 if (I0[0].Falling) { // ورودی از HIGH به LOW تغییر کرده // این کد فقط یک بار اجرا میشود } } //فیلتر نویز // تنظیم زمان فیلتر (میلیثانیه) I0[0].FilterTime = 10; // 10ms I0[0].FilterTime = 50; // 50ms I0[0].FilterTime = 0; // بدون فیلتر // تعریف تابع وقفه void myInterruptFunction(void) { // کد اجرا شده هنگام وقفه } // فعالسازی وقفه ConfigureInputInterrupt(&I0[0], myInterruptFunction); // غیرفعالسازی وقفه DisableInputInterrupt(&I0[0]);
if (I0[0].Rising) {
// دکمه فشار داده شده
// انجام عملیات مورد نظر
}
مثال 2: شمارنده پالس
static uint32_t pulseCount = 0;
if (I0[0].Rising) {
pulseCount++;
}
مثال 3: تشخیص فشاردادن طولانی شستی
static uint32_t pressStartTime = 0;
static bool longPressDetected = false;
if (I0[0].Rising) {
pressStartTime = espGetTimerTicks();
longPressDetected = false;
}
if (I0[0].Value && !longPressDetected) {
if ((espGetTimerTicks() - pressStartTime) > 3000) { // 3 ثانیه
longPressDetected = true;
// عملیات فشار طولانی
}
}
}
مثال 4: تشخیص چند ورودی همزمان
if (I0[0].Value && I0[1].Value && I0[2].Value) {
// هر سه ورودی فعال هستند
}
مثال 5: تشخیص توالی ورودیها
static uint8_t sequenceState = 0;
if (I0[0].Rising && sequenceState == 0) {
sequenceState = 1;
} else if (I0[1].Rising && sequenceState == 1) {
sequenceState = 2;
} else if (I0[2].Rising && sequenceState == 2) {
// توالی کامل شد
sequenceState = 0;
}
1. فیلتر نویز
همیشه از فیلتر مناسب استفاده کنید
فیلتر 10ms برای اکثر کاربردها مناسب است
برای سیگنالهای سریع فیلتر را کاهش دهید
2. وقفهها
از وقفه برای رویدادهای مهم استفاده کنید
تابع وقفه باید کوتاه و سریع باشد
از متغیرهای volatile در تابع وقفه استفاده کنید
ورودی تغییر نمیکند: فیلتر را بررسی کنید
لبهها تشخیص داده نمیشوند: ()espRun را فراموش نکنید
نویز زیاد: زمان فیلتر را افزایش دهید