Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Prędkość obrotowa wiatraka PC - jak to zrobic?!

11 Cze 2005 19:07 2150 17
  • Poziom 10  
    Witam !!!

    Jestem w trakcie robienia kontrolera wiatrakow do obudowy PC na mikrokontrolerze ATMEGA 88. Potrzebuje schematu podlaczenia wiatraczka 12V (3 przewodowy). Z tego co wiem zolty przewod jest odpowiedzialny za wysylanie impulsow. W jaki sposob podlaczyc go do mikrokontrolera? Prosze o schemat lub sugestie.
  • Poziom 28  
    Wszystko zalezy jakiego typu jest wyjscie. Niektore wiatraki maja typu otwarty kolektor, a inne norlmalne typu totem pole. W pierwszym przypadku dajesz rezystor podciagajacy do +5V i podlaczas do uC. Szukasz zbocza opadajacego lub narastajacego (bez znaczenia) i na podstawie czasu jaki minal od zboczy ustalasz predkosc.
    Pozdro
    Dexter
  • Poziom 10  
    Tak tylko, ze jak kupuje wiatrak to niewiem jakie ma wyjscie. A moje urzadzenie musi dzialac w kazdym przypadku. Czy jest jakies uniwersalne rozwiazanie?
  • VIP Zasłużony dla elektroda
    Rezystor podciągający 4k7 nie bedzie przeszkadzał w obu przypadkach.
  • Poziom 10  
    Druga sprawa jest jeszcze taka czy sygnal z wiatraka nie bedzie za slaby? Poza tym jak rozwiazac to od strony programowej?

    Moze jest ktos komu dziala juz cos takiego i ma sprawdzony sposób?
  • VIP Zasłużony dla elektroda
    Sqza napisał:
    Druga sprawa jest jeszcze taka czy sygnal z wiatraka nie bedzie za slaby? Poza tym jak rozwiazac to od strony programowej?
    Liczysz impulsy w czasie, po czym zerujesz licznik i mierzysz nastepny odcinek czasu. Reasumując wykorzystujesz jeden licznik jako licznik impulsów zewnętrznych z wejścia T0 albo T1, a drugi licznik, zliczający przez preskaler impulsy zegarowe, jako czasomierz... ;)
    --
    Pozdrawiam, Daniel
  • Poziom 35  
    Albo jeszcze inaczej. Podpinasz wyjście z wiatraka do przerwania np. INT0
    W przerwaniu zwiększasz o jeden dowolną zmienną np. obr. Dodatkowo ustawiasz Timer na odmierzanie stałych odcinków czasu np. 1s.
    W obsłudze przerwania odczytujesz zmienną obr. i zapisujesz ją w zmiennej obroty, nastęnie zerujesz zmienną obr. Przy okazji w tym przerwaniu wyświetlacz wynik na LCD.
    Rozpisałem to dośc szczegółowo bo widac że dopiero zaczynasz przygode z prockami.
    A tak przy okazji, sprawdziłęm ze na jeden obrót przypadają dwa takty na wyjściu.
  • Poziom 11  
    A moze by tak zastosowac AT89S8252, ma bardzo fajna funkcje do liczenia czasu pomiedzy impulsami, licznik T2 tego uC po sygnale na wejscie T2EX przepisuje wartosc licznika do specjalnych rejestrow i zeruje sie i tak do kolejnego impulsu. Ja to wykorzystuje do sprawdzania prędkości generatora SRG.
    pozdrawiam
    trikess
  • VIP Zasłużony dla elektroda
    Trikess, w AVR jest też taka funkcja sprzętowa (Input Capture).Co prawda nie zeruje ona licznika, ale w AVR instrukcje (asemblera) są wykonywane króciuteńko i zegar nie jest dzielony przez 12, więc przerwanie od ICP1 może zawierać kod resetujący licznik, co nie wpłynie znacznie na jakość pomiaru, zwłaszcza przy takim zastosowaniu (wiatrak od PC).
  • Poziom 21  
    trikess napisał:
    A moze by tak zastosowac AT89S8252, ma bardzo fajna funkcje do liczenia czasu pomiedzy impulsami, licznik T2 tego uC po sygnale na wejscie T2EX przepisuje wartosc licznika do specjalnych rejestrow i zeruje się i tak do kolejnego impulsu. Ja to wykorzystuje do sprawdzania prędkości generatora SRG.
    pozdrawiam
    trikess


    Oparcie pomiaru na Input Capture jest niewygodne, bo otrzymujemy czas/impuls, a chcemy to przedstawic w impulsy/czas, a dokładniej impulsy/2 na 1sek. Strasznie dużo obliczeń i chyba bez dzielenia się nie obejdzie. Najprostszy sposób to wykorzystac jeden licznik do zliczania impulsów, a drugi do generowania 0,5s. Wtedy w tym pierwszym otrzymujemy obroty/sek. Jesli to ma byc kilka wiatrakow, a my mamy tylko dwa timery, no to trzeba użyć przerwań zewnętrznych i zwiększac w nich jakąś 16 bitową zmienna, czyli dwa rejestry na jedno przerwanie zewnętrzne (osobna zmienna dla każdego wiatraka/przerwania zewnetrznego). Wtedy jest chyba najmniej obliczeń. Jak mamy duzo wiatraków ... mysle że ciężko jest władować do komputera więcej niż 5 ... to trzeba wziąśc pod uwage szybkość taktowania procka. Bo jeśli mamy pieć wiatraków, które w najgorszym przypadku krecą się wszystkie na 10000 obr/min to mamy 20000 (bo dwa impulsy na obrót) razy 5 wiatraków = 100000 przerwań na sekunde. Każde przerwanie zajmuje minimalnie 4(wejście) + 2(incrementacja 16 bitowej liczby) + 4(wyjście) = 10 cykli .... czyli 1Mhz idzie na obsługe samych przerwań a jeszcze to trzeba przesłac, wyświetlić itd, więc zegar od 4Mhz w góre. Tutaj dochodzi jeszcze taki problem, że jeśli procedury obsługi przerwań są tak skonstruowane jak powyżej pisałem, to zmieniają SREG, więc trzeba uważać. Ale ponieważ uP będzie się głównie nimi zajmował, to lepiej przy korzystaniu z SREG (jakieś skoki warunkowe itd) wyłączyć na chwilke przerwania i zaraz włączyć (co by jakieś przerw. nie zdążyło się zgłosić dwa razy bo je pominiemy) bo sa one kolejkowane przez uP.

    No i ... chyba więcej tutaj na temat software'u się nie da napisać :D

    Powodzenia
  • VIP Zasłużony dla elektroda
    lbugiera napisał:


    ... mysle że ciężko jest władować do komputera więcej niż 5 ... to trzeba wziąśc pod uwage szybkość taktowania procka. Bo jeśli mamy pieć wiatraków, które w najgorszym przypadku krecą się wszystkie na 10000 obr/min to mamy 20000 (bo dwa impulsy na obrót) razy 5 wiatraków = 100000 przerwań na sekunde. Każde przerwanie zajmuje minimalnie 4(wejście) + 2(incrementacja 16 bitowej liczby) + 4(wyjście) = 10 cykli .... czyli 1Mhz idzie na obsługe samych przerwań a jeszcze to trzeba przesłac, wyświetlić itd, więc zegar od 4Mhz w góre. Tutaj dochodzi jeszcze taki problem, że jeśli procedury obsługi przerwań są tak skonstruowane jak powyżej pisałem, to zmieniają SREG, więc trzeba uważać. Ale ponieważ uP będzie się głównie nimi zajmował, to lepiej przy korzystaniu z SREG (jakieś skoki warunkowe itd) wyłączyć na chwilke przerwania i zaraz włączyć (co by jakieś przerw. nie zdążyło się zgłosić dwa razy bo je pominiemy) bo sa one kolejkowane przez uP.

    No i ... chyba więcej tutaj na temat software'u się nie da napisać :D

    Powodzenia


    10000 RPM (rotation per minute) = 200000 impulsów ale na minute codaje 333 impulsów na sekunde od jednego wiatraka smigającego z niewyobrazalna predkościa ;) a zatem mozna przyjac ze w czasie pomiary 0.5s nawet 8 bitowego licznika nie przepełnisz...
    Inna sprawa jest taka że przecież nie trzeba mierzyc wszystkich prędkości wtym samym czasie... przy ogromnej bezwładności silnika wentylatora mozna wykorzystujac jeden licznik przlaczac tylko pomiedzy kolejnymi wentylatorami, dla 5 wentylatorów pomiar bedzie aktualizowany co jakies 3 sekundy... wydaje mi sie ze to w zupełności wystrczy....

    Pozdrawiam
  • Poziom 21  
    crazy_phisic napisał:

    10000 RPM (rotation per minute) = 200000 impulsów ale na minute codaje 333 impulsów na sekunde
    Pozdrawiam


    Ojjj ... przepraszam ... rzeczywiście ... pomyliłem się za co przepraszam :D.

    No a co do dokładności pomiaru, to oczywiście, że można co 3 sekundy. Zależy co kto woli. Ale wydaje mi się, że przełączanie to niezbyt dobry pomysł, bo trzeba dodac multiplekser i go obsłużyć, a po co jak mamy wolne piny (mówie np. o ATtiny2313, bo on ma więcej niż 2 przerwania zewnetrzne). Teraz jak się obciązenie procka drastycznie zmniejszyło :D (60 razy) to nie ma co spowalniac zliczania impulsów, można je najwyżej te wartości odczytywąć rzadziej niż co 0,5 sek.

    Powodzenia
  • Poziom 10  
    Muszę przyznac ze chodzi wlasnie o wieksza liczbe wiatrakow.
    Niestety moj mikrokontroler niema juz wolnych pinow-wiec bedzie kicha z mierzeniem predkosci obrotowej.Kiedy bede rozbudowywal caly uklad o wyswietlacz LCD Graficzny to bede musial sie zaopatrzec w drugi mikrokontroler i tam napewno znajdzie sie miejsce na te opcje.
    Jezeli chodzi o ilosc wiatrakow to bedzie ich 6. i tylez samo DS18B20.

    Dziekuje za liczne propozycje rozwiazania mojego problemu.
  • VIP Zasłużony dla elektroda
    podliczmy:
    - LCD graficzny to 13 wyprowadzen
    - ds1820 wisza na jednym wyprowadzeniu
    - pomiar predkosci to 1 wyprowadzenie
    - 3 wyprowadzenie do przelaczania wentylatorów
    - zostaje 5 pinow :)

    wiec masz jeszcze sporo mozliwosci rozbudowy..
    i zawsze mozesz dac porty I/O np na I2C...

    Pozdrawiam
  • Poziom 11  
    lbugiera napisał:

    Oparcie pomiaru na Input Capture jest niewygodne, bo otrzymujemy czas/impuls, a chcemy to przedstawic w impulsy/czas, a dokładniej impulsy/2 na 1sek. Strasznie dużo obliczeń i chyba bez dzielenia się nie obejdzie. Najprostszy sposób to wykorzystac jeden licznik do zliczania impulsów, a drugi do generowania 0,5s. Wtedy w tym pierwszym otrzymujemy obroty/sek. Jesli to ma byc kilka wiatrakow, a my mamy tylko dwa timery, no to trzeba użyć przerwań zewnętrznych i zwiększac w nich jakąś 16 bitową zmienna, czyli dwa rejestry na jedno przerwanie zewnętrzne (osobna zmienna dla każdego wiatraka/przerwania zewnetrznego). Wtedy jest chyba najmniej obliczeń.


    Czas/impuls czy impuls/czas to jest tylko kwestia programowa, zależy czego potrzebujemy. Ja do obliczania z tego prędkości musiałem użyć dzielenia wielobajtowego, ale niestety to było jedyne rozwiązanie, gdyż pozostałe dwa liczniki użyłem do załączania pasm w generatorze SRG. Dzielenie wielobajtowe zajmuje strasznie dużo czasu (ok. 700 cykli zegarowych :( )
  • Poziom 21  
    trikess napisał:

    Czas/impuls czy impuls/czas to jest tylko kwestia programowa, zależy czego potrzebujemy. Ja do obliczania z tego prędkości musiałem użyć dzielenia wielobajtowego, ale niestety to było jedyne rozwiązanie, gdyż pozostałe dwa liczniki użyłem do załączania pasm w generatorze SRG. Dzielenie wielobajtowe zajmuje strasznie dużo czasu (ok. 700 cykli zegarowych :( )


    Nie wiem jak dokładnie wyglądał twój układ i czy mogłes tak zrobić, ale skoro jeden licznik był wykorzystywany do input capture, to nie lepiej było go ustawić w trybie clear-on-compare bądź compare match a lub b (jeśli już był wykorzystywany do generowania jakiejś podstawy czasu ) na 0,5 sek i jednocześnie ustawić przerwanie input capture i w nim zwiększac licznik impulsów ?? (Ten sam pin, ten sam timer , a duzo prościej) .... O ile warto to rozgrzebywac, co mogłeś, a co nie ... Ważne, że ci działało.

    Pozdrowienia.
  • Poziom 11  
    lbugiera napisał:


    Nie wiem jak dokładnie wyglądał twój układ i czy mogłes tak zrobić, ale skoro jeden licznik był wykorzystywany do input capture, to nie lepiej było go ustawić w trybie clear-on-compare bądź compare match a lub b (jeśli już był wykorzystywany do generowania jakiejś podstawy czasu ) na 0,5 sek i jednocześnie ustawić przerwanie input capture i w nim zwiększac licznik impulsów ?? (Ten sam pin, ten sam timer , a duzo prościej) .... O ile warto to rozgrzebywac, co mogłeś, a co nie ... Ważne, że ci działało.

    Pozdrowienia.


    Jest to na takiej zasadzie, że musze sterować 5 pasmami generatora w zależności od prędkości i zadanego kąta włączenia i wyłączenia pasma, a więc jednym licznikiem T2 zliczałem czas pomiędzy impulsami z enkodera, licznikiem T0 załączałem kolejne pasma, a licznikiem T1 wyłączałem te pasma. Jednym z większych problemów był taki że pierwsze pasmo mogło być włączone jeśli zostało już załączone kolejne pasmo i to że załączenie i wyłączenie tych 5 pasm nie zawsze mieściło się pomiędzy impulsami od prędkości, które zliczały nowe wartości. Ale chyba to nie ten temat tu jest poruszany, więc jeśli ktoś ma jakieś pytania do sterowania generatorem SRG to zapraszam, postaram się odpowiedzieć na tyle ile jestem w stanie

    pozdrawiam
    trikess