//Motor çalışırken jikle aktivasyonunu önleyen program
const int sensorpin = 3; // Ateşleme sensörü girişi
const int pwmpin = 2; // Alıcıdan gelen jikle kanalı sinyali girişi
const int servopin = 4; // Jikle servosu çıkışı
const int setpospin = 0; // Trimpot ile jikle OFF servo konumu ayarlanıyor
const int butonL = 9;
const int buton = 11;
// Interruptlar sırasında değiştirilecek olan değişkenler
volatile unsigned long xpwm1;
volatile unsigned long xpwm2;
volatile unsigned long xrpm1;
volatile unsigned long xrpm2;
// Normal işleyişte kullanılacak değişkenler
unsigned long pwm1;
unsigned long pwm2;
unsigned long rpm1;
unsigned long rpm2;
// Yardımcı değişkenler
volatile byte pflag = 0;
volatile byte temp = 0;
unsigned long frame;
// Temel parametreler
unsigned long period; // Motor devir periyodu
unsigned int pwm; // Alıcıdan gelen darbe süresi
unsigned int servopwm; // Servoya gidecek darbe süresi
unsigned int offvalue; // Jikle OFF konumunu içeren değişken
void setup()
{
pinMode(servopin, OUTPUT);
pinMode(butonL, OUTPUT);
digitalWrite(butonL, LOW); // Buton için LOW sinyali oluşturduk
pinMode(buton, INPUT_PULLUP);
offvalue = 1000 + analogRead(setpospin); // Jikle OFF konumu çin belirlenen servo pozisyonu okunuyor
attachInterrupt(0, pwmread, CHANGE); // Alıcı sinyalini okumak için
attachInterrupt(1, rpmread, FALLING); // Ateşlemeyi okumak için
}
void loop()
{
if (digitalRead(buton) == 0)
{
setservo();
}
else
{
while (pflag == 0) // Alıcıdan yeni bir sinyal gelene kadar bekliyoruz
{
}
noInterrupts(); // Atomic read
pwm1 = xpwm1;
pwm2 = xpwm2;
rpm1 = xrpm1;
rpm2 = xrpm2;
interrupts();
if (pwm2 >= pwm1) pwm = pwm2 - pwm1; // PWM pulse süresi hesabı
if (rpm2 <= rpm1) period = rpm1 - rpm2; // RPM pulse süresi hesabı
if (period < 120000) // Motor devri 500'den fazla ise
{
servopwm = offvalue;
}
else // Motor devri 500'den az ise
{
servopwm = pwm;
}
servoout();
pflag = 0;
}
}
void pwmread() // Alıcı sinyalini okuyan interrupt işlevi
{
temp = digitalRead(pwmpin);
if (temp == 1) xpwm1 = micros();
if (temp == 0)
{
xpwm2 = micros();
pflag = 1;
}
}
void rpmread() // Motor devrini okuyan interrupt işlevi
{
interrupts();
xrpm2 = xrpm1;
xrpm1 = micros();
}
void servoout() // Jikle servosuna çıkış veren işlev
{
digitalWrite(servopin, HIGH);
delayMicroseconds(servopwm);
digitalWrite(servopin, LOW);
}
void setservo()
{
offvalue = 1000 + analogRead(setpospin); // Jikle OFF konumu çin belirlenen servo pozisyonu okunuyor
servopwm = offvalue;
frame = micros();
servoout();
while ((micros() - frame) < 20000)
{
}
}