با سلام خدمت دوستان گرامی
من میخوام از سنسور اثر هال برای گرفتن دور موتور با برد آردوینو مگا 2560 استفاده کنم. پروژه ای که کار میکنم کنترل کننده موتور با PID هست، برای کنترل دور موتور در هر لحظه باید تغییرات سرعت موتور رو داشته باشم تا PID بتونه دور موتور رو ثابت نگه داره ولی برنامه ای که برای خوندن دور موتور(با سنسور اثر هال) تونستم پیدا کنم (از سایت دیجی اسپارک) تغییرات دور در هر 1 ثانبه نمایش داده میشه که تو این 1 ثانیه دور موتور تقریبا 15rpm یهو زیاد میشه و PID نمیتونه کنترل داشته باشه.
نمیدونم چطور میتونم تغییرات دور موتور رو در هر لحظه داشته باشم. با کم کردن مقدار sampleTime = 1000; هم درست کار نمیکنه.
خواهش می کنم کمکم کنید . ممنون میشم.
برنامه دورسنج با اثرهال (که از سایت محترم دیجی اسپارک برداشتم) رو قرار میدم:

//-----DigiSpark-------------

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int hallSensorPin = 2;
const unsigned long sampleTime = 1000;
const int maxRPM = 1260; // maximum RPM for LCD Bar
int rpmMaximum = 0;

void setup()
{
pinMode(hallSensorPin,INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Initializing");
delay(1000);
lcd.clear();
}

void loop()
{
delay(100);
int rpm = getRPM();
if (rpm > rpmMaximum) rpmMaximum = rpm;
lcd.clear();
displayRPM(rpm);
}

int getRPM()
{
int count = 0;
boolean countFlag = LOW;
unsigned long currentTime = 0;
unsigned long startTime = millis();
while (currentTime <= sampleTime)
{
if (digitalRead(hallSensorPin) == HIGH)
{
countFlag = HIGH;
}
if (digitalRead(hallSensorPin) == LOW && countFlag == HIGH)
{
count++;
countFlag=LOW;
}
currentTime = millis() - startTime;
}
int countRpm = int(60000/float(sampleTime))*count;
return countRpm;
}

void displayRPM(int rpm)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(rpm,DEC);
lcd.setCursor(7,0);
lcd.print(rpmMaximum, DEC);
lcd.setCursor(13,0);
lcd.print("MAX");
Serial.print("RPM = ");
Serial.print(rpm);
Serial.print(" MAX RPM = ");
Serial.println(rpmMaximum);
}