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

Bascom - Generator impulsów z wypełnieniem

IMEX 09 Sty 2013 02:22 4128 21
  • #1 09 Sty 2013 02:22
    IMEX
    Poziom 20  

    Witam serdecznie kolegów.

    Jeśli nie znasz Bascoma nie wypowiadaj się - Bardzo prosze.

    Potrzebuje wykonać Generator impulsów z wypełnieniem.
    Regulowana częstotliwość jak i wypełnienie.
    W Bascomie niestety nie jest to takie proste. Sprzętowy jest PWM ale stała częstotliwość.
    Prześledziłem chyba wszystkie wątki w tym zakresie i raczej wypowiadają się tylko teoretycy piszący w C - a sprawa dotyczy Bascoma

    Sprawdzając różne sposoby wpadłem na pomysł żeby wykonać na licznikach a zegar dać 10MHz i prescaler = 1
    Częstotliwość będzie nie wysoka jeśli wykonam wypełnienie od 0-100%

    Załóżmy że są dwa liczniki zliczające H i L - różnica między nimi zawsze ma sie zamykać w 100% (wypełnienie) jeśli dam zliczanie jednego licznika do 20 a drugiego do 80 - wiadomo mam odrazy wypełnienie gotowe a częstotliwość 1 KHz

    Jeśli liczniki będą liczyły np 40 / 160 to mam wtedy wypełnienie 20/80 a częstotliwość 500Hz

    Czy takie rozwiązanie jest rozsądne - pomijam przeliczenia danych dla liczników.

    Pozdrawiam
    Grzesiek

    0 21
  • CControls
  • #2 09 Sty 2013 04:29
    emarcus
    Poziom 35  

    IMEX napisał:
    Witam serdecznie kolegów.

    Jeśli nie znasz Bascoma nie wypowiadaj się - Bardzo prosze.

    Potrzebuje wykonać Generator impulsów z wypełnieniem.
    Regulowana częstotliwość jak i wypełnienie.
    W Bascomie niestety nie jest to takie proste. Sprzętowy jest PWM ale stała częstotliwość.


    To zaleyży który timer i w którym trybie zechcesz go użyc.
    Prawdą jest np. że Tryb CTC pozwoli na zmienną F przy 50% wypełnienia, Fast PWM też nie wiele daje możliwości na manipulację.
    Masz poza tym jeszcze dwa inne tryby w których możesz regulowa w pewnym zakresie zarówno freq. jak i duty cycle. Powiedzmy że użyjesz Timer1( np. Mega8/168 itp.) w trybie Phase and Frequency Correct.
    Normalnie masz na nim dwa kanały A i B z których możesz generowac praktycznie dwa różne sygnały PWM z pewnymi jednak ograniczeniami (ta sama częstotliwośc o jednak różnym wypełnieniu). Nie jest to bynajmniej wymysł Bascoma lecz takie właściwości ma ten timer i jego możliwe konfiguracyjne tryby pracy.
    Ale jeżeli zrezygnujesz z drugiego sygnału PWM to jednym kanałem regulujesz freq, a drugim kontrolujesz dyty cycle.
    Prześledź ten przykład jako concept:
    http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&p=27633#27633

    e marcus

    0
  • #3 09 Sty 2013 10:23
    piotrva
    Moderator na urlopie...

    Powiedz w jakich zakresach ma być regulowana częstotliwość tego impulsu.
    A w BASCOM teoretycznie można zrobić to samo co w C - kto powiedział, że nie można w B. operować na rejestrach i uruchomić "ręcznie" timera w dowolnym trybie?
    Dla Autora tematu - zapoznaj się z notą katalogową procesora, z rozdziałem dotyczącym timera i jego trybu pracy jako PWM - bo da się taki efekt jak chcesz osiągnąć za pomocą np. timera1.
    ---
    PS. BlueDarco - to że sam nie lubisz/nie przepadasz za AVR nie oznacza, że wielu rzeczy zrobić się na nich nie da i że procesory ARM są jedynym słusznym wyborem...

    0
  • #5 09 Sty 2013 11:25
    piotrva
    Moderator na urlopie...

    No moim zdaniem:
    1. Język programowania to inna sprawa - sam znam ludzi, którzy w Bascom potrafią zrobić lepsze, bardziej rozbudowane i skomplikowane projekty niż nie jeden zadufany znawca C, choć osobiście wolę C z powodu większej łatwości pracy
    2. Nie będę wdawał się po raz kolejny w dyskusję nt. które procesory są lepsze i wogóle (wiem, że masz nieuzasadnione uprzedzenia do AVR i uwielbienie dla ARM), ale moim zdaniem AVR są dobre do nauki (osobiste doświadczenia z "uczniami") i nadają się do na prawdę wielu zastosowań (amatorskich i profesjonalnych).
    Proponuję zakończmy temat wyższości takich a nie innych układów i pisanie postów nie wnoszących nic do tematu:

    IMEX napisał:
    Jeśli nie znasz Bascoma nie wypowiadaj się - Bardzo prosze.

    BlueDraco napisał:
    Jak widać do tego zadania średnio pasuje zarówno Bascom, jak i wybrany mikrokontroler. Może warto wyciągnąć z tego jakieś wnioski? Oczywiście można próbować wbijać w deskę śruby do metalu młotkiem, ale zazwyczaj lepiej wychodzi wkręcanie wkrętów do drewna śrubokrętem.

    Bo ten problem da się rozwiązać zarówno na AVR jak i w BASCOM, a Twoje posty i moje odpowiedzi nie wnoszą do tej sprawy nic konstruktywnego. A @up@up zamieszczono już działający i kompletny kod rozwiązujący ten problem programowo, a ja dałem wraz z kol. emarcus wskazówki jak rozwiązać tę sprawę sprzętowo.
    Dodam więc ukonkretnienie na najpopularniejszym (choć nie najlepszym z rodziny AVR) procesorze:
    http://www.atmel.com/images/doc2486.pdf - strona 98, zainteresuj się trybem 11 timera1

    0
  • #6 09 Sty 2013 15:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Nawet parę razy użyłem tego trybu na tym mikrokontrolerze, ale sensowny skok regulacji współczynnika masz przy częstotliwości do kilku - kilkunastu kHz. Ja miałem 150..300 Hz, więc chodziło ślicznie.

    0
  • CControls
  • #7 02 Lip 2014 12:23
    tknefel - GORKY
    Poziom 13  

    Witam
    Chciałbym dołączyć się do rozmowy odnośnie generowania impulsów.
    Zabawę z Bascom rozpocząłem niedawno. Chce na Atmega16 napisać program do generowania impulsów z regulowanymi szerokościami impulsów (zarówno 0 jak i 1) na OC1B a sygnał zanegowany na OC1A. Obie szerokości impulsów regulowane z zakresie 0,05ms -10ms a wartość nastawy regulowana jest potencjometrami i wyświetlana na LCD np 20x4. Początkowo generator wykonany był programowo tzn na komendach wait us. Niestety pętla miała przestoje a impulsy trwały o wiele dłużej.
    Myślę że program należy wykonać na rejestrach ale o tym na razie nie mam zielonego pojęcia. Szukałem trochę informacji o PWM i wypełnieniu ale mi bardziej chodzi o regulację szerokości trwania impulsów.

    Jak się mam do tego zabrać?
    Proszę o pomoc i wyrozumiałość dla początkującego.

    0
  • #8 02 Lip 2014 13:29
    emarcus
    Poziom 35  

    tknefel - GORKY napisał:
    Witam
    Chciałbym dołączyć się do rozmowy odnośnie generowania impulsów.
    .........................
    Jak się mam do tego zabrać?
    Proszę o pomoc i wyrozumiałość dla początkującego.


    Trzeba czytac z uwagą i zrozumieniem !!!

    Jeżeli przeoczyłeś ten resp. (kilka postów wyżej w tym wątku):
    https://www.elektroda.pl/rtvforum/topic2466462.html#11763362
    to odszukaj i przeczytaj jeszcze raz;
    Tam masz link do niemal gotowego rozwiązania (koncept); a jezeli i tego nie możesz zrozumiec - to potrzebujesz więcej popracowac nad timerami.
    A jezeli potrzebujesz gotowe rozwiązanie to jest ono dostępne tu:

    Bascom - Generator impulsów z wypełnieniem


    e marcus

    0
  • #9 02 Lip 2014 20:40
    zulusj23
    Poziom 21  

    Witam,

    stawiam pierwsze kroki w Bascom-ie, dlatego nie wiem, czy to co piszę ma sens i się sprawdzi. A gdyby timer (odpowiedzialny za regulację częstotliwości) po przepełnieniu wyzwalał swoim przerwaniem podprogram z poleceniem PULSEOUT ? Można w nim zadeklarować czas trwania impulsu a przez to regulować jego wypełnienie. Ma to sens ?

    Pozdrawiam,

    0
  • #10 03 Lip 2014 06:41
    emarcus
    Poziom 35  

    zulusj23 napisał:
    Witam,

    A gdyby timer (odpowiedzialny za regulację częstotliwości) po przepełnieniu wyzwalał swoim przerwaniem podprogram z poleceniem PULSEOUT ? Można w nim zadeklarować czas trwania impulsu a przez to regulować jego wypełnienie.

    Pozdrawiam,

    Owszem 'zmontujesz' w ten sposób jakąś kombinowaną PWM falę, której czas stanu niskiego jest liczony timerem, natomiast stan wysoki processorem i to z opóźnieniem. Po wystąpieniu przerwania processor potrzebuje zużyc kilkadziesiąt cykli na obsługę stosu i wtedy przystąpi do wykonania PULSEOUT, który w zasadzie jest niczym innym jak waitms (waitus) 'zautomatyzowany' przez dołożenie dwóch instrukcji TOGGLE wskazany port. Ponieważ processor jest zajęty liczeniem czasu (a konkretnie pewnej ilości pustych instrukcji NOP), zatem nie może jednocześnie wykonywac czegoś więcej./
    Ponadto Czas trwania 'pulseout' nie może byc dłuższy niż czas stanu niskiego wynikający z częstotiiwości pracy timera.

    Cytat:

    Ma to sens ?


    Jaki to może miec sens; robienie czegoś kiepsko 'we dwójkę', gdy to samo może by zrobione 'fachowo i w jednego'..., oraz mniejszym nakładem energii (tu:programu).
    Odpwiednio skonfigurowny timer, "potrafi" generowac falę PWM o zmiennej częstotliwości i zmiennym wypełnieniu z bardzo małym udziałem processora.

    e marcus

    0
  • #11 03 Lip 2014 12:07
    zulusj23
    Poziom 21  

    Widzę, że niestety ale w prosty sposób z linii komend za pomocą gotowego polecenia Bascom-a się nie uda się ustawić timera w tryb generatora i załatwić sprawy sprzętowo. Czas pogłębić wiedzę na temat dostępnych rejestrów i sposobu ich użycia.
    Dzięki.

    Pozdrawiam,

    0
  • #12 03 Lip 2014 12:29
    atom1477
    Poziom 43  

    No ale przecież nikt nie każe stosować do tego komend BASCOMa.
    Wszyscy BASCOMowcy sobie sami narzucili takie dziwne podejście i potem są pretensje jak ktoś im podsuwa przykładowy kod w C (prosty ale operujący na rejestrach).
    A to przecież najnormalniejsza rzecz (operowanie na rejestrach).

    0
  • #13 08 Lip 2014 22:49
    tknefel - GORKY
    Poziom 13  

    Nawiązując do wcześniejszej wypowiedzi chce zbudować generator regulowany za pomocą 2 potencjometrów. Jednym chcę regulować czas trwania logicznej 1 a drugim potencjometrem czas trwania logicznego 0. Czasy obu sygnałów regulowane w przedziale 0,05ms - 5ms.

    Kod: basic
    Zaloguj się, aby zobaczyć kod


    Program generuje przebieg z regulowanym czasem trwania logicznego 0 i regulowanym czasem trwania logicznej 1. Niestety wygenerowany sygnał ma maksymalnie 120Hz. Zmiany wartości prescalera czy powiększania Timera1 tylko spowalniają sygnał. W czym może leżeć problem lub jak inaczej podejść do generowania przebiegu?

    0
  • #14 08 Lip 2014 23:17
    atom1477
    Poziom 43  

    Zawsze byłem ciekaw dlaczego BASCOMowcy tak często stosują Toggle. Może mi to kolega wyjaśni :D
    Nie lepiej po prostu zastosować zapis 1 albo 0? Nie trzeba wtedy pamiętać jaki był poprzedni stan.
    Natomiast co do programu to on raczej jest błędny. Dokonuje on Toggle LED w każdym przerwaniu. A chyba powinien dopiero po przekroczeniu wartości A00 i A100?
    Trzeba też zadbać żeby A00 i A100 były równe co najmniej 1 i 2.
    Łącząc jedno z drugim i trzecim program raczej powinien wyglądać tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #15 08 Lip 2014 23:30
    tknefel - GORKY
    Poziom 13  

    Dlaczego akurat toggle ponieważ są to początki nauki i tak naprawdę nie wiem która komenda jest lepsza od innej.
    Wprowadziłem zmiany kosmetyczne o których pisał kolega zamieniając toggle.
    Niestety w działaniu programu nie zmieniło to wiele.
    Dlaczego osiągam takie małe częstotliwości?
    Jak taki sygnał wygenerować w inny sposób?

    0
  • #16 08 Lip 2014 23:36
    atom1477
    Poziom 43  

    120Hz wynika z częstotliwości 16000000Hz podzielonej przez rozdzielczość Timera1 (65536).
    Ale to powinno się dawać zmienić. Dlaczego się nie zmienia, nie wiem (założę się że to jakiś błąd BASCOMa).

    0
  • #17 08 Lip 2014 23:58
    tknefel - GORKY
    Poziom 13  

    Nierozpoznanie takiego polecenia jak TCNT1.
    Zmieniłem natomiast
    Timer1 = Timer1 + 1
    na
    Timer1 = 65450 i już bardzo pomogło bo udało się osiągnąć 11kHz.
    Zmieniałem też wartość Timer1 miedzy 65450 a 65535 ale nic to nie pomagało.
    Czy od tej wartości Timer1 liczy do przepełnienia czyli 65536 określona liczbę cykli i dopiero robi kolejny krok w programie?
    Da się wycisnąć tą metodą jeszcze większą częstotliwość?

    0
  • #18 09 Lip 2014 00:39
    atom1477
    Poziom 43  

    Powyżej 65000 nie możesz wpisywać bo wykonanie przerwania zajmuje też trochę cykli (kilkaset).

    0
  • #19 09 Lip 2014 07:41
    emarcus
    Poziom 35  

    tknefel - GORKY napisał:
    Nawiązując do wcześniejszej wypowiedzi chce zbudować generator regulowany za pomocą 2 potencjometrów. Jednym chcę regulować czas trwania logicznej 1 a drugim potencjometrem czas trwania logicznego 0.

    Przy tych założeniach dyskusja na temat ustalania częstotliwości nie ma żadnego sensu.
    Praktycznie, jeden z potencjometrów zmienia wypełnienie, a suma obydwóch daje okres T co jest równoznaczne z f=1/T . Przy każdej zmianie któregokolwiek parametru zmienia ci się f.
    Ten projekt w łatwy sposób zrealizujesz konfigurując timer1 w trybie CTC i za każdym razem w przerwaniu nadpisujesz alternatywnie nową wartośc dla OCR1A (Compare1A), która jest wynikiem po przeliczeniu wartości z odpowiednich potencjometrów.

    hint...
    Do potencjometrów dodaj offset Rezystor tak aby przy skrajnym położeniu suwaka pptencjometru dawał ok. 0.25V co pozwoli ci obrachowac minimalne wypełnienie lub stan zerowy wyjścia ok 0.5 msec. i analogicznie drugi stan będzie 10 msec. dla pełnego zakresu.

    e marcus

    0
  • #20 09 Lip 2014 08:39
    zulusj23
    Poziom 21  

    Witam,

    Kol. yokoon (pozdrawiam) podesłał mi działający kod bazujący na Timer0. Paramerty całkiem niezłe:

    https://obrazki.elektroda.pl/5667799400_1404642302.jpg

    - 15 ustawionych w kodzie programu częstotliwości z zakresu 75 Hz - 1000 Hz
    - wypełnienie regulowane co 1% w zakresie 10% - 90%
    - prezentacja nastaw na LCD
    - obsługa 3 przyciski, wybór, góra, dół, rozpoznawanie długości naciśnięcia

    Jako, że nie jestem autorem nie będę go tu prezentował a zainteresowanych odsyłam do Kol. yokoon - a.
    Wczoraj trochę bawiłem się kodem, przerobiłem go pod impulsator z przyciskiem i całkiem wygodnie się go obsługuje. Przycisk wybór regulowanej wartości, lewo zwiększanie, prawo zmniejszanie.

    Pozdrawiam,

    0
  • #21 19 Lip 2014 12:44
    tknefel - GORKY
    Poziom 13  

    Bardzo dziękuje za pomoc koledze atom1477.
    Fragment programu na którym tak mi zależało udało się stworzyć i działa poprawnie.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Natomiast po zainstalowaniu nowszej wersji Bascom 2.0.7.5 dzieją się dziwne rzeczy z wejściami ADC. Nastawiona wartość zmienia się o 10-20% wartości maksymalnej. Podejrzewam że problem może tkwić w niepoprawnie ustawionych fusebity Bascom - Generator impulsów z wypełnieniem

    Tak na marginesie to jestem ciekawy jak można skonfigurować Timer1 w trybie CTC. Jeśli ktoś ma to proszę o przykład.

    0
  • #22 19 Lip 2014 14:53
    atom1477
    Poziom 43  

    Fusebity nie mają tutaj nic do rzeczy.
    Timer1 oczywiście można skonfigurować w trybie CTC.
    A przykład Ci już chyba podawałem:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0