Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 15 lis 2024, o 06:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 16 gru 2012, o 22:56 
Offline
Nowy

Dołączył(a): 20 lip 2012
Posty: 5
Lokalizacja: Rzeszów
Pomógł: 0

Mam do napisania prace inż. ze Sterownika C.O.
Korzystając z kilku wątków oraz kodu PID od Atmela postawiłem na Atmedze16 pomiar temperatury zapisujący ją w strukturach oraz człon PID zwracający wartość zmiennej int16 w zależnosci od zadanej oraz aktualnej ( odczyt ) temperatury.

Ale przechodząc do sedna. Mam pewien problem, z którym od rana nie potrafię sobie poradzić.
Pisze póki co proste zależności uwzględniające tylko temperaturę odczytu.

Program ( a raczej wklejony kawałek ) ma za zadanie działać nastepująco:

Jeśli temperatura odczytu < 28*C
załącz dmuchawę pieca na 10sekund inkrementując przy tym flagę dla kolejnej funkcji ( która może się okazać konieczna lub nie )
Jako że temperatura nie wzrosła
Po 3 cyklach załączonej dmuchawy , wartość flagi flag_wegiel jest równa 3, zatem możemy przejść do funkcji która ma za zadanie dodać węgiel za pomocą automatycznego podajnika.

Problem pojawia się kiedy potrzebuje wyzerować flagę flag_wegiel. Funkcja w zależności od usytuowania jej w funkcji wegiel() albo się wgl nei załącza albo nie wychodzi z tejże funkcji.

sama funkcja Sterowanie(); - czyli sama dmuchawa działa bez zarzutu i tak jak powinna.

Kodu PID oraz pomiaru temperatury z DS18b20 nie załączam, gdyż działa w 100% poprawnie ( chyba, że ktoś potrzebuje algorytm PID, to chętnie udostępnie, kod od Atmela, nie daje się poprawnie skompilować bez drobnych przeróbek).

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam też pewne obawy czy w ogóle jest możliwość wyjścia z funkcji węgiel. czy to aby się nie zapętla na wieki.
Domyślam się, że to błaha sprawa. Ale okrutnie mi dała dziś popalić. Zdecydowanie bardziej jak struktury, IDs czujników i PID.

Post wydzielony z innego tematu - Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 09:18 

Pomógł: 0

Robisz PID, na jednym wejściu?, sam mam zamiar zrobić sterownik na 3zmienne, tj. temperatura wylotowa spalin, temperatura Pieca-wody, oraz temperatura pomieszczenia ogrzewanego.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 09:41 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Witam.
Nie wiem czy to to ale w kodzie który podałeś to zerowanie flagi flag_wegiel masz wykomentowane więc się nigdy nie zeruje i ciągle do niej wchodzi w głównej pętli.
I tak przy okazji to jak mozesz to zamieść algorytm PID - z chęcią się z nim zapoznam.
Pozdrawiam
Jarek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 10:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

no ja takze , implementacja PID-a w C na AVR-ke chetnie oblookam :)

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 10:20 
Offline
Nowy

Dołączył(a): 20 lip 2012
Posty: 5
Lokalizacja: Rzeszów
Pomógł: 0

Jest wykomentowane, ponieważ w tym miejscu nie może następować zerowanie flagi.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wchodząc za pierwszym razem w warunek if(!Timer2), warunek ten jest spełniony gdyż Timer2 jest tylko zdeklarowany i jest równy zero ( zmienna globalna ). Po wejściu w warunek jest dopiero wpisywana wartość 300 ( 3sekundy ) po czym właśnie następuje to zerowanie flagi flag_wegiel i automatycznie funkcja ta się nie wykonuje. Próbowałem zerowanie flagi w innych miejscach ale nie przynosi pozytywnych skutków.
Chyba nie tędy droga z odmierzaniem czasu.

Potrzebuje po prostu zrobić proste sterowanie uwzględniając wartość wyjściową z członu PID która w zależności od wartości ( od -32768 do +32768 ) załączyć dmuchawę, dodać węgiel czy wychłodzić układ za pomocą np bojlera CWU.

Tak , do PID przekazuje tylko 1 pomiar. Nie studiuje automatyki także, może należałoby to rozwiązać troszkę inaczej, ale to nie jest sterownik na półkę w sklepie, tylko próba zagłębienia się w podstawy języka C.

Dodaje obiecany kod na PID.
W kodzie PID do testów korzystam z Timera2 który inkrementuje mi wartość "temperatury" - tak czysto do testów, aby zaobserwować jak działa PID. Docelowo należy Timer T2 wywalić. a do zmiennej measurementValue wpisywać wartość odczytu temperatury.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 11:00 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Witam.
W takim razie moim zdaniem w funkcji wegiel() powinienes (po sprawdzeniu warunku temperatury) ustawic tylko zmienna Timer2 na 300, zalaczyc podajnik (WEGIEL_ON) i wyzerowac flage flag_wegiel.
W petli głownej natomiast sprawdzać wartośc Timer2 i przy jego wyzerowaniu wylączać podajnik (WEGIEL_OFF). To powinno zapewnic Ci 3 sekundy padawania węgla na każde 3 uruchomienia dmuachawy.


To w while(1)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To w wegiel
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W tej wersji co miałeś nie zerując flagi powodowałeś że ciagle wchodził do funkcji wegiel() i jak już Timer2 dochodził do 0 to znowu ladował go do 300 itd.
Pozdrawiam
Jarek


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2012, o 11:44 
Offline
Nowy

Dołączył(a): 20 lip 2012
Posty: 5
Lokalizacja: Rzeszów
Pomógł: 0

jark. Dzięki śliczne. Działa.
Rozumiem teraz co robiłem źle.

Co do kodu PID, który zamieściłem. Kod oryginalny na stronie Atmel znajduje się tu http://www.atmel.com/Images/AVR221.zip . Standardowa biblioteka stdint.h nie kompiluje się poprawnie bez drobnych zmian niektórych definicji. Plik main.c został napisany jeszcze w ubiegłym wieku, więc na pierwszy rzut oka mogą zdziwić funkcje w stylu __interrupt void TIMER0_OVF_ISR( void ).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2012, o 11:09 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Witam.
Nie ma sprawy, cieszę się że mogłem pomóc.
Jesli chodzi o PID to dzięki za wysłanie jak będę miał trochę czasu to sobie popatrzę.
Z chęcią bym sobie śledził taki temat bo też się przymierzam to zastapienia standardowego sterownika kotła własną konstrukcją i wszelkie uwagi, pojawiające się problemy i i ich rozwiązania mogłyby być w przyszłości przydatne.
Pozdrawiam
Jarek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 gru 2012, o 15:31 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 lut 2012
Posty: 5
Pomógł: 0

Chciałbym również do swojego programu zaimplelmentować algorytm PID, tylko prawdę mówiąc nie wiem jak tego dokonać.
Addieadam mógłbyś podesłać swój kod z PID na wzór albo opisać w miarę dokładnie jak to zrobić żeby działało?

Z góry dziękuję i Wesołych Świąt :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 gru 2012, o 18:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 gru 2012
Posty: 72
Pomógł: 6

Witam.

Ja bym poprosił o opis w jaki sposób zrealizować sterowanie PID.
Czyli co z czym zjeść, gdzie zastosować czujniki i jak je wykorzystać.

Tworze Własny sterownik do nadmuchu ale jak narazie bez PID'a.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 21:40 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 lut 2012
Posty: 5
Pomógł: 0

Widzę, że nikt nie chce nic napisać o PID :(

No dobra.. ale tego już Wam nie odpuszczę :D -mianowicie podczas analizowania kodu, który kolega przedstawił (mam na myśli sterowanie CO), nie mogę rozkminić w jakim trybie pracują liczniki T1 i T2 oraz co tak naprawdę robi przerwanie, bo nic mi tu nie pasuje a widzę, że program jest OK.
Tak więc byłbym bardzo wdzięczny, gdyby ktoś mi tu co nieco opisał ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8586
Pomógł: 337

http://www2.tku.edu.tw/~tkjse/12-3/05-EE9617.pdf
http://www.atmel.com/Images/doc2558.pdf

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 22:14 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 lut 2012
Posty: 5
Pomógł: 0

Dzięki Sun, ale nie do końca mi o to chodziło.. to może sprecyzuję.
Jeśli chodzi o mojego drugiego posta..
Analizuję kod wg książki, wiadomo jakiej.
Rozumiem, że oba liczniki pracują w trybie CTC, oba liczniki inkrementują swoją wartość co 10ms (f=100Hz).
Nie do końca wiem tylko, w jakim celu zapisywane są wartości Timer1=1000 i Timer2=3000, przecież wartość do porównania jest zapisana w rejestrach OCR1 i OCR2.
No i co tak naprawdę robi przerwanie, skoro jest wywoływane podczas porównania z wartościami z OCRx (no właśnie - dla obu Timerów to samo przerwanie?), bo widzę ze tylko dekrementuje wartość Timerów, tylko po co?
Chciałbym po prostu wiedzieć, co tak naprawdę się dzieje w tym konkretnym programie.

//EDIT

OK, wygłupilem się, ale ze mnie łoferma :D
Nie zauważyłem deklaracji zmiennych Timer i dodatkowo zmyliły mnie ich nazwy..
Obiecuję, że to sie więcej nie powtórzy ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2012, o 00:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2011
Posty: 265
Lokalizacja: Szczecin
Pomógł: 9

Hej, może tym wpisem troszkę pomogę. Na studiach wykonywałem projekt regulatora PID w oparciu o sterownik PLC. Program w sterowniku był napisany w jezyku C.

http://www.gryf-elektryk.pl/sprawozdania/Symulator_ukladu_regulacji_z_regulatorem_PID.pdf

Wydaje mi się, że przerobienie tego kodu pod AVR nie powinno być zbyt trudne :) Kilka razy zamierzałem to zrobić, ale nigdy nie zrobiłem:)

_________________
www.iuvo.it - Automatyka Budynkowa



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2013, o 13:13 
Offline
Nowy

Dołączył(a): 20 lip 2012
Posty: 5
Lokalizacja: Rzeszów
Pomógł: 0

Przepraszam za nieodpisywanie, koniec grudnia spędziłem poza domem, bez dostępu do internetu, a ostatnio tak pochłonąłem się pisaniem pracy inżynierskiej, że całkiem zapomniałem o moim wątku na forum.

lukasz32, cieszę się że poradziłeś sobie sam ze zrozumieniem kodu. Największym problemem który dotyczy wszelakich sterowników PID sterujących obiektami inercyjnymi wyższych rzędów ( kotły C.O. ) to wyznaczenie transmitancji obiektu sterowanego. Jak już pisałem, nie studiuje automatyki lecz telekomunikacje ( anteny, rfid ), opisywany sterownik to tylko chęć zagłębienia się w podstawy programowania. Wracając do sedna problemu, od dłuższego czasu czytam opinie dotyczące fabrycznych sterowników i wychodzi na to ,że poprawność sterowania danego obiektu ( pieca ) zależy znacznie od transmitancji przyjętej w nastawach członu PID.

Jeśli taki algorytm PID ma naprawdę dobrze pracować, należy wykonać prosty test nagrzewając piec wykorzystując tylko człon proporcjonalny. Należy doprowadzić do utraty stabilności obiektu, czyli kiedy zaczynają się znaczne oscylacje. Wykreśloną charakterystykę (na która składają się punkty pomiarowe - temperatury w dziedzinie czasu ) należy dokonać aproksymacji i wyznaczyć transmitancje obiektu. Następnie należało by wyliczyć wartości członów Ki oraz Kd. Zazwyczaj przy doborze nastaw stosuje się metodę Zieglera Nicholsa , które zapewniają przeregulowania układu na poziomie ok 20-30% co w praktyce zazwyczaj jest stabilnością akceptowalną.

Co do mojego sterownika. Wymyśliłem własną koncepcje. Wartość zwracaną przez PID interpretuję na wysterowanie wentylatora dmuchawy bo w sumie do czego innego jeszcze ?.
Zrobiłem kilka warunków z przedziałami np. (pid>500 && pid <=2000) steruję dmuchawę na np PWM 50% . pid>2001 && pid<=10 000) steruję dmuchawą na poziom np 40% itd. Możliwe że należało by podejść do problemu inaczej, jak już pisałem nie znam się na tyle na automatyce. Koncepcja działa, a dokładniejsze nastawy należało by wyznaczyć empirycznie znając transmitancje obiektu. Wszytko opiera się o czasochłonne doświadczenia z konkretnym obiektem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO