Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek 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 846 15
  • #1 18 Mar 2017 22:56
    biceps_swir
    Poziom 9  

    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

  • #2 18 Mar 2017 23:59
    Piotrus_999
    Poziom 39  

    Hint: PWM dalej sam czytaj

    Ps co ma to pytanie wspólnego z C++

  • #3 19 Mar 2017 00:10
    biceps_swir
    Poziom 9  

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

  • #4 19 Mar 2017 00:15
    Piotrus_999
    Poziom 39  

    biceps_swir napisał:
    Nie potrzebuje PWM!
    No - skoro nie potrzebujesz to Twoja sprawa. Ale potrzebujesz myślenia, a odpowiedź świadczy że z tym krucho. Weż DS-a znajdź PWM i potenteguj trochę. Nastepnie po dłuższej chwili tentegowania podziel się czy coś wytentegowałeś.

    biceps_swir napisał:
    a pytania w ogóle nie rozumiem.
    Co generacja sygnału ma wspólnego z C++?

  • #5 19 Mar 2017 00:45
    biceps_swir
    Poziom 9  

    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 :]

  • #6 19 Mar 2017 00:50
    Piotrus_999
    Poziom 39  

    Jezu widzisz i nie grzmisz !!!! - podałem już co masz zrobić - wziąć do swojego procesorka DataSheet i poszukać PWM. i pomysleć. Do wygeneroawnia Twojego sygnału sa potrzebne 3 linijki w C i samo się będzie robić. Ale z powodu Twiojego zachowania więcej Ci nie pomogę.


    Moja podpowiedź zawiera 100% rozwiązania.

  • #7 19 Mar 2017 00:52
    yogi009
    Poziom 41  

    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?

  • #8 19 Mar 2017 01:08
    Piotrus_999
    Poziom 39  

    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.

  • #9 19 Mar 2017 01:45
    biceps_swir
    Poziom 9  

    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

  • #10 19 Mar 2017 01:53
    Piotrus_999
    Poziom 39  

    Nie szukaj na arduino tylko w DS-ie procesora!@!@!@

    Nie używaj zabawkowych "bibliotek" tylko napisz program jak należy

    W attiny85 o PWM zaczyna się od strony 65 a w datasheet atmegi32u4 od strony 94.

    To co tam przeczytasz da ci przebieg bez udziału procesora. Będzie się "sam" robił

  • #11 19 Mar 2017 23:27
    biceps_swir
    Poziom 9  

    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ć.

  • #12 19 Mar 2017 23:34
    Piotrus_999
    Poziom 39  

    Te pomiary częstotliwości na pierwszym filmiku to bzdura. Nawet na nie nie patrz. Słaby soft oscyloskopu.

    Możesz mieć róznicę częstotliwości w stosunku do założonej +-5% ale nie zminność w czasie jak masz takie samo ustawienie timera.


    Zresztą gdyby tak było (co jest niemożliwe) to zmieniłby Ci się obraz na ekranie.

  • #13 20 Mar 2017 11:53
    biceps_swir
    Poziom 9  

    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.... :]

  • Pomocny post
    #14 20 Mar 2017 11:58
    Piotrus_999
    Poziom 39  

    Nie timery chodzą dokładnie tak jak je ustawiles, a nie jak chcą. Jakiś glitch w oscyloskopie

  • #15 20 Mar 2017 13:07
    biceps_swir
    Poziom 9  

    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.

  • #16 20 Mar 2017 13:14
    Piotrus_999
    Poziom 39  

    Płynnie na atmedze jest dość ciężko. Musisz po prostu kombinować preskalerem i max (do jakiej wartości licznik dolicza masz w DS-ie w opisie timera)., do którego doliczasz aby osiągnąć to co potrzebubujesz.

    To co napisałęś z C++ nie ma nic wspólnego - to "zwykle" C i jak zaczynasz proponuję się na nim zatrzymać.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME