Skocz do zawartości

[AVR] Sterownik silnika elektrycznego oparty na ISOBUS


rafisoltys

Pomocna odpowiedź

W traktorze mamy dwa różne złącza:

ISOBUS(opisany wcześniej) i wysokoprądowe złącze zasilania [WZZ] (tylko +12V i GND max. 30).

+12 V z WZZ podłączony do silnika oraz sekcji zasilania.

GND z WZZ podłączony jest do Źródła tranzystora oraz sekcji zasilania (Podłączenie do common stabilizatora sprawia, że GND z WZZ jest masą dla uC)

Przesyłam zaktualizowany schemat:

Link do komentarza
Share on other sites

Dobra, to już chyba komplet informacji. Przepraszam, ze tak powoli kumam, ale robię inne rzeczy równolegle a przełączanie kontekstów trochę boli.

W takich sytuacjach trzeba podpierać się dobrą praktyką inżynierską. Ta mówi, że dwa złącza wyciągnięte z nieznanych miejsc instalacji nie mogą być traktowane równoprawnie. Masa jednego złącza nie musi być na tym samym potencjale co masa drugiego a jeśli nawet statycznie jest - to znaczy gdy zmierzysz woltomierzem różnicę napięć może być prawie zerowa - to wcale nie oznacza że przy poborze prądu rzędu 10A nadal będzie. Jeżeli np. GND złącza "mocy" jest podpięte gdzieś blisko klemy akumulatora kablem 20mm² a GND tego "czujnikowego" po prostu do blachy gdzieś przy punkcie mocowania złącza, to zwarcie obu mas spowoduje powstanie "obejścia" masy "blaszanej" poprzez przewody wetknięte do złącza "czujnikowego". Nie znając rozpływu prądów w masie pojazdu trudno powiedzieć co się wydarzy. Może nic, a może coś poważnego, np. przepływ kilku Amperów prądu przez złącze "czujnikowe". Dlatego projektując takie urządzenie dla siebie zrobiłbym co następuje:

1. Mając na uwadze wielkość potrzebnego prądu dla silnika, skorzystałbym z masy i zasilania na złączu "mocy".

2. Żeby nie komplikować układu sterowania bramką, na tej samej masie oparłbym całą część cyfrową dbając o to, by masa - jak już wspomniałem - była doprowadzona bezpośrednio do źródła tranzystora a dopiero potem do stabilizatora i procesora.

3. Całość zasilałbym oczywiście z 12V dostępnych na złączu "mocy".

4. W tej sytuacji sygnał prędkości doprowadzony do nas przez złącze "czujnikowe" jest odniesiony do innej masy. Na 90% nic by się nie stało, gdybyś ten sygnał puścił przez dzielnik i doprowadził do procesora bez użycia jakiegokolwiek innego pinu (także GND) tego złącza. Ponieważ boli mniej jednak te pozostałe 10% i nieokreśloność wyników pracy, wstawiłbym transoptor: jego diodę wejściową podłączył anodą przez opornik 3k do impulsów a katodę już bezpośrednio do masy złącza "czujnikowego". Po drugiej stronie tranzystor dostałby masę cyfrową procesora na emiter a w kolektorze wystarczyłby opornik podciągający z pinu portu. Taka pełna separacja galwaniczna rozpięłaby oczko mas i załatwiła mi spokojny sen. W przypadku gdyby sygnał na kolektorze byłby zasyfiony, dałbym jeszcze kondensator do masy a w skrajnym przypadku dospawał przerzutnik Schmitta regenerujacy dowolny kształt w śliczny prostokąt cyfrowy.

Oczywiście możliwa jest odmiana powyższego, czyli zasilanie procka, jego GND i wejście brane wyłącznie i bezpośrednio ze złącza "czujnikowego" a izolacja opto między procesorem a MOSFETem. To daje tę przewagę, że diodę LED lub tranzystor wyjściowy izolatora można włączyć tak by mieć załączanie głównego klucza jedynką na porcie (i pozbywasz się niepotrzebnego npn-a). Wtedy ze złącza WZZ bierzesz tylko masę i zasilanie silnika, MOSFETa i jego drivera.

Ciekaw jestem co zrobisz. 🙂

Link do komentarza
Share on other sites

OK, najważniejsze to coś sensownie zdecydować.

Jeszcze tylko dla uściślenia:

- Wszystkie masy (także ta od npn-a) są masą WZZ, oprócz masy diodki transoptora.

- Szeregowo z tą diodką i z opornikiem R11 daj jeszcze jedną lub dwie małe diody krzemowe, nawet 1N4148. Ich napięcie Uf zablokuje wtedy przepływ niewielkiego prądu w sytuacji, gdybyś rzeczywiście na linii impulsów dostał 1.3V w stanie niskim. "Nadajniki" w transoptorach to diody podczerwone, a te zaczynają działać już od 1V więc warto się zabezpieczyć tym bardziej, że nie masz opornika, który wymuszałby jakiś poważniejszy prąd kolektora. Teraz, gdy skazałeś się na pullup w procesorze to aby aby zrobić zero logiczne (<1V), wystarczy pociągnąć tranzystorem 100uA. Gdy wstawisz typowy transoptor ze współczynnikiem CTR=100%, to prąd diody 100uA zaczyna płynąć właśnie w okolicach 1-1.1V 😐

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Nie rozumiem pojęcia podciągnąć tranzystorem.

W tej chwili testuje układ, niestety jest to utrudnione bo nie zabrałem oscyloskopu ;(

W stanie ustalonym wyświetlacz lcd wskazuje liczbę odebranych impulsów i przeliczona prędkość obrotową. PWM na razie do pominięcia.

Kolektor i emiter (GND) połączyłem kondensatorem 220pF gdyż bez niego uC zbierał szumy.

Podłączenie baterii 9v do diody transoptora nie powoduje jednak nic.

Konensator 39pF nie filtruje szumów wcale.

Zalączam foto tego co stworzyłem:

[ Dodano: 07-07-2018, 10:22 ]

[ Dodano: 07-07-2018, 10:42 ]

Zmierzyłem napięcie na PIN2. Wynosi ono 1,878 V. Przy czym, podłączenie sondy multimetru do PIN2 powoduje zbieranie szumów (uC zlicza obroty).

[ Dodano: 07-07-2018, 11:00 ]

Źle ustawiłem pullup. Rozwiązałem problem z szumami. Napięcie pomiedzy emiterem i kolektorem ~5V. Podanie napięcia 9V na diode transoptora nie zmienia tego napięcia (nie otwiera tranzystora ??)/

Link do komentarza
Share on other sites

Jak rozumiem pracujesz na schemacie w ostatniej pokazanej wersji, tak?

To są proste łańcuchy sygnałowe. Po podłączeniu baterii do wejścia impulsowego sprawdzasz:

- napięcie baterii, może spadać pod obciążeniem już kilku mA do <7V a to oznacza wyczerpanie i dyskwalifikację do dalszych zabaw,
- mierzysz napięcie na oporniku szeregowym, w ten sposób sprawdzasz prąd diody transoptora bez rozpinania obwodu, czy nie jest za duży albo co gorsza czy jest gdzieś przerwa w oczku (żeby płynął bateria musi być podłączona minusem do masy wejściowej),
- jeżeli przez diodę płynie prąd to nic tu po Tobie przenosisz się na druga stronę, mierzysz napięcie na kolektorze już względem innej masy, tej "globalnej",
- podłączając i odłączając baterię sprawdzasz, czy napięcie choć trochę się zmienia of 5V w dół, nawet jeśli zamiast pullupa włączyłeś wyjście na stan wysoki, to kilka mA ciągnięte przez tranzystor do masy powinno to napięcie lekko zmniejszać (np. o 50..100mV), im opornik podciągający jest większy tym zmiany będą większe, bo prąd tranzystora jest dla danego prądu diody IR stały - musisz dobrać taki pullup by zmiany na kolektorze były od >4.8V w stanie wyłączenia do <0.8V w stanie włączenia przy najgorszym napięciu wejściowym kwalifikowanym jako impuls (czyli 6V?).

Wiesz, tu nie ma co nie działać jeśli tylko nie zamieniłeś kolektora z emiterem lub anody z katodą, oporniki są mniej więcej dobrych rzędów wielkości i mierzysz napięcia względem odpowiednich mas.. Nie przejmuj się zakłóceniami dopóki układ nie będzie produkował poprawnych napięć statycznie. W przypadku gdy procesor dostaje np. 1.2 lub 1.5V w stanie "niskim" to nic dziwnego, że głupieje i widzi mnóstwo zboczy. Bawienie się wtedy w kondensatory to niepotrzebna strata czasu. A gdy już doprowadzisz do napięć ok. >4.5V w stanie H i <0.8V w stanie L to pamiętaj, że załączanie baterii drutami powoduje wygenerowanie wielu zboczy (transoptor jest szybki) co nie musi od razu oznaczać problemów w docelowym układzie (ale może) bo nie wiesz jak wyglądają prawdziwe impulsy.

Link do komentarza
Share on other sites

Przetestowałem wczoraj taki układ, jednak bez diody D4.

Potencjometr R6 zastosowany jako dzielnik napięcia ustawiłem tak, aby napięcie wyjściowe było zbliżone do 5V.

Układ testowełem przy wykorzystaniu sygnału z ISOBUS jak i diody. Nie było jakiś szczególnych zakłóceń. Aczkolwiek, wyniki nie były szczególnie powtarzalne. Wydaje mi się, że uC nie zawsze zliczał wszystkie impulsy, ale tak jak mówiłem zapomniałem oscyloskopu i nie mam jak sprawdzić.

Jeśli chodzi o podłączenie diody D4 to czy zachowałem dobra polaryzację ? Postaram się przetestować układ z diodą, ale bez dzielnika napięcia (zgodnie z ogólnym schematem).

Zwrócić jeszcze na coś uwagę ?

Link do komentarza
Share on other sites

Przykro mi, ale tu wszystko jest źle 😥

1. Potencjometr w takim połączeniu jest dzielnikiem napięcia. Napięcia. To znaczy, że działa zgodnie z oczekiwaniami gdy na wejście podajesz jakiś sygnał a z wyjścia pobierasz jedynie napięcie, bez prądu. Wtedy podział na dwa działa, na trzy, na pięć itd zgodnie z ustawieniami kąta obrotu. Ty jednak potrzebujesz dla diody prąd a to nie to samo. Dioda to taki element na którym napięcie praktycznie nie zmienia się. Jeśli potrzebuje (akurat ta) ok. 1V do startu a przy 1.2 już się spala, to zmiany są w zasadzie żadne. No i teraz podłączyłeś swój potencjometr którym kręcisz, a do którego wyjścia przyspawałeś element "stabilizujący" napięcie do poziomu powiedzmy 1.1V. Jak wygląda wykres prądu (bo przecież od tego dioda świeci) w zależności od pozycji ślizgacza? Policz to może z czystej ciekawości a przekonasz się jak bardzo niebezpieczne (dla odbiornika prądu) są takie układy. Praktycznie jedynym elementem ograniczającym prąd diody jest górna część potencjometru - od suwaka do górnego zacisku. Dolna się nie liczy. A górną możesz zjechać do zera i - jeżeli tylko źródło zdoła - spalić diodę, bo pod koniec prąd rośnie lawinowo (narysowałeś już wykres?). Nigdy tak nie rób. Skoro chcesz regulować prąd, to wstaw potencjometr szeregowo z diodą korzystając tylko z dwóch jego wyprowadzeń plus jeszcze dodatkowo obowiązkowo opornik ograniczający prąd maksymalny do wartości powiedzmy 20mA. W tym przypadku będzie to (6V-1.2V)/20mA=240Ω. Może być 220Ω z szeregu E24. A potencjometr, żeby przy 6V mógł regulować prąd od tych 20mA ograniczonych opornikiem do powiedzmy 1mA powinien mieć 5k.

2. Dodatkową diodę miałeś dać w szereg z diodą świecącą i wszelkimi jej opornikami. Przecież miała być dodatkowym zabezpieczeniem przed przepływem prądu przez diodę transoptora w przypadku zbyt dużego napięcia w stanie niskim (czyli >1V). Dioda krzemowa włączona w szereg "zabiera" dla siebie ok. 0.6-0.7V napięcia w oczku i o tyle zmniejsza to co dochodzi do całej reszty. Wtedy gdy wejście dostanie powiedzmy 1.2V dioda zabierze 0.6V (niezależnie od prądu) i diodka IR dostanie pozostałe 0.6V od którego na pewno nie zaświeci. Włączenie po drugiej stronie (w kolektor) jest tak bez sensu jak tylko można sobie wyobrazić. Przecież tym samym spowodowałeś, że pin procesora będzie widział napięcie kolektora powiększone o 0.6V. Nawet jeśli tranzystor bardzo się postara, wejdzie w nasycenie i zrobi 100mV, to i tak procesor zobaczy 0.7V więc ledwo ledwo dobry stan niski. A gdy tranzystor nie będzie głęboko wysterowany, będzie tylko gorzej.

Czy rysując dany układ nie zastanawiasz się jak to zadziała? Nie wyobrażasz sobie jak popłynie prąd oraz gdzie i jakie będą spadki napięć? Przecież to trywialne, szeregowe połączenia. Nawet nie zacząłeś jeszcze budować żadnej elektroniki a tu takie skuchy..

Widzę, ze sprawa potencjometru, w ogóle dzielników napięcia i odróżniania sygnałów napięciowych od przepływu prądu sprawia wielu ludziom problemy. Chyba coś źle poszło w kursach podstaw elektroniki.

No nic, to może umówmy się, że zanim cokolwiek zmontujesz i podłączysz, pokażesz tego schemat a już na pewno w przypadku samodzielnych pomysłów lub modyfikacji. Być może też moje tłumaczenia są niezbyt jasne więc w razie wątpliwości pytaj. Szkoda Twojego czasu na testowanie układów zawierających szkolne błędy.

Link do komentarza
Share on other sites

Udało mi się rozwiązać kwestię przygotowania sygnału (przynajmniej dla zasilania bateryjnego uC).

marek1707, miałeś rację. Cieszę się, że trafiłem na tym forum właśnie na Ciebie i mogę się od Ciebie uczyć.

Układ przetestowałem na ciągniku. Układ dla prędkości około 4km/h zliczał około 130 impulsów.

Rozrzut odczytu był na poziomie -+ 5 impulsów. Jednak dokładniej sprawdzę to dopiero jak będę miał oscyloskop.

Chcę rozszerzyć możliwości tego układu o możliwość konfiguracji. Do tego celu chcę wykorzystać drugie arduino z LCD i klawiaturą. Chciałbym, aby wprowadzone dane przesyłane były za pomocą UART. Czy to dobra metoda komunikacji pomiędzy 2 uC na odległość do 10 m ?

Link do komentarza
Share on other sites

Jeśli zostały Ci jakiejś piny, to pomyśl nad pasywnym podłączeniem zdalnego pulpitu. Naprawę do tak prostego urządzenia potrzebujesz wyświetlacz? Gdyby po przemyśleniu okazało się, że wystarczy kilka diodek i parę klawiszy, to coś takiego możesz dać na jakimś prostym interfejsie szeregowym typu SPI bez żadnej inteligencji po drugiej stronie. Drugi procesor i synchronizacja dwóch programów, protokoły, wykrywanie błędów, reakcje na nie itd. to zawsze spora rozbudowa kodu bez żadnej gwarancji, że będzie niezawodnie i bez zwisów.

W sensie przesyłania sygnałów, to UART jest tak samo dobry jak wszystko inne, kwestią jest raczej interfejs fizyczny: sygnały TTL (5V), coś odporniejszego (±12V). W środowiskach zakłóconych dąży się raczej do używania interfejsów różnicowych (CAN, RS485, Ethernet itp) bo śmiecie wnikające równocześnie w oba kable nie zmieniają różnicy między sygnałami - a tylko to interesuje odbiornik. Tutaj to jednak moim zdaniem byłaby armata, choć w celach edukacyjnych - czemu nie. I tak powinieneś zrobić dobre nadajniki linii i filtrowane odbiorniki. A czy bity będą składały się na ramkę UARTa czy kilka zegarów SPI to bez znaczenia. Ja bym wziął dwa rejestry, np. 74HC594 (lub 595) i 74165, podłączył je do programowo robionej lub sprzętowej szyny SPI procesora i tyle. Do pierwszego scalaka podłączyłbym do 8 diodek LED, do drugiego do 8 przycisków, oprogramował to na procesorze i z głowy. Połączenie wymagałoby 4 drutów cyfrowych oraz poprowadzenia masy i zasilania.

Jeśli jednak przewidujesz jakieś ustawianie parametrów liczbowych lub choćby wyświetlanie aktualnych pomiarów (po co?), no to bez wyświetlacza się nie obejdzie. Wtedy rzeczywiście, drugi procesor, link szeregowy i voila. W tym przypadku, skoro już taka rozbudowa to i może RS485 chciałbyś spróbować? Transceivery do tego nie są drogie a po dwóch drutach miałbyś różnicową transmisję w dwie strony. A ile wiedzy nowej w głowie? Ho, ho 🙂

Link do komentarza
Share on other sites

Zdecydowałem się na RS485. Konwertery UART <-> RS485 to groszowe sprawy, a aspekt dydaktyczny wydaje się niezwykle kuszący.

Wersja 2.0 układu zakłada, że za pomocą prostego interfejsu będę mógł wprowadzić do programu takie informacje:

- Wydatek w gramach na 1 obrót (Procedura wykonująca 100 obrotów wałkiem uruchamiana z interfejsu, a następnie ręczne wprowadzenie wagi nasion);

- Ustawienie szerokości roboczej agregatu siewnego (w cm);

- oraz co wydaje mi się najtrudniejsze chciałbym zastosować regulator, który po wprowadzeniu wydatku g/obr, szerokości roboczej i prędkości (z ISOBUS) tak będzie sterował prędkością obrotową silnika, żeby osiągnąć odpowiedni wydatek na hektar.

Tutaj potrzebował będę jeszcze enkoder do prędkości obrotowej wałka.

Chciałbym, aby wprowadzone wartości byly przesłane do uC sterującego silnikiem tylko raz podczas konfiguracji układu. Komunikacja w drugą stronę obejmować będzie jedynie przesłanie wartości prędkości pojazdu, prądu pobieranego przez silnik oraz temperatury. Maksymalnie 5 zmiennych.

Dodam, że program uC interfejsu mam już po części przygotowany.

#include <Wire.h>                           // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h>              // dolaczenie biblioteki I2C dla LCD

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27

volatile long wartosc=0;                     // deklaracja zmiennej wartosc
volatile int stana=HIGH;                     // deklaracja zmiennej w funkcji TAK
volatile int stanb=HIGH;                     // deklaracja zmiennej w funkcji NIE
int incoming=0;                              // deklaracja zmiennej dla danych odebranych z UART
int buttonUP=2;                              // deklaracja PIN2 jako przycisk gĂłrny
int buttonDOWN=3;                            // deklaracja PIN3 jak przycisk dolny
int test100PIN=4;                            // deklaracja PIN4 jako pin uruchamiajÄ…cy 
int buttonOK=8;                              // deklaracja PIN5 jako pin potwierdzajÄ…cy
int probaTEST=LOW;                          // deklaracja zmiennej probaTEST = test nie trwa
int masa=0;                                  // deklaracja zmiennej zapisujÄ…cej mase zboĹĽa
int masaplus=0;                              // deklaracja zmiennej do ustawienia masy
int war1=LOW;                                // warunek przejścia do kolejneg menu
int szerokosc=0;                             // deklaracja zmienenej zapisujacej szerokosc robocza
int szerokoscplus=0;                         // deklaracja zmiennej ustawiajacej szerokosc
int wydatek=0;                                 // deklaracja zmiennej zapisujacej wydatek
int wydatekplus=0;                            // deklaracja zmiennej ustawiajÄ…cej wydatek


void tak()                                                 // zmienna wyboru 
{
       stana=LOW;
       wartosc=wartosc+1;
       masaplus=masaplus+1;
       szerokoscplus=szerokoscplus+1;
       wydatekplus=wydatekplus+1;
}

void nie() 
{
       stanb=LOW;                                         // zmienna wyboru
       wartosc=wartosc-1;
}

void wyslijparametry()
{lcd.clear();
lcd.setCursor(0,0);
lcd.print("Trwa wysylanie");
lcd.setCursor(0,1);
lcd.print("parametrow do");
lcd.setCursor(0,2);
lcd.print("urzadz. wykonaw.");
//Serial.write();
}

void sprawdzstan6()
{
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             wydatekplus=0;
             wyslijparametry();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
             ustawwydatek();                              // przejdĹş do funkcji ustalajÄ…cej mase ziarna na obrot
           }
       else
           {
             sprawdzstan6();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }
void potwierdzwydatek()
{ lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("Ustawiony wydatek");
 lcd.setCursor(0,2);
 lcd.print(wydatek);
 lcd.setCursor(5,2);
 lcd.print("g/ha");
 lcd.setCursor(0,3);
 lcd.print("Czy poprawnie ?");
 lcd.setCursor(17,0);
 lcd.print("TAK");
 lcd.setCursor(17,3);
 lcd.print("NIE");
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 stana=HIGH;
 stanb=HIGH;
 sprawdzstan6();
}

void ustawwydatek()
{
 lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("Ustaw wydatek:");
 lcd.setCursor(0,2);
 lcd.print(wydatekplus);
 lcd.print("    g/ha");
 lcd.setCursor(19,0);
 lcd.print("+");
 lcd.setCursor(11,3);
 lcd.print("ZATWIERDZ");
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 stana=HIGH;
 stanb=HIGH;

     delay(100);          
             if (stanb==LOW)
             {
             wydatek=wydatekplus;
             potwierdzwydatek();
             }
             else 
             {
             ustawwydatek();
             }
             }

void sprawdzstan5()
{
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             masaplus=0;
             masaziarna();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
             szerokoscplus=0;
             ustawszerokosc();                              // przejdĹş do funkcji ustalajÄ…cej mase ziarna na obrot
           }
       else
           {
             sprawdzstan5();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }

void wyborustawien()
{
 lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("Co zmienic ?");
 lcd.setCursor(15,0);
 lcd.print("MASA");
 lcd.setCursor(11,3);
 lcd.print("SZEROKOSC");
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 stana=HIGH;
 stanb=HIGH;
 delay(1000);
 sprawdzstan5();
}
void sprawdzstan4()
          {
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             wydatekplus=0;
             ustawwydatek();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
             wyborustawien();                              // przejdĹş do funkcji ustalajÄ…cej mase ziarna na obrot
           }
       else
           {
             sprawdzstan4();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }


void potwierdzall ()
{lcd.clear();
lcd.setCursor(0,0);
lcd.print("Masa z 1 obr:");
lcd.setCursor(0,1);
lcd.print(masa);
lcd.print(" gram/obr");
lcd.setCursor(0,2);
lcd.print("Szerokosc robocza");
lcd.setCursor(0,3);
lcd.print(szerokosc);
lcd.print("  cm");
delay(5000);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Czy ustawienia");
lcd.setCursor(0,2);
lcd.print("sa poprawne ?");
lcd.setCursor(17,0);
lcd.print("TAK");
lcd.setCursor(17,3);
lcd.print("NIE");
attachInterrupt(0,tak,FALLING);
attachInterrupt(1,nie,FALLING);
stana=HIGH;
stanb=HIGH;
sprawdzstan4();
}

void sprawdzstan3()                                        // funkcja wybory czy proba 100 obrotow zostala wykonana
           {
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             potwierdzall();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
             szerokoscplus=0;
             ustawszerokosc();                              // przejdĹş do funkcji ustalajÄ…cej mase ziarna na obrot
           }
       else
           {
             sprawdzstan3();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }
void potwierdzszerokosc()
{ lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Ustawiona szer.:");
 lcd.setCursor(0,1);
 lcd.print(szerokosc);
 lcd.setCursor(5,1);
 lcd.print("cm");
 lcd.setCursor(0,3);
 lcd.print("Czy poprawnie ?");
 lcd.setCursor(17,0);
 lcd.print("TAK");
 lcd.setCursor(17,3);
 lcd.print("NIE");
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 stana=HIGH;
 stanb=HIGH;
 sprawdzstan3();
}


void ustawszerokosc()
{ 
 stanb=HIGH;
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Ustaw szerokosc:");
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 lcd.setCursor(0,2);
 lcd.print(szerokoscplus);
 lcd.print("    cm");
 lcd.setCursor(19,0);
 lcd.print("+");
 lcd.setCursor(11,3);
 lcd.print("ZATWIERDZ");

     delay(100);          
             if (stanb==LOW)
             {
             szerokosc=szerokoscplus;
             potwierdzszerokosc();
             }
             else 
             {
             ustawszerokosc();
             }
             }
void sprawdzstan2()                                        // funkcja wybory czy proba 100 obrotow zostala wykonana
           {
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             ustawszerokosc();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
            masaplus=0;
            masaziarna();                              // przejdĹş do funkcji ustalajÄ…cej mase ziarna na obrot
           }
       else
           {
             sprawdzstan2();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }

void potwierdzmase()
{
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Wprowadzono=");
 lcd.setCursor(0,1);
 lcd.print(masa);
 lcd.print("   gram/obrot");
 lcd.setCursor(0,3);
 lcd.print("Czy poprawnie ?");
 lcd.setCursor(17,0);
 lcd.print("TAK");
 lcd.setCursor(17,3);
 lcd.print("NIE");
 szerokoscplus=0;
 attachInterrupt(0,tak,FALLING);
 attachInterrupt(1,nie,FALLING);
 stana=HIGH;
 stanb=HIGH;
 sprawdzstan2();


}

void masaziarna()
             { war1=HIGH;
             stanb=HIGH;

             attachInterrupt(0,tak,FALLING);
             attachInterrupt(1,nie,FALLING);
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Masa ziarna:");
             lcd.setCursor(19,0);
             lcd.print("+");
             lcd.setCursor(11,3);
             lcd.print("ZATWIERDZ");
             lcd.setCursor(0,2);
             lcd.print(masaplus);
             lcd.print("   gram");

             delay(100);          
             if (stanb==LOW)
             {
             masa=masaplus;
             potwierdzmase();
             }
             else 
             {
             masaziarna();
             }
             }

void testprobakrecona()                      // funkcja spradzajÄ…ca wykonanie  prĂłby 100 obrotĂłw silnika
           {                           
                     probaTEST=digitalRead(test100PIN);  // przypisz stan z PIN test100PIN do zmiennej
               if   (probaTEST==HIGH)                    // jeśli zmienna probaTEST ma stan wysoki
           { 
                     lcd.clear();
                     lcd.setCursor(0,1);
                     lcd.print("Proba zakonczona");
                     lcd.setCursor(0,2);
                     lcd.print("Zwaz zebrane ziarno");    // wyświetl tekst i przejdź do konfiguracji
                     delay(2000);
                     konfiguracja();
           }
           else 
           {
                     testprobakrecona();                 // jeśli nie przejdź do początku funkcji
           }
           }

void konfiguracja()                                       // funkcja ustawiajÄ…ca wydatek z 100 obrotĂłw
           {       stanb=HIGH;
                   lcd.clear();                     lcd.setCursor(0,0);                     lcd.print("Masa ziarna:");                    lcd.setCursor(6,2);                    lcd.print("gram");                      masaziarna();                    
           }

void probakrecona()                                       // rozpocznij probe 100 obrotow silnika
           {       detachInterrupt(1);
                   detachInterrupt(0);  
                   Serial.write("probakrecona");         // wyślij komende startujaca probe 100 obrotow na uC wykonawczym (może zamienić to na stan wysoki na pin X ??)
                   lcd.clear();
                   lcd.setCursor(0,1);
                   lcd.print("TRWA PROBA KRECONA");   
                   // wyswietl tekst
                   testprobakrecona();                    // uruchom funckje sprawdzajaca kiedy zakonczy sie proba 100 obrotĂłw
           }


void sprawdzstan()                                        // funkcja wybory czy proba 100 obrotow zostala wykonana
           {
       if (stana==LOW)                                    // jesli wybĂłr TAK
           {
             probakrecona();                              // rozpocznij prĂłbÄ™ 100 obrotĂłw
           }

       else if (stanb==LOW)                               // jeśli wybór NIE
           {
             konfiguracja();                              // przejdź do funkcji ustalającej wydajność
           }
       else
           {
             sprawdzstan();                               // jeśli brak wyboru przejdź na początek funkcji sprawdzstan
           }
           }

void poczatek()
           {
            lcd.clear();
            lcd.setCursor(0,1);
            lcd.print("Proba 100 obr?");
            lcd.setCursor(17,0);
            lcd.print("TAK");
            lcd.setCursor(17,3);
            lcd.print("NIE");
             sprawdzstan();
           }

void setup()  
           {
             lcd.begin(20,4);                              // Inicjalizacja LCD 2x16
             lcd.backlight();                              // zalaczenie podwietlenia 
             pinMode(buttonUP,INPUT_PULLUP);
             pinMode(buttonDOWN,INPUT_PULLUP);
             pinMode(buttonOK,INPUT_PULLUP);
             Serial.begin(9600);
             lcd.setCursor(0,0);                           // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
             lcd.print("Witaj Robert !");
             attachInterrupt(0,tak,FALLING);
             attachInterrupt(1,nie,FALLING);
             delay(1500);
           poczatek();
}            

void loop() 
{
if (Serial.available() > 0)                  // przypisywanie do zmiennej odczytanego bajtu
             {
                        incoming = Serial.read();         // wypipsywanie otrzymanych danych
                        lcd.print("Otrzymano: ");         // wypisanie przelanych danych
                        lcd.print(incoming, DEC);
             }}

Wiem, że ten kod jest daleko od ideału, ale póki co swoje założenie spełnia.

Brakuje tylko funkcji, która wyśle konfigurację do uC sterującego i będzie odbierać i wyświetlać dane bieżące.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.