• 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
Regulator obrotów silnika zliczanie obrotu wałka.
#1
Witam.  - jestem zielony kiedyś bawiłem się w atmedze ale to było "dawno dawno temu "

Mam problem - chciałbym wykonać program który pilnuje obroty silnika. częściowo napisałem i wiem że mam bałagan w nim ale nie wiem jak poprawnie wykonać polecenie zliczające w czasie ilość impulsów.

dokładniej układ ma wyliczyć 50 impulsów na sekundę. w przypadku za niskich obrotów przesuwa serwo o 6 stopni aż do osiągnięcia 50 impulsów na sekundę jeśli będzie ponad 50 impulsów to ma odjąć. niby ma mto napisane ale nie mam tego zliczania.

 proszę o pomoc.  poniżej kod

proszę o poprawienie. - dopisanie tego co brakuje. 

pinMode(10, INPUT_PULLUP); - wejście sygnału zliczającego z czujnika halla do arduino



Kod:
#include <LiquidCrystal.h>

#include <Servo.h> //Biblioteka odpowiedzialna za serwa

// select the pins used on the LCD panel ustawienia pinow wyswietlacza.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa

int pozycja = 0; //Aktualna pozycja serwa 0-180
int pozycja1; //Aktualna pozycja serwa przy dodoawaniu konta
int pozycja2; //Aktualna pozycja serwa przy odejmowaniu konta
int obroty = 800; //Aktualna prędkość
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?

void setup()  //instrukcje wykonawcze startowe jednorazowo
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT); // przekażnik zezwalający na uruchomienie zapłonu
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
pinMode(10, INPUT_PULLUP);  // impulsy wchodzące z wałka
 digitalWrite(13, LOW); // wyłącz kontrolke i przekażnik zasilania.
 serwomechanizm.attach(3);  //Serwomechanizm podłączony do pinu 3
lcd.begin(16, 2);              // start the library
lcd.setCursor(0,0);
lcd.print("Kontrola ukladu"); // Wysłanie tekrtu gotowości
 delay(3000);
   digitalWrite(12, HIGH); // włącz sygnał
   delay(2000);
     digitalWrite(12, LOW); // wyłącz sygnał
     lcd.setCursor(0,0);
lcd.print("Gotowy do STARTU"); // Wysłanie tekstu gotowości
 delay(3000);
 digitalWrite(13, HIGH); // włącz kontrolke i przekażnik zasilajacy cewkę
 if ( obroty < 500) {
   serwomechanizm.write(pozycja); //Wykonaj ruch startowy
   //  obiegu pętli spełniony jest WARUNEK */
   lcd.setCursor(0,1);
lcd.print("brak odczytu"); // Wysłanie tekstuo braku napędu

 }
 
}

void loop()

{
 
if ( obroty < 500) {
  pozycja = 0;
         serwomechanizm.write(pozycja); //ustaw serwer na 0 gdy niema obrotów    
 }
 // pentla programu.
if ( obroty < 1500) {  // obrowy są niższe niż 1500
         serwomechanizm.write(pozycja1); // Wykonaj ruch dodatni      
          lcd.setCursor(0,0);
lcd.print("Predkosc:        "  ); // Wysłanie tekrtu gotowości
 lcd.setCursor(11,0);
         lcd.print(obroty); // Wysłanie tekrtu gotowości
         /* Kod wykonywany tylko, gdy w danym obiegu pętli spełniony jest WARUNEK */
 }
//Kod wykonywany przy każdym obiegu pętli
// -------------------------------mm
{
 if ( obroty > 1500) { // obroty są wyższe niz 1500
         serwomechanizm.write(pozycja1); // Wykonaj ruch dodatni
         lcd.setCursor(0,0);
         lcd.print("Predkosc:          "); // Wysłanie tekrtu gotowości    
         lcd.setCursor(11,0);
         lcd.print(obroty); // Wysłanie tekrtu gotowości
         /* Kod wykonywany tylko, gdy w danym obiegu pętli spełniony jest WARUNEK */
 }
//Kod wykonywany przy każdym obiegu pętli

 pozycja1 = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
 delay(200); //Opóźnienie dla lepszego efektu                        
pozycja2 = pozycja - zmiana; //Zmniejszenie aktualnej pozycji serwa
 delay(200); //Opóźnienie dla lepszego efektu                

// -------------------------------mm
{
 if ( obroty >=1450) {

   lcd.setCursor(0,1);
lcd.print("Praca ok.            "); // prędkośćnie niższa niż dopuszczalna
 digitalWrite(12, LOW); // wyłącz sygnał
}
else {
     lcd.setCursor(0,1);
lcd.print("brak synchronizacji."); // brak odpowiedniej prędkości
digitalWrite(12, HIGH); // włącz sygnał
}
{
 if ( obroty <=1550) {

   lcd.setCursor(0,1);
lcd.print("Praca ok.          "); // prędkośćnie niższa niż dopuszczalna
 digitalWrite(12, LOW); // wyłącz sygnał
}
else {
     lcd.setCursor(0,1);
lcd.print("brak synchronizacji."); // brak odpowiedniej prędkości
 digitalWrite(12, HIGH); // włącz sygnał
 } }
//-------------------------lll
}
}
}
 
Odpowiedź
#2
Samo zliczanie jest proste. Istnieje funkcja millis(), która zwraca stan licznika milisekund, który uruchamia się w momencie uruchomienia programu (startu mikrokontrolera). Wystarczy przypisać jej wartość do jakiejś zmiennej w momencie impulsu od czujnika, a następnie porównać z wartością zwróconą przez millis() przy następnym impulsie. To, co dostaniesz, to czas (w milisekundach) obrotu. Czas 20ms to 50Hz (czyli 50 obr/s).
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości