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

Obrotomierz modelarski - avr-gcc - mega16

pubus 05 Sty 2006 14:16 6276 18
  • #1 05 Sty 2006 14:16
    pubus
    Poziom 30  

    Witam...

    Bawie się troche z silnikami BLDC (przeróbki na 3f)...
    W związku z tym potrzebowałem obrotomierz...
    A do rzeczy wziąłem się tak...
    Mam w rurce zamontowaną żarówkę przed nią osłąnięte fotoogniwo z kalkulatora...
    Pomiędzy żarówką a ogniwem wiruje śmigło...
    Sygnał z ogniwa wzmacniam w dwóch stopniach na tranzystorach a potem podaje na inwerter (zwarte wejścia NAND) i dostaje ładny sygnał ttl...
    Do tego momentu jest wszystko ok...
    Dalej sygnał podaje na wejście zliczają w uC (PB1(T1))...
    Program jest generalnie prosty jak konstrukcja cepa...
    Timer2 pracuje w trybie asynchronicznym z kwarcem 32kHz i daje przerwanie co 1s...
    Timer1 pracuje w trybie normalnym zliczając przy narastającym zboczu z wejścia T1...
    Przy przerwaniu od timer2 sprawdzam stan rejestru timer1 zeruje i odczytaną wartość wyświetlam na lcd...
    Lcd nie ma na schemacie ale to najzwyklejszy 2x16 na HD44780 w trybie 8-bitowym...
    Problem w tym, że wskazania są bardzo nie stabilne...
    Przy 2000-3000 tys wachania są 200-300 obrotów a to już sporo...
    Nie bardzo wiem skąd się to bierze...

    Jeśli macie jakieś sugestie lub pomysły...
    Albo widzicie, że coś zawaliłem to się nie krępujcie...

    Code:

    void Timer_Init (void)
    {
     TCCR1A = 0b00000000;
     TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10); //timer zlicza z zewnętrznego źródła (T1), zbocze narastające
    }


    void Start_Clock(void) // inicjalizacja timer2 do pracy z kwarcem 32kHz
    {
     ASSR = (1 << AS2); //timer2 ustawiony na prace asynchroniczną z kwarcem 32kHz
     TCCR2 = (1 << CS22) | (1 << CS20); //| (1 << CS20); //prescaler na 128 => przepełnienie co 1s
     TIMSK |= (1 << TOIE2); //aktywne przerwanie przepełnienia od timer2
    }



    int main(void)
    {
     DDRA = 0b11111111; 
     DDRD = 0b11000000;
     
     unsigned int dt, t, s, d, temp;
     unsigned char napis[11] = " Obroty/min", i;

     Start_Clock();
     Timer_Init();
     lcd_init();
     sei();
     
     
     
     for(;;)
     {
     
     
       if(wys==1)
      {
       rpm = rpm / 2;
       rpm = rpm * 60;
       
       lcd_clear();
       
       lcd_data(napis[0]);
       dt = rpm/10000;           lcd_data(ascii(dt));
       temp = rpm - (dt*10000);
       t = temp/1000;            lcd_data(ascii(t));
       temp = temp - (t*1000);
       s = temp/100;             lcd_data(ascii(s));
       temp = temp - (s*100);
       d = temp/10;              lcd_data(ascii(d));   
       temp = temp - (d*10);     
       lcd_data(ascii(temp));
       
       for(i=0; i<11; i++)
       {lcd_data(napis[i]);}
       
       
       wys=0;
      }
     
     }

     
     return(0);
    }



    SIGNAL (SIG_OVERFLOW2) // obsługa przerwania od timer2 => przepełnienie
    {
     rpm = TCNT1;
     TCNT1 = 0;
     wys = 1;
    }


    Aha mega pracuje na wewnętrznym generatorze 8MHz...

    Obrotomierz modelarski - avr-gcc - mega16

    0 18
  • #2 05 Sty 2006 15:37
    Olo999
    Poziom 21  

    pubus napisał:
    Przy 2000-3000 tys

    A tyle obrotów uzyskujesz na sekundę czy na minutę?
    Może jakieś inne źródło światła zakłóca pomiar. Jak dokonujesz pomiaru włączasz silnik i odczekujesz jakiś czas aż się obroty ustabilizują i dopiero wtedy włączasz pomiar? Przepełnienie od timer2 to chyba co 0.97 sekundy (chyba nie ma to dużego znaczenia).
    Podłącz na wyjście NANDa częstotliwościomierz, porównaj pomiar z układem.i jeszcze spróbuj po wejściu w obsługę przerwania timer2 najpierw zablokować wszystkie przerwania

    0
  • #3 05 Sty 2006 15:57
    GienekS
    Poziom 32  

    Na wejście zliczające podaj sygnał z generatora i zobaczysz jakie są różnice.

    0
  • #4 05 Sty 2006 16:43
    pubus
    Poziom 30  

    Jak widać w programie najpierw dziele odczytaną wartość timer1 przez 2 (bo śmigło ma dwie łopaty) potem mnoże razy 60 żeby uzyskać ilość obrotów na minutę... co też widać w zdefiniowanym tekście do wyświetlania...
    Co do stabilizacji obrotów to nie powinno mieć to znaczenia wskazanie powinno być dokładne nawet jeżeli silnik się dopiero rozpędza itp...
    Nie przerwanie jest co 1s...
    Timer2 pracuje z kwarcem zegarkowym (32768Hz)...
    Jak bym miał częstotliwościomierz to bym się nie bawił w pisanie go od nowa...
    Wyłączanie przerwań raczej nic nie da bo nie ma aktywnych przerwań poza tym od timer2...

    Dzięki GienekS...
    Proste a nie wpadłem na to...
    Niestety nie posiadam generatora ale coś pokombinuje...

    0
  • #5 05 Sty 2006 16:50
    bogdan_p
    Poziom 39  

    spróbuj tak jak napisał GienekS , jeżeli nie będzie różnicy to najprawdobodobniej błąd wprowadza układ optyczny , może zastąp układ żarówka - ogniwo , transoptorem szczelinowym lub dioda - fotodioda na podczerwień
    jest jescze jedna możliwość skoro rozbierałeś silniki BLDC masz halotron i jego wykorzystać do pomiaru predkości , oczywiście musisz znać ilość biegunów na wirniku
    jeszcze jedna sprawa czy sterownik silnika BLDC nie wprowadza zakłóceń
    bawiłem się tymi silnikami i do prób polecam TDA5140A
    http://www.elenota.pl/pdf/Philips/tda5140a_2.pdf

    0
  • #6 05 Sty 2006 17:25
    pubus
    Poziom 30  

    Może wyjaśnie coś...
    Na razie nie testowałem tego na tych silniczkach tylko sprawdzam na silniku z magnetofonu...
    DC i stabilne obroty...
    No niestety transoptor szczelinowy nie bardzo się nadaje (przynajmnie żaden z tych który posiadam) bo ma za małą przerwe i śmigło nie przejdzie...
    Co do fotodiody na podczerwień to też bym wolał ale nie mają takiego wynalazku w sklepie a jednej diody nie będe zamawiał...
    Pozatym fotoogniwo to też taka fotodioda...
    Co do sterownika do bldc to mam we własnym wykonaniu...
    Z hallotronami jest problem bo każdy silnik musiał by je mieć...

    0
  • #7 05 Sty 2006 18:33
    genetix
    Poziom 24  

    A może fotoogniwo ma jakąś bezwładność?

    0
  • #8 05 Sty 2006 19:15
    pubus
    Poziom 30  

    Niestety możesz mieć racje...
    Przy sygnale z "generatora" (sygnał podobyny w przebiegu do tego uzyskiwanego z ogniwa ale generowany na uC oczywiście nie tym samym) wskazanie było stabilne...
    Chyba poświęce fototranzystor z transoptora...
    Dzięki za pomoc...
    Jak przerobie układ to dam znać jak poszło...

    0
  • #9 05 Sty 2006 19:46
    bogdan_p
    Poziom 39  

    Cytat:
    Z hallotronami jest problem bo każdy silnik musiał by je mieć...

    każdy BLDC z cd-romu ma napewno 3 szt , inne źródło to dowolny silnik z chłodzenia zasialacz , procesor itp
    dobre są z dużych wentylatorów wyglądem przypominają tranzystor , parametry impulsu wyjściowego są dużo lepsze niż foto elementów

    0
  • #10 05 Sty 2006 20:39
    pubus
    Poziom 30  

    No tak ale sęk w tym, że pierwszą rzeczą przy przróbce jest wywalenie całej elektroniki z silnika bo jest zbędna...
    Hallotrony to niezby wygodne i uniwersalne w tym przypadku rozwiązanie...
    Bo co jeśli zachciało by mi się sprawdzać obroty w silniku DC...?.?.?
    Musiałbym go rozbierać i montować mu hallotron...?.?.?

    0
  • #11 05 Sty 2006 21:09
    bogdan_p
    Poziom 39  

    Cytat:
    No tak ale sęk w tym, że pierwszą rzeczą przy przróbce jest wywalenie całej elektroniki z silnika bo jest zbędna...

    błąd , masz gratisowe źródło halotronów
    Cytat:
    Bo co jeśli zachciało by mi się sprawdzać obroty w silniku DC...?.?.?
    Musiałbym go rozbierać i montować mu hallotron...?.?.?

    nie koniecznie i tak musisz coś mieć na osi silnika aby dokonać pomiaru w Twoim przypadku śmigło , żaden problem umieścić na wirującej części kawałek materiału magnetycznego jeżeli bedzie neodymowy i plastyczny to naprawdę niewielki
    źródło wirnik dowolnego silnika z wentylatora w PC

    0
  • #12 06 Sty 2006 00:37
    pubus
    Poziom 30  

    Hehehe...

    Możemy się tak przegadywać bez końca...
    Dla mnie pomiar za pomocą hallotronów jest poprostu nie wygodny...
    Uwierz mi wiem co mówie...
    Na ośce nic nie zamontuje bo po założeniu śmigła nie ma już na nim miejsca...
    Przyklejać cokolwiek do śmigła też bez sensu...
    Pomiar optyczny jest w tym wypadku najlepszym wyjściem...
    Przerobiłem troche transoptor szczelinowy (rozsunełem leda i fototranzystor) ale sygnał jest bardzo słaby.. także będe dalej kombinował...
    Swoją drogą nie widziałem jeszcze plastycznego neodyma...

    0
  • #13 06 Sty 2006 01:15
    MirekCz
    Poziom 35  

    1.Zobacz na forum Alexa, tam przynajmniej kilka osób coś takiego zrobiło. Na 99% to te fotoogniwa są problemem. Zastąp to normalnym układem dioda/odbiornik IR + bramka schmitta

    2.Jeżeli masz swój regulator 3f to z niego możesz zczytać prędkość obrotową... najprościej =)

    3.Jaki stator / jaka konfiguracja silnika / jaki prąd/napięcia, że uzyskałeś takie niskie obroty?
    Przy normalnej przeróbce spodziewałbym się czegoś na poziomie 10000+obr/min

    0
  • #14 06 Sty 2006 14:41
    McRancor
    VIP Zasłużony dla elektroda

    A może poleprzyć bajer i śmigło zamiast przysłaniać niech odbija :)

    wtedy dioda nadawcza parcująca w IR świeci przed siebie, a pojawiające się śmigło odbija promieniowanie IR dla fotodiody.

    Można wykorzystać ADC atmegi, w w końcu itak go ma, a jest na tyle szybki że bez trudu sobie z tym poradzi. Dodatkowo można zmodulować diode nadawczą i można prostym algorytmem wyeliminować problem oświetlenia zewnętrznego.

    Troszke z tym gimnastyki, ale otrzymałbyś bardzo profesjonalny mierniczek, który nadałby się do mierzenia obrotów silnika nawet bez śmigła, wystarczyłoby nakleić kawałek taśmy która odbija światło lepiej, na obudowe silnika

    0
  • #15 08 Sty 2006 13:57
    pubus
    Poziom 30  

    Jak pisałem wcześniej narazie testuje na wolniejszym silniku...
    Zwykły dc z magnetofonu...
    Co do regla 3f...
    To nie nazwał bym tego tak...
    Mam zrobiony układ na tranzystorach i medze który radzi sobie z rozpędzaniem silnika ale nie posiada żadznych elementów pozwalających na kontrole położenia wirnika...
    Ewentualnie można by próbować liczyć obroty z częstotliwości...
    Forum alexa znam i z tamtąd pochodzi pomysł z tym że tam używają częstotliwościomierza...
    Jest też pomysł na pomiar za pomocą mikrofonu pojemnościowego...
    Sprawdzałem jak to wygląda na kompie...
    Tzn. mikrofon podpięty do kompa i rejestrator...
    No wygląda to dość zachęcająco, ale myślałem, że z optycznym układem będzie mniej zabawy...
    Musze dać mocniejszą diodę IR i powinien działać ten transoptor...
    Narazie nie robiłem nic bo czasu nie miałem...

    0
  • #17 04 Sie 2008 20:11
    arturkumiec
    Poziom 11  

    Witam. Podepnę się do wątku gdyż także buduję obrotomierz.Jednak moja metoda pomiaru opiera się troszkę na innej metodzie . U mnie atmega88 z zegarem 20MHz mierzy okres pomiędzy impulsami z układu wejściowego a następnie wylicza prędkość obrotową . I tak np:przy 30 tyś obr/min timer zliczy 40000 impulsów wzorcowych , następnie wartość odpowiadającą zegarowi czyli 20MHz dzielimy przez wartość zliczoną przez timer a następnie wynik mnożymy przez 60. Otrzymujemy bardzo dokładny odczyt obrotów na minutę. Na przykład przy obrotach 37813obr/min uzyskujemy wynik 37813 i po przecinku kilka cyfr ale one są nie istotne.

    0
  • #18 11 Sie 2008 13:16
    bury104
    Poziom 13  

    Tak było to już dawno omawiane na elektrodzie, niczego nowego nie wnosisz.
    Zastosowanie liczników do mierzenia długości okresu w obrotomierzach wprowadzono już w latach 80-tych zeszłego wieku. W AVR-ach firmy
    Atmel liczniki sa obecne.
    Chodziło mi tu o konkretny opis i strony, które pokozują dokładnie jak zrobić po kolei obrotomierz, konkretny program sterujacy itd...
    Z tego co napisałeś wynika, iż go dopiero budujesz więc nie wiadomo co mierzysz.
    Jak zbudujesz to daj znać!!!

    PZD!!!

    :D:D:D

    0
  • #19 04 Lis 2008 14:50
    bury104
    Poziom 13  

    A tak swoja drogą to dziwię się temu projektowi na fotorezystorze.
    Ogólnie wiadomo iż fotorezystory są dość wolne, kupiłem dwa na avt i czasy reakcji nie są jakieś imponujące od 20-30ms.
    To daje max 50Hz, czyli 3000obr/min.
    A śmigła potrafią przecież kręcić się szybciej. Ja bym zastosował prosty fototranzystor (czasy reakcji 100 mniejszy) i diode na IR.

    Do wałka przylejasz kawałek pazłotka (metoda na odbicie) lub wiercisz otwór w wałku lub czymś co się obraca (matoda na zanik sygnału IR przechodzącego przez otwór lub przesłanianie sygnału).

    Takie zabawki dość prosto zrobić.

    0