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.

[C++] Dokładny generator prostąkątny 30kHz do 45kHz Arduino

biceps_swir 18 Mar 2017 22:56 1509 16
  • #1 18 Mar 2017 22:56
    biceps_swir
    Poziom 10  

    Witam.
    Proszę o wskazówki, jak napisać program w C++ do zbudowania generatora przebiegu prostokątnego, o wypełnieniu 50%.
    Niby wszystko załatwia funkcja tone() w Arduino. Modulacja częstotliwości też była by banalna. Próbowałem też z przerwaniami biblioteka "timer0".
    Ale problemem dla mnie, jest bardzo niedokładna powtarzalność "impulsów" przebiegu. Mam tym sterować przez OPA i Driver, dużymi kluczami w przetwornicy. Pytanie czy w ogóle da się, wygenerować ładny powtarzalny prostokąt o takiej częstotliwości przez attiny85 np.
    Pozdrawiam

    0 16
  • #2 18 Mar 2017 23:59
    2675900
    Użytkownik usunął konto  
  • #3 19 Mar 2017 00:10
    biceps_swir
    Poziom 10  

    Nie potrzebuje PWM!
    a pytania w ogóle nie rozumiem.

    0
  • #4 19 Mar 2017 00:15
    2675900
    Użytkownik usunął konto  
  • #5 19 Mar 2017 00:45
    biceps_swir
    Poziom 10  

    Piotrus_999 napisał:
    po dłuższej chwili tentegowania podziel się czy coś wytentegowałeś.


    jak to się ma do mojego problemu ? Co z tego że napisze prog, z pwm czy bez ? Zobacz w czym jest problem ... napisałem. A jeśli chcesz pomóc to
    Piotrus_999 napisał:
    Hint: PWM dalej sam czytaj
    Nic nie wnosi.
    Pozdro :]

    0
  • #6 19 Mar 2017 00:50
    2675900
    Użytkownik usunął konto  
  • #7 19 Mar 2017 00:52
    yogi009
    Poziom 42  

    biceps_swir napisał:
    Nic nie wnosi.


    PWM dotyczy poziomu wypełnienia impulsu, więc to jest jak najbardziej temat dla Ciebie. A tak swoją drogą, nie zastanawiałeś się nad dedykowanym sterownikiem PWM?

    0
  • #8 19 Mar 2017 01:08
    2675900
    Użytkownik usunął konto  
  • #9 19 Mar 2017 01:45
    biceps_swir
    Poziom 10  

    No ok inaczej. Potrzebuje 50% wypełnienia, ustawiam na stałe.
    Jako wyjście deklaruje piny PWM. Częstotliwość powiedzmy na 20kHz. Na wyjściu mam piękne prostokąty, a właściwie kwadraty. Tylko na Osyloskopie wyraźnie widać jak co chwilkę przeskakuje jakiś rozciągnięty albo za krótki impuls. Generalnie przebieg jest nierówny. Próbowałem na Arduino Leonardo, i na gołym Attiny85.

    [C++] Dokładny generator prostąkątny 30kHz do 45kHz Arduino

    to na temat pwm w moim arduino znalazłem.

    Cytat:
    A tak swoją drogą, nie zastanawiałeś się nad dedykowanym sterownikiem PWM?

    Już pewnie dawno było by po sprawie... tylko niestety mam płytkę przygotowaną już pod inne rozwiązanie i jeżeli będzie to takie proste jak koledzy piszą, to chciałbym ją zaadaptować i napisać tylko stosowny program.

    Dodano po 6 [minuty]:

    Piotrus_999 napisał:
    Dam ci jeszcze jedem hint - czym sie rózni sygnał 0 od prostokąta lub sygnału stałego 1.

    Drugi hint: PWN ma dwa prametry - częstotliwość i wypełnienie.


    Proszę Cię kolego, wiem że na pewno wiesz 12345 tys więc w temacie Cyfrówki... to PWM o które tak Ci chodzi to banał. Problem w tym że procek chyba się nie wyrabia albo ja coś źle kombinuje. Albo nie ogarnę programowo takiego dokładnego przebiegu

    Dodano po 11 [minuty]:

    jutro nagram filmik tego co wychodzi w uC "o co mi chodzi" bo może nie umiem tego opisać.
    Dobrej nocy

    0
  • #10 19 Mar 2017 01:53
    2675900
    Użytkownik usunął konto  
  • #11 19 Mar 2017 23:27
    biceps_swir
    Poziom 10  

    Witam.
    zrobiłem tak jak radziłeś. Ogólnie to wygląda to całkiem nieźle tylko dalej są zniekształcenia (nieco mniejsze).
    napisałem taki kod:

    Code:

    #define PWM_A    (1<<PB1)
    #define PWM_B    (1<<PB0)
     

    int main(void)
    {
        DDRB |= (PWM_A|PWM_B);    //wyjścia
     
        TCCR0A |= (1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(1<<COM0B1)|(1<<COM0B0); 
        TCCR0B |= (1<<CS00);               //(1<<CS01)|(1<<CS00);             
                                    // f_pwm = f_clk/(N*256)
       
        OCR0A = 127;         //DUTY A            N/255*100% = DUTY%
        OCR0B = 255;         //DUTY B
     
        while(1)
        {
           
        }
           
    }


    zegar ustawiony na 8 MHz bez prescalera, w tej konfiguracji powinien dać przebieg o częstotliwości 31 250 Hz. Poniżej filmik jak to wygląda na wyjściu procka.

    A drugi jak miało by to wyglądać.


    Czy można coś z tym jeszcze zrobić ? To jest wada wew. oscylatora ? Nie chcę dodawać zew. Bo wszystkie wyjścia/wejścia zajęte oprócz resetu. Może nadal coś źle robię. albo da się to jeszcze prościej zrealizować.

    0
  • #12 19 Mar 2017 23:34
    2675900
    Użytkownik usunął konto  
  • #13 20 Mar 2017 11:53
    biceps_swir
    Poziom 10  

    No ale mierzę tym oscyloskopem wszystko i zresztą na drugim filmie mam przebieg wzorcowy który muszę uzyskać z oryginalnego sterownika. A tylko na uC jest taka kicha.
    Spotkałeś się z czymś takim, czy to tylko hipoteza?
    Wygląda na to że mój problem właściwie nie istnieje.... :]

    0
  • Pomocny post
    #14 20 Mar 2017 11:58
    2675900
    Użytkownik usunął konto  
  • #15 20 Mar 2017 13:07
    biceps_swir
    Poziom 10  

    Ok Dziękuję za pomoc w wyjaśnieniu tej zagadki :] :spoko:
    Wracając do C++, podpowiesz w jaki sposób zrealizować modulację tej częstotliwości w płynny sposób z 40kHz do 32kHz (wypełnienie cały czas 50%) w czasie powiedzmy 1 sekundy. W sposób jak na ten język przystało :] prosty. Nie ukrywam że zaczynam programować... wszelkie tropy będą na wagę złota.

    0
  • #16 20 Mar 2017 13:14
    2675900
    Użytkownik usunął konto  
  • #17 03 Wrz 2017 01:09
    biceps_swir
    Poziom 10  

    pisze to już dłuuugo po rozwiązaniu problemu, żeby zamknąć temat:
    otóż sprawa z "dokładnością" ma się tak że opieram się na sugestiach kolegów prawdopodobnie mój oscyloskop :tak ma: chociaż przebieg wzorcowy z innego urządzenia (też na filmie) wygląda OK. Aaa i mój MUC pracuje na wew. oscylatorze.

    A więc odnośnie modulacji częstotliwości, bardzo prose... Zakres bardzo elastyczny przy wypełnieniu 50% otrzymałem od 16KHz do 1,3 MHz. 95str. W DTS. Przy ustawieniu PLLCSR LOW SPEED MODE

    Code:

     PLLCSR |= (1<<LSM) // zegar 32khz PLL
             |(1<<PCKE)
             |(1<<PLLE)
             |(1<<PLOCK); //watch dog


    Częstotliwość ustawiamy wpisując do OCR1C Wartość dzielną przez wypełnienie Wpisywane do OCR1A.
    Dla mojego przykładu OCR1C=144, OCR1A= 72: Przebieg 28,28 KHz, Duty 50%

    Podsumowując ... nie znalazłem nic na elektrodzie ani pomoc kolegów nie była w stanie mi pomóc nawet mnie " hint"-ując . Zapewne dlatego że to banał opisany w DS. Tylko na początku jak się to czyta to może trochę pomieszać w głowie, taki mały procek a dwa timery...
    Pozdrawiam

    0