Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom] Sterownik wentylatorów PC

LED5W 21 Mar 2010 19:29 5721 33
  • #1
    LED5W
    Level 33  
    Witam

    Może najpierw przedstawię założenia:
    - min. 4 kanały w tym co najmniej 1 PWM 25kHz*
    - bezgłośność - f PWM ≥ 20kHz
    - możliwość rozbudowy do 5-6 kanałów
    - kontrola obrotów dla każdego kanału
    - komunikacja z PC po UART

    * - gdzieś kiedyś znalazłem, że taką częstotliwością powinny być sterowane czteropinowe wentylatory


    Pytania:
    - Jakiego µC użyć?
    - Czego użyć do sterowania? Wbudowanego PWM, czy może jakiś DAC?
    - Jak sprawdzać obroty z tylu kanałów?
  • #2
    FastProject
    Level 28  
    Ja bym wykorzystał układy PWM sterowane z I2C. Do tego jakiś procesor AVR.
  • #3
    LED5W
    Level 33  
    Dobrze by było. Jakieś konkretne przykłady? Powinny być w miarę tanie i najlepiej, gdyby miały kilka (najlepiej wszystkie) kanały w jednym chipie.
    No i pozostaje kwestia pomiaru obrotów.
  • #5
    LED5W
    Level 33  
    Przeszukując sieć znalazłem coś takiego Link. Na pierwszy rzut oka wygląda ciekawie, rozwiązuje problem z kontrolą obrotów. Chyba wszystko da się odczytać z poziomu uC. Tylko szkoda, że tylko 1 kanał.

    Gdybym zastosował jakiś zewn. PWM, to jak sprawdzać obroty?
  • #6
    FastProject
    Level 28  
    Zobacz jeszcze tu: http://para.maxim-ic.com/en/search.mvp?fam=fan_cntrl&tree=master

    Ogólnie jak widzisz układy tego typu mają wejście TACHO do kontroli obrotów. Gdy zastosujesz wentylatory z wbudowanym czujnikiem obrotów to chyba nie będzie problemu-no chyba, że musisz mieć jakieś inne wentylatory nie posiadające czujnika to wtedy sam musisz taki czujnik zamontować i przystosować do wejścia TACHO.
  • #7
    LED5W
    Level 33  
    Daro_Elektronik wrote:
    Ogólnie jak widzisz układy tego typu mają wejście TACHO do kontroli obrotów. Gdy zastosujesz wentylatory z wbudowanym czujnikiem obrotów to chyba nie będzie problemu

    Tak, chodziło mi o przypadek ze zwykłym PWM a nie specjalnie do wentylatorów.

    Z tych maximów to chyba najlepszy byłby MAX6620. Tylko jak ja sobie poradzę z TQFN... I co z dostępnością?

    Generalnie algorytm sterowania będzie na uC.
  • #8
    mirekk36
    Level 42  
    Kurczę, przecież takie cztery kanały oraz sprawdzanie można zrobić na jednym procku AVR. Wystarczy zwykły programowy PWM 8-bitowy a jak się uprzesz to i 9 bitowy. Co za problem?

    Masz tyle kanałów ile chcesz, częstotliwość spokojnie można wyciągnąć powyżej 20kHz, Każdy oddzielnie płynnie sterować i wszystko spinać przez RS232 za pomocą także procka. Po co jakieś zewnętrzne scalaki? ;)

    Jaki uC ???? dowolny AVR np taki, który posiada już sprzętowy RS232 żebyś nie musiał programowo robić bo wtedy by się gryzło co nieco z programowym PWM'mem
  • #9
    FastProject
    Level 28  
    mirekk36 wrote:
    Kurczę, przecież takie cztery kanały oraz sprawdzanie można zrobić na jednym procku AVR. Wystarczy zwykły programowy PWM 8-bitowy a jak się uprzesz to i 9 bitowy. Co za problem?


    Żaden problem, to tylko luźne sugestie. Poza tym tak na prawdę nie wiemy, czy kolega będzie jeszcze coś poza wysłaniem RS232 coś jeszcze na procesorze robił.
    Niemniej jednak uważam że warto wiedzieć, że są takie układy. A biorąc pod uwagę, rozbudowę to taki układ może się przydać w przyszłości, gdy zabraknie pinu uP na sprzętowy czy programowy PWM, a będzie w systemie szyna I2C.
  • #10
    LED5W
    Level 33  
    mirekk36 wrote:
    Kurczę, przecież takie cztery kanały oraz sprawdzanie można zrobić na jednym procku AVR. Wystarczy zwykły programowy PWM 8-bitowy a jak się uprzesz to i 9 bitowy. Co za problem?

    A taki, że trzeba jeszcze sprawdzać ilość obrotów na minutę. Jak byś to rozwiązał? Przyjmując najgorszy przypadek (czyli BOXowy wiatrak Intela ;)) to mamy maks. jakieś 4500RPM. Zawsze 2 impulsy na obrót.
  • #11
    mirekk36
    Level 42  
    LED5W wrote:
    mirekk36 wrote:
    Kurczę, przecież takie cztery kanały oraz sprawdzanie można zrobić na jednym procku AVR. Wystarczy zwykły programowy PWM 8-bitowy a jak się uprzesz to i 9 bitowy. Co za problem?

    A taki, że trzeba jeszcze sprawdzać ilość obrotów na minutę. Jak byś to rozwiązał? Przyjmując najgorszy przypadek (czyli BOXowy wiatrak Intela ;)) to mamy maks. jakieś 4500RPM. Zawsze 2 impulsy na obrót.


    hmmm dowolnym przerwaniem, a jeśli ma ich być wiele np 5 albo 6 to może wykorzystać nawet przerwania PCINT (oczywiście w prockach, które je posiadają) a następnie za pomocą jakiegoś Timer'a odmierzać precyzyjnie czas. Wykorzystując może Timer1 w trybie ICP.
  • #12
    LED5W
    Level 33  
    mirekk36 wrote:
    hmmm dowolnym przerwaniem, a jeśli ma ich być wiele np 5 albo 6 to może wykorzystać nawet przerwania PCINT

    Ma być ich wiele i PCINT to jedyne rozwiązanie. Tylko, czy to będzie dobrze działało? Jak by miała wyglądać procedura przerwania od PCINT? Mogę prosić jakiś kod szkieletowy?

    mirekk36 wrote:
    Masz tyle kanałów ile chcesz, częstotliwość spokojnie można wyciągnąć powyżej 20kHz

    Tylko przy jakim taktowaniu?

    Na razie będą 4 wiatraki i 2 czujniki temperatury (nie wiem jeszcze, czy cyfrowe czy analogowe, ale to na razie bez znaczenia). Później może będzie LCD (alfanum.) i kilka przycisków.
  • #13
    mirekk36
    Level 42  
    LED5W wrote:
    mirekk36 wrote:
    hmmm dowolnym przerwaniem, a jeśli ma ich być wiele np 5 albo 6 to może wykorzystać nawet przerwania PCINT

    Ma być ich wiele i PCINT to jedyne rozwiązanie. Tylko, czy to będzie dobrze działało? Jak by miała wyglądać procedura przerwania od PCINT? Mogę prosić jakiś kod szkieletowy?

    mirekk36 wrote:
    Masz tyle kanałów ile chcesz, częstotliwość spokojnie można wyciągnąć powyżej 20kHz

    Tylko przy jakim taktowaniu?

    Na razie będą 4 wiatraki i 2 czujniki temperatury (nie wiem jeszcze, czy cyfrowe czy analogowe, ale to na razie bez znaczenia). Później może będzie LCD (alfanum.) i kilka przycisków.


    Kod szkieletowy to by trzeba było dopiero napisać ;) generalnie używasz przerwanie od PCINT i możesz sprawdzić w odpowiednim rejestrze, zdaje się, który pin zgłosił przerwanie. Wtedy trzeba by odczytywać wartość kręcącego się timera żeby odczytać czas pomiędzy ostatnim impulsem dla danego pinu.

    Taktowanie, no przydałoby się jakieś 16MHz albo 18.432MHz, żeby ci jeszcze RS pięknie chulał na dowolnej prędkości

    A co do czujników temperatury to się już zastanów bo to wcale nie takie już obojętne, jeśli mają to być DS18B20 to będzie trzeba na super minimalny czas odczytu bajtu danych zatrzymywać przerwania.... eeee chociaż co tam, to przecież PWM dla wentylatorów a nie diod LED więc też chyba nie powinno być problemu. No ale to trzeba wszystko wziąć po kolei do kupy i zacząć sprawdzać ;)
  • #14
    LED5W
    Level 33  
    Witam po przerwie

    Nie było mnie na Elektrodzie dość długo, gdyż postanowiłem zrobić sobie przerwę maturalną. ;)


    Wracając do tematu muszę sobie odświeżyć pamięć. ;)

    Na początek można by zaimplementować odczyt RPM (na Tiny2313, bo taki mam), a wynik wysyłać po RS.
  • #15
    LED5W
    Level 33  
    Zanim przejrzałem ten temat, wymyśliłem coś takiego:
    Code:
    'Pokazuje ilość obrotów na minutę
    
    'Pomiar co sekundę, wejście PB0...1

    'Cls : Cursor Off
    $baud = 19200
    Dim Count(2) As Long , Last_state As Byte , Tmp As Byte
    Config Timer1 = Timer , Prescale = 64                       'do odmierzania 1 sek.

    On Timer1 Co1sek
    On Pcint Fan_int
    Portb = 3                                                   'podciąganie wejść kontroli obrotów
    Last_state = Pinb And 3
    Pcmsk = 3                                                   'wejścia kontroli obrotów - ustawienie prerwań od pcint
    Enable Interrupts
    Enable Timer1 : Enable Pcint
    Ddrb.7 = 1                                                  'GND dla wentylatora


    Do
    Loop

    Co1sek:
    Timer1 = 3036                                               ' 65536-3036=62500, 62500*64[prescaler]*0,00000025s=1s
    Print Count(1) ; " " ; Count(2)
    Count(1) = 0
    Count(2) = 0
    Return

    Fan_int:
    Tmp = Last_state.0 + Pinb.0
    If Tmp.0 = 1 Then
       Incr Count(1)
       End If

    Tmp = Last_state.1 + Pinb.1
    If Tmp.0 = 1 Then
       Incr Count(2)
       End If

    Last_state = Pinb And 3
    Return
    Jakieś sugestie poprawek?

    mirekk36 wrote:
    generalnie używasz przerwanie od PCINT i możesz sprawdzić w odpowiednim rejestrze, zdaje się, który pin zgłosił przerwanie.
    W którym rejestrze, bo nie znalazłem?

    mirekk36 wrote:
    Wtedy trzeba by odczytywać wartość kręcącego się timera żeby odczytać czas pomiędzy ostatnim impulsem dla danego pinu.
    Myślisz, że lepiej mierzyć okres, niż liczyć ilość obrotów? Mamy 4 przerwania na obrót.

    mirekk36 wrote:
    Taktowanie, no przydałoby się jakieś 16MHz albo 18.432MHz, żeby ci jeszcze RS pięknie chulał na dowolnej prędkości
    Zaraz, programowo: 16MHz[kwarc]/1[prescaler]/256[timer 8 bit]/256[PWM 8 bit] wychodzi mi 244Hz...

    mirekk36 wrote:
    A co do czujników temperatury to się już zastanów bo to wcale nie takie już obojętne, jeśli mają to być DS18B20 to będzie trzeba na super minimalny czas odczytu bajtu danych zatrzymywać przerwania.... eeee chociaż co tam, to przecież PWM dla wentylatorów a nie diod LED więc też chyba nie powinno być problemu.
    Co do zatrzymywania przerwań to ja mam pewne obawy...
  • #16
    utak3r
    Level 25  
    mirekk36 wrote:
    eeee chociaż co tam, to przecież PWM dla wentylatorów a nie diod LED


    Na chłopski rozum, to nawet 100Hz PWM powinno spokojnie wystarczyć... a wtedy sporo czasu na zadania w międzyczasie :)
    Ew. ustawić jakąś zmienną "odczyt" i w jednym przerwaniu puścić rozkaz do DSa i ustawić ową zmienną i w następnym dopiero (albo i później) odczytać wynik - wtedy nie trzeba będzie zatrzymywać :)
  • #17
    LED5W
    Level 33  
    utak3r wrote:
    Na chłopski rozum, to nawet 100Hz PWM powinno spokojnie wystarczyć...
    Tak, tylko będzie wiatraczek ładnie bzyczał. :|
  • #18
    Logan
    Level 30  
    LED5W wrote:
    utak3r wrote:
    Na chłopski rozum, to nawet 100Hz PWM powinno spokojnie wystarczyć...
    Tak, tylko będzie wiatraczek ładnie bzyczał. :|


    Bardziej buczał, bzyczeć i piszczeć będzie tak pomiędzy 10 - 20kHz.
  • #19
    piotrh2
    Level 11  
    Można wykorzystać układ AT90PWM3. Ma wszystko co potrzebne(6 kanałów PWM z opcją dead-time to aż nadto). Cena również jest przystępna. Pozdrawiam.
  • #20
    LED5W
    Level 33  
    piotrh2 wrote:
    Można wykorzystać układ AT90PWM3. Ma wszystko co potrzebne(6 kanałów PWM z opcją dead-time to aż nadto). Cena również jest przystępna.
    Zgadzam się. |Tylko jak to działa - są 2 timery, "Two or three 12-bit High Speed PSC (Power Stage Controllers) with 4-bit Resolution Enhancement" i sześć kanałów PWM?
    Potrzebuje jeszcze 1 wolny timer do odmierzania czasu.

    Gdyby ktoś był tak dobry i podał jakiś program-demo na ten µC to go w pon. kupuje i testuje. :)

    Dodano po 44 [minuty]:

    Zaraz, ale czy ja dobrze widzę? On nie ma PCINT!?
  • #21
    piotrh2
    Level 11  
    PSC0, PSC1, PSC2 wykorzystuje się do generowania PWM. Nadal pozostają do wykorzystania 2 timery, działają niezależnie od kontrolerów PSC. Co do braku PCINT to proszę zauważyć, że układ ma INT0, INT1 i INT2.
  • #22
    LED5W
    Level 33  
    piotrh2 wrote:
    PSC0, PSC1, PSC2 wykorzystuje się do generowania PWM. Nadal pozostają do wykorzystania 2 timery, działają niezależnie od kontrolerów PSC.
    Rozumiem, że wyjścia tych PWM to PSCOUT - dlaczego jest ich 8?

    Bardzo proszę o jakiś przykład kodu w bascomie, na dobry początek, bo mi się zaczyna ten µC podobać. ;)

    piotrh2 wrote:
    Co do braku PCINT to proszę zauważyć, że układ ma INT0, INT1 i INT2.
    Jeden dodatkowy "INT" mnie nie ratuje. Będzie trzeba podłączyć wyjścia kontroli obrotów przez diody do jednego INT, a na osobnych nóżkach sprawdzać od którego wiatraka mamy przerwanie.
  • #23
    PO.
    Level 20  
    Tak samo jak PCINT, tyle że tracisz jedną nóżkę i masz więcej ścieżek i elementów.
    W sumie ja też unikam procesorów bez tego, ale nie jest to straszne jak nie ma.
    Z PWM bawiłbym się softwarowo, możesz wtedy dowolnie kanałów narobić ile masz wolnych nóżek ;) .

    Podsumujmy ile CI potrzeba:
    6 wentylatorów x2 = 12
    uart = 2
    lcd, 4bit+r/w = 7
    1w do termometrów =1
    razem 22

    No to jesteś akurat na styk dla "mniejszych procesorów" (dip28), np. atmega168/328. Z większych masz atmega 164/324, albo ze starszych bez pcint atmega16/32. Trzymaj się typowych.

    Aha, chcesz jakieś przyciski do sterowania czy wszystko z kompa? Źle może policzyłem piny.
  • #24
    utak3r
    Level 25  
    PO. wrote:
    No to jesteś akurat na styk dla "mniejszycg procesorów" (dip28)


    To ma być "mniejszy" procesor??... "Mniejszy" to ma 18 pinów, malutkie mają 6 lub 8...
  • #25
    LED5W
    Level 33  
    PO. wrote:
    Z pwm bawiłbym się softwarowo, możesz wtedy dowolnie kanałów narobić ile masz wolnych nóżek ;) .
    I osiągnął byś 25kHz...
    Chciałbym mieć jeszcze trochę czasu w programie.
    Pomysł jest taki, że przez UART przesyłamy sterownikowi jak ma reagować na temperatury z określonych czujników.

    PO. wrote:
    Podsumujmy ile CI potrzeba:
    6wentylatorów x2 = 12
    uart = 2
    lcd, 4bit+r/w = 7
    1w do termomerów =1
    razem 22
    Jak LCD to z podświetleniem, więc +1 i chyba rzeczywiście użyję termometrów na 1-wire.

    PO. wrote:
    No to jesteś akurat na styk dla "mniejszych procesorów" (dip28), np atmega168/328. Z większych masz atmega 164/324, albo ze starszych bez pcint atmega16/32. Trzymaj się typowych.
    Chyba jednak się skuszę na tego AT90PWM3. Ktoś próbował uruchomić na nim te PSC?

    PO. wrote:
    Aha, chcesz jakieś przyciski do sterowania czy wszystko z kompa? Źle może policzyłem piny.
    Na razie chciałbym zrobić wersję minimalistyczną - bez przycisków, a nawet bez LCD. ;)

    Dodano po 2 [minuty]:

    utak3r wrote:
    PO. wrote:
    No to jesteś akurat na styk dla "mniejszych procesorów" (dip28)


    To ma być "mniejszy" procesor??... "Mniejszy" to ma 18 pinów, malutkie mają 6 lub 8...
    Mniejszych w "", czyli względem ilości pinów, które są potrzebne. ;)
  • #26
    PO.
    Level 20  
    utak3r wrote:
    PO. wrote:
    No to jesteś akurat na styk dla "mniejszycg procesorów" (dip28)


    To ma być "mniejszy" procesor??... "Mniejszy" to ma 18 pinów, malutkie mają 6 lub 8...


    Wybacz ale mniejszych niż a8/a88 to mogę używać do migania jedną diodką albo sterowania jakimś jedym odbiornikiem, z parametrami zadawanymi przez drugiego procka (i2c/uart/1w).
    Może docelowo program mi strasznie nie puchnie nawet przy dużym kodzie ale też poniżej 8kB nie ma co zaczynać jak chcemy mieć lcd i kilka funkcji, jakieś opcje z zewnątrz itp a nie jeden napis.

    Dodano po 3 [minuty]:

    LED5W wrote:
    PO. wrote:
    Z pwm bawiłbym się softwarowo, możesz wtedy dowolnie kanałów narobić ile masz wolnych nóżek ;) .
    I osiągnął byś 25kHz...
    Chciałbym mieć jeszcze trochę czasu w programie.
    Pomysł jest taki, że przez UART przesyłamy sterownikowi jak ma reagować na temperatury z określonych czujników.

    PO. wrote:
    Podsumujmy ile CI potrzeba:
    6wentylatorów x2 = 12
    uart = 2
    lcd, 4bit+r/w = 7
    1w do termomerów =1
    razem 22
    Jak LCD to z podświetleniem, więc +1 i chyba rzeczywiście użyję termometrów na 1-wire.

    PO. wrote:
    No to jesteś akurat na styk dla "mniejszych procesorów" (dip28), np atmega168/328. Z większych masz atmega 164/324, albo ze starszych bez pcint atmega16/32. Trzymaj się typowych.
    Chyba jednak się skuszę na tego AT90PWM3. Ktoś próbował uruchomić na nim te PSC?

    PO. wrote:
    Aha, chcesz jakieś przyciski do sterowania czy wszystko z kompa? Źle może policzyłem piny.
    Na razie chciałbym zrobić wersję minimalistyczną - bez przycisków, a nawet bez LCD. ;)


    Przy zegarze ~20MHz spokojnie się wyrobisz. Najwyżej zatrzymuj na chwilę pwm, jak transmisja będzie. Albo właczaj na full, skoro to wiatraki, żeby coś nie padło ;) . Nie będzie to przeszkadzało.
    1w zrobisz poza przerwaniem i powinno działać.

    To może od razu programowy kontrast też, czyli +2piny :) ? Właśnie się z tym bawię (przy wolniejszym pwm) i mi wyświetlacz miga...
  • #27
    LED5W
    Level 33  
    PO. wrote:
    Przy zegarze ~20MHz spokojnie się wyrobisz.
    Ja to liczyłem, ale mi nie wyszło (patrz wyżej) - proszę mnie oświecić.

    PO. wrote:
    Najwyżej zatrzymuj na chwilę pwm, jak transmisja będzie. Albo właczaj na full, skoro to wiatraki, żeby coś nie padło ;) . Nie będzie to przeszkadzało.
    Na full to będzie bardzo przeszkadzało. :D

    PO. wrote:
    To może od razu programowy kontrast też, czyli +2piny :) ? Właśnie się z tym bawię (przy wolniejszym pwm) i mi wyświetlacz miga...
    Wyświetlacze - przynajmniej na razie - zostawmy w spokoju. :P
  • #28
    sulfur
    Level 24  
    Ja tylko tak luźno dodam, że na pomiar impulsów z trzypinowego wiatraczka przy sterowaniu masą przez PWM bym nie liczył.
  • #29
    utak3r
    Level 25  
    PO. wrote:
    Wybacz ale mniejszych niż a8/a88 to mogę używać do migania jedną diodką albo sterowania jakimś jedym odbiornikiem, z parametrami zadawanymi przez drugiego procka (i2c/uart/1w).
    Może docelowo program mi strasznie nie puchnie nawet przy dużym kodzie ale też poniżej 8kB nie ma co zaczynać jak chcemy mieć lcd i kilka funkcji, jakieś opcje z zewnątrz itp a nie jeden napis.


    No to żeś mnie rozbawił do łez teraz :D
    Jakoś w 2kB potrafię zmieścić obsługę kilku peryferiów (tak, LCD też) i szybką transmisję przez RS. O czym Ty mówisz, człowieku....
  • #30
    regrom
    Level 16  
    sulfur wrote:
    Ja tylko tak luźno dodam, że na pomiar impulsów z trzypinowego wiatraczka przy sterowaniu masą przez PWM bym nie liczył.


    Walczyłem z tym problemem, bezskutecznie, pomimo rad elektrodowiczów tanio, szybko i łatwo nie da się tego zrobić:
    KLIK

    Robiłem też projekt do regulacji wentylatorów, ale z powodu tego problemu nie ma tam pomiaru prędkości obrotowej.

    Tu masz opis mojego sterownika: Klik

    Co prawda tylko 3 wiatraki, ale jak piszą koledzy programowy pwm rozwiąże problem. Aha i jak chcesz sterować pwm i bez problemu mierzyć rpm, zastosuj wiatraki 4 pinowe.