• 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
Stabilizator obrotów silnika spalinowego
#27
Witam
Jest super Smile
Brnąc coraz głębiej, szukając zastosowania coraz to bardziej zagmatwanych poleceń i wciąż nie osiągając zadowalającego efektu – podeszliśmy do problemu „z innej beczki”.
Wychodząc z założenia, że im konstrukcja prostsza tym bardziej niezawodna – zacząłem to rozkminiać od podstaw, i tak:

-uśredniony odczyt z halla jest super (nie ruszać!)
-odczyt z halla jest ściśle związany z obrotami silnika więc przy tych moich wymarzonych 2500rpm wynosi po prostu ~3700,
-do utrzymania właśnie tej wartości ma dążyć program, ganiając z serwem w lewo lub prawo dotąd, aż ją osiągnie,
-czyli na dobrą sprawę mapowanie stało się zbędne bo wystarczy, że serwo poczynając od 0 dopyka po stopniu do optymalnych obrotów silnika (czyli również wartości odczytanej z halla) a potem, pykając stopień w przód lub w tył – po prostu ją utrzyma.
W ten sposób, zarówno utrzyma obroty bez obciążenia jak i wraz z jego wzrostem, będzie dalej uchylać przepustnicę starając się sprostać oczekiwaniom.
I odwrotnie, jak opory spadną i silnik będzie chciał się rozbujać – zacznie ją przymykać.
Wyszło mi, że kod spełniający taką funkcję musi wyglądać mniej/więcej tak:

Kod:
#include <Servo.h>
#define hallPin 2

Servo serwo;
volatile byte pozycja = 0;

void setup()
 {
 pinMode(hallPin, INPUT_PULLUP);
 pinMode(7, INPUT_PULLUP);
 serwo.attach(11);
 Serial.begin(9600);
 serwo.write(pozycja);
 }

void loop()
 {
 byte licznik = 0;
 unsigned long srednia = 0;
 unsigned int odczyt;

 while (licznik < 10)              //liczy srednią jak liczył
   {
   odczyt = pulseIn(hallPin, LOW);
   
   if ((odczyt > 1000)&&(odczyt < 10000)) //tylko zakres odczytów tak, żeby rozumial już od biegu jalowego
     {
     srednia += odczyt;
     licznik++;
     }
   }

 srednia /= 10;                  //wiem, że przy 2500rpm srednia z halla=3700 a serwo=12 bez obciążenia
 
 if(srednia > 3700) pozycja++;    //dokąd srednia jest większa niż 3700 dodawj serwu o 1 stoień co kolejna pętla
 if(srednia < 3700) pozycja--;  //jak srednia spadnie poniżej 3700 zacznij odejmować serwu po 1 stopień co kolejna pętla

 if (digitalRead(7) == HIGH)      //"prztyczek"- zerowanie serwa
   {
   pozycja = 0;
   serwo.write(pozycja);
   }
   
 if (digitalRead(7) == LOW)     //a jak prztyczka nie ma to daj serwu pozycję z linii 35/36
   {
   serwo.write(pozycja);
   }

  if ((digitalRead(7) == LOW) && (pozycja < 8)) //jak bez prztyczka a serwo<8 przyspiesz przyrost o jeszcze 1
   {
   pozycja++;
   serwo.write(pozycja);
   }
 
 
 }



Ten ostatni warunek ma z założenia przyspieszać reakcję silnika na nagle zwiększony opór. Nie jestem pewien czy jest z sensem ale jak nie patrzeć program działa – i to całkiem fajnie, równo i wystarczająco „żywo”.


Okazało się, jak to zwykle kiedy już wymyślone Smile że to całkiem proste było – niemniej jednak, faktem jest, że bez Twojej pomocy, zwłaszcza w części związanej z „ugłaskaniem” tego cholernego halla (pullup, rezystor, i while) pewnie nigdy bym sobie nie poradził.

Tak więc WIELKIE DZIĘKI – a jak dokończę „kosmetykę” to wstawię zdjęcia i filmik z działania.


Pozdrawiam,
Andrzej
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Stabilizator obrotów silnika spalinowego - przez andrus - 10-07-2017, 20:50

Skocz do:


Przeglądający: 2 gości