• 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
Utrzymywanie zadanych obrotów silnika spalinowego w agregacie prądotwórczym DIY
#21
Jak 3R to czujnik optyczny w rozdzielaczu WN wtedy sygnał z cewki był by w sam raz... Z czym sobie tam nie poradziłeś? przecież sygnałowy to impulsy z tym że tam napięcie 14V ale to nie problem...


" funkcji interrupt." nie będziesz wiedział które zbocze wywołało przerwanie ja nadal jestem za ICP...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#22
(28-03-2020, 14:48)dankal666 napisał(a): Gdyby silnik reagował szybciej na obciążenie i nie dopuszczał do zbytnich spadków obrotów nie będzie problemu.
Jak chcesz reagować szybciej gdy używając nieprecyzyjnego pulsein uśredniasz wyniki?
 
Odpowiedź
#23
@fast_rabbit autor już wie, że pulsein nie nadaje się do tego celu i poszukuje innego sposobu pomiaru obrotów a właściwie czasu najlepiej jednego obrotu. Czy możesz coś zaproponować?
 
Odpowiedź
#24
Proponuję powrót do porad z początku wątku i tego co napisał kolega @kaczkat, czyli poczytać o PID. Pomiar jest oczywiście ważny, ale już samo mierzenie szerokości impulsu jest błędne, więc poprawianie i tak niewiele pomoże.
Użycie PID to znacznie ważniejsza zmiana. W końcu przy 3000obr/min mamy 50 impulsów na sekundę, układ nie musi reagować już po 1/50sekundy, nawet chyba nie powinien bo mechanika może tego nie wytrzymać. Więc mając dane z pulseIn, prosty filtr i PID powinno się udać uzyskać to o co w temacie chodzi.
 
Odpowiedź
#25
Bardzo dziękuję za odzew,
dzisiaj zacząłem od odczytu kroków serwa w mikrosekundach i przerobiłem servo.write na writeMicroseconds. Efektem tego jest zdecydowanie gładsza praca serwa i trochę dokładniejsze dozowanie 'gazu'. Niestety zauważyłem również, że przy stałym obciążeniu obroty delikatnie falują od zadanych niskich do zadanych wysokich i tak w kółko. Serwo nie jest w stanie na tyle precyzyjnie ustawić pozycji przepustnicy, żeby obroty dłużej utrzymywały się na tym samym poziomie. Zastanawiam się nad dodatkową przekładnią między serwem, a przepustnicą. Może zamontowanie długiego ramienia na osi przepustnicy i serwa przy jego końcu rozwiązałoby sprawę. Dodatkowo pozmieniałem wartości warunków i efekt tego jest taki, że całość przestała się 'wywalać' ze względu na zbyt duże wahania obrotów i restart avrek.
Teraz chciałbym zająć się przede wszystkim ewentualną implementacją PID, żeby dodatkowo usprawnić to co jest, a dopiero później zmieniać rodzaj pomiaru na szybszy. Mój odczyt przy 25 próbkach zajmuje dokładnie 0,64 sekundy. Wydaje mi się, że od biedy może wystarczyć, oczywiście tylko na czas dopracowania czegoś lepszego. Jutro w wolnej chwili postaram się coś sklecić i wkleić tutaj, mam nadzieję, że Pomożecie Smile
 
Odpowiedź
#26
Input = srednia; // czy mogę tak zrobić?

double gap = abs(Setpoint-Input); //distance away from setpoint
if(gap<10)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}

myPID.Compute();
// analogWrite(3,Output); w przykładzie funckcja steruje wyjściem analogowym

serwo.writeMicroseconds(Output); // Ja potrzebuję żeby output przyjmowało wartości od 544 (pozycja 0 serwa) do ok 1000 mikrosekund ( dalej jeszcze serwa nie ruszałem)
// Czy najpierw zamienić output na mikrosekundy?
 
Odpowiedź
#27
Wpisałem setpoint 920, gdzie ta wartość odpowiada ok 50Hz. W przykładzie jest 100, zakres 0-255.
Jakie wartości przyjmuje zmienna output? Zakładam , że wpisując w setpoint i input wartości długości impulsu, output też będzie w długości fali, czy ma Ktoś może pomysł jak to zamienić na mikrosekundy?
 
Odpowiedź
#28
Szkoda ze ci nie powiedzieli że regulator PID w twoim przypadku może być za wolny. On nadaje się tylko do regulacji temperatury itp. gdzie nie jest wymagana szybkość..

W robotyce stosuje się regulatory PD proporcjonalno - różniczkujący, człon całkujący jest wolny....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#29
Może jednak w ramach nauki najpierw spróbuję z PIDem. Masz może pomysł jak to napisać, żeby output skonwertować do mikrosekund?
 
Odpowiedź
#30
Jarewa0606 -->
W regulatorze PID, jak ustawisz I na zero, to masz PD, więc w czym problem?
To jest bardzo uniwersalna technologia i możesz się zdziwić jak szybko to działa.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości