Mám problém, potřebuji naprogramovat přívěru pro motorku. Jde o to že podle otáček se má posouvat servo z 50° na 130°, není to nic složitého, na internetu je hromada programů na měření otáček. Na interrupt (pin 2) se připojí signál e zapalovací cívky a arduino počítá. Jenže Ardino počítá zhruba do 5000 otáček. Zde si již samo sebou není moc jisté. Proto jsem nastavil aby se přívěra otevírala při 3000. ona se otevře, ale když zvyšuji otáčky, tak se servo chová, jakoby nevědělo, kde má být. Mám tám i indikační LED která svítí při překročení hodnoty a ta svítí přesně jak má, ale to servo funguje jen do 4000 a pak se vrátí do základní polohy(0°). Z tohoto jsem usoudil, že někde kolidují časovače. Dokonce arduino přestane komunikovat s PC.(i na servo se používají, alespoň myslím) Nevíte, jak by se to dalo SW vyřešit? Jinak bych dal BCD čítač a použil ho jako děličku.
Signál z cívky jsou 4 impulzy a ty jsou pomocí R a C vyrovnány do jednoho, vnikně z toho cosi, to proženu schmiťákem a jdou z toho krásné obdelníky takže tady bych vadu nehledal.
Program
Kód: Vybrat vše
//-----------------------------------------------
#include <Servo.h>
volatile byte half_revolutions;
unsigned int rpm;
unsigned long timeold;
Servo myservo;
void setup()
{
myservo.attach(9); // TU SERVO PIN
pinMode(13, OUTPUT);
Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
half_revolutions = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
if (half_revolutions >= 20) {
//Update RPM every 20 counts, increase this for better RPM resolution,
//decrease for faster update
rpm = 30*1000/(millis() - timeold)*half_revolutions;
timeold = millis();
half_revolutions = 0;
Serial.println(rpm,DEC);
}
if (rpm > 5000){ //mezní otáčky
digitalWrite(13, HIGH);
myservo.write(130); // TU JAK MOC SE OTEVRE
}
else
{
digitalWrite(13, LOW);
myservo.write(50); //jak moc se servo zavře
}
}
void rpm_fun()
{
half_revolutions++;
//Each rotation, this interrupt function is run twice
}
//-----------------------------------------------