• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Enkoder na silniku
#4
Źle zrozumiałem, przepraszam. Dla każdego obrotu ma być taka sama liczba impulsów, różna jest w sensie na sekundę.
Zapewne procek się nie wyrabia. W przerwaniu powinno być tylko zliczanie impulsów, a w szczególności nie może być tam Serial.println(obroty);

Kod:
volatile int impulsy=0;
int obroty =0;



void setup() {
// put your setup code here, to run once:
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(5,OUTPUT);
analogWrite(5,100);


digitalWrite(6,HIGH);
digitalWrite(7,LOW);

attachInterrupt(1,Odleglosc,RISING);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:

if(impulsy >= 1920){
[size=small][font=Monaco, Consolas, Courier, monospace]obroty = obroty +1;[/font][/size]
[size=small][font=Monaco, Consolas, Courier, monospace]Serial.println(obroty);[/font][/size]

impulsy=0;
}

}

void Odleglosc ()
{

impulsy++;

}
Wchodząc w obsługę przerwania procek staje się głuchy i ślepy, tylko inne przerwanie o wyższym priorytecie może je przerwać, a w Arduino chyba po prostu są wyłączane. Musi być dopisane volatile by można było zmieniać zmienną impulsy zarówno w przerwaniu jak i w pętli głównej. impulsy >= 1920 raczej teraz tak, bo może się zdarzyć, że moment == zostanie przegapiony. Samo  drukowanie obrotów również uzależniłbym od stałego interwału czasowego, nie samych obrotów, ale to już mniej istotne. Ewentualnie wywalić tylko drukowanie z przerwania, nie wiem co to ma robić i po co, ile może być maks takich impulsów/s, także sam zdecyduj jak skrócić czas przerwania, musi być minimum. Samo przerwanie zajmuje około 15 cykli zegarowych (skok programu, odkładanie aktualnej pracy na bok, powrót do pracy) + cykle zegara wymagane na obsługę samych instrukcji napisanych w funkcji przerwania, teocentrycznie jest możliwe zliczenie 1mln na procku AVR 16MHz. Praktycznie już przy zmiennej int jest trzy-cztery razy mniej przy 100% czasu działania tylko i wyłączenie przerwania, jeśli pętla ma zająć kolejne cykle zegarowe, bo po coś te dane w przerwaniu są zbierane, to już się robią tylko tysiące możliwe do zliczania. No przynajmniej stale. Jak coś się kręci 15kHz to można to odpalać na ułamek sekundy, zliczać i wracać do normalnej pracy.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
Enkoder na silniku - przez Janek_gl - 11-03-2018, 00:43
RE: Enkoder na silniku - przez kaczakat - 11-03-2018, 01:26
RE: Enkoder na silniku - przez Janek_gl - 11-03-2018, 09:08
RE: Enkoder na silniku - przez kaczakat - 11-03-2018, 11:07
RE: Enkoder na silniku - przez Janek_gl - 11-03-2018, 12:03
RE: Enkoder na silniku - przez Smaczek - 12-03-2018, 09:22
RE: Enkoder na silniku - przez kaczakat - 13-03-2018, 02:15
RE: Enkoder na silniku - przez krn78 - 13-03-2018, 14:46
RE: Enkoder na silniku - przez kaczakat - 13-03-2018, 23:43
RE: Enkoder na silniku - przez Smaczek - 14-03-2018, 08:43
RE: Enkoder na silniku - przez krn78 - 14-03-2018, 12:33

Skocz do:


Przeglądający: 1 gości