logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Schemat generatora fali prostokątnej na mikrokontrolerze AVR

__michal 22 Maj 2005 12:57 2480 24
REKLAMA
  • #1 1515084
    __michal
    Poziom 11  
    Posty: 11
    Witam!!

    Jesli mi potrzebny schemat generatora fali prostokątnej oparty o mikr. serii AVR.
    Bede dzwieczny po stokroć za każda pomoc i podpowiedz.

    Pozdrawiam
    Michal
  • REKLAMA
  • #2 1515237
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Jaki zakres częstotliwości? z regulacją wypełnienia, czy symetryczny?
  • #3 1515317
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Aplikacja podstawowa jak dla każdego AVR może być nawet bez kwarcu jak nie jest potrzebna stabilna częstotliwość. Wyjście należy wybrać te, które posiada sprzętowe PWM
  • #4 1515365
    __michal
    Poziom 11  
    Posty: 11
    To będzie moduł do urządzen używanych na laboratoriach elektroniki, automatyki - duża skrzynia, a owe moduły to przerzutniki, bramki itd. Przede wszystkim możliwość sterowania częstotliwością - np. 100 Hz, 1kHz, 10 kHz, 100 kHz, 1MHz, 10 Mhz. To jedyne wytyczne.
    Bijąc się w pierś przyznaję, że posiadam małą wiedze o elektronice, z prograwaniem AVR jest u mnie dużo lepiej.
  • REKLAMA
  • #5 1515374
    And!
    Admin grupy Projektowanie
    Posty: 9061
    Pomógł: 175
    Ocena: 784
    Njaprościej ustawiając i zerując bit na porcie w pętli. Np w Bascomie:
    
    do
    Set PortX.Y
    Gosub Opoznienie
    Reset PortX.Y
    Gosub Opoznienie
    loop


    Jaki problem ? masz ograniczoną częstotliwość maksmalną, oraz sygnał nie jest symetryczny ze względu na opóżnienie przy skoku w do loop. (można użyć konstrukcji goto to zmniejszy nieco asymentrię)

    Aby sygnał był lepiej symetryczny należy użyć timera i przerwań. (w procedurze obsługi przerwania zmieniającej stan pinu wyjściowego należy zadbać aby program zajmował tyle samo czasu przy zmianie z 0->1 i 1->0)

    Acha pin portu musisz skonfigurować jako wyjście.

    ---Aktualizacja
    Przy takich częstotliwościach
    Cytat:
    100 Hz, 1kHz, 10 kHz, 100 kHz, 1MHz, 10 Mhz

    Użyj syntezera sterowanego procesorem i przełączanego obwodu LC w syntezerze. Można zrobić np na SAA1057
  • #6 1515696
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    To przy takich zależnościach to prościej zrobić stabilny generator kwarcowy a reszta to na dzielnikach /10 (np. 74ls90) i po kłopocie. Zbędny procesor.
  • #7 1515961
    And!
    Admin grupy Projektowanie
    Posty: 9061
    Pomógł: 175
    Ocena: 784
    Jeśli nie ma być żadnych pośrednich częstotliwości to faktycznie kwarc + dzielniki załatwią sprawę, w dodatku zmieści się na płytce wielkości karty kredytowej.
  • #8 1517498
    __michal
    Poziom 11  
    Posty: 11
    Problem w tym, ze tam musi byc procesor - to jest zadanie na zaliczenie i takie sa wymagania!! Drugim problemem jest to, ze nie jestem w stanie sporzadzic samodzielnie takiego schematu.
  • #9 1517824
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    __michal napisał:
    To będzie moduł do urządzen używanych na laboratoriach elektroniki, automatyki - duża skrzynia, a owe moduły to przerzutniki, bramki itd. Przede wszystkim możliwość sterowania częstotliwością - np. 100 Hz, 1kHz, 10 kHz, 100 kHz, 1MHz, 10 Mhz. To jedyne wytyczne.
    Bijąc się w pierś przyznaję, że posiadam małą wiedze o elektronice, z prograwaniem AVR jest u mnie dużo lepiej.


    Jak dla mnie to nadal nie bardzo wiem co to ma być... "...Przede wszystkim możliwość sterowania częstotliwością - np. 100 Hz, 1kHz, 10 kHz, 100 kHz, 1MHz, 10 Mhz. To jedyne wytyczne...."
    Generator chyba ma generować częstotliwość, a nie być sterowany chęstotliwością.
    Napisz dokładnie o co Ci chodzi nie np., a dokładnie. Np. to jest dobry na języku polskim. Jaki dokładnie zakres częstostliwości, czy wypełnienie ma być regulowane itp. itd.
    Swoją drogą "...na zaliczenie.." sugerowałoby, że to na studia jest. Niektórzy mają poprzeczki nisko zawieszone, ale czasami odnoszę wrażenie, że się ją zakopuje.
  • #11 1518091
    And!
    Admin grupy Projektowanie
    Posty: 9061
    Pomógł: 175
    Ocena: 784
    Tych wyższych częstotliwości już z procesora (taniego) nie wygenerujesz więc potrzebna Ci synteza.
    Tu masz przykład zastosowania SAA1057
    http://sq2hce.elektroda.net/r3033/r3033.html
    http://www.michallo.ll.pl/www/pll/SAA1057_PLL_Driver.pdf
    ew nowszy TSA6057
    http://www.michallo.ll.pl/www/pll/TSA6057_PLL_Driver.pdf
    Są też gotowe kity:
    http://www.cyfronika.com.pl/kityNE/Ne0133-k.htm
  • REKLAMA
  • #12 1518484
    ko_rex
    Poziom 19  
    Posty: 253
    Pomógł: 38
    Ocena: 2
    Jest rada... Skoro chcesz mieć AVR, to możesz wyciągnąć te megaherce. Jak to możliwe? Ano tak:
    Bierzesz ATmega48, poganiasz ją maksymalnym zegarem, czyli 20MHz. Piszesz, taki program:
    tu:
    SBI PORTA,0 ;2 cylke
    NOP ;1 tutaj możesz jeszcze upchać jakiś skok
    NOP ;1
    CBI PORTA,0 ;2
    RJMP tu: ;2

    razem: 8 cykli, zatem 20/8=2,5

    ... i masz 2,5 MHz

    albo... ten sam procek, bierzesz np. Timer0, ustawiasz w nim tryb zerowania licznika po udanym porównaniu (do rejestru porównania wpisując 1), włączasz reakcję wyjścia na Toggle (przełączanie) i masz 5MHz. (patrz nota, strona 94)
    Można by jeszcze wziąść jakiegoś Tiny i użyć PLL...ale nie jestem pewnien, czy tam nie ma jakichś niuansów z CTC...
  • #13 1520447
    __michal
    Poziom 11  
    Posty: 11
    Ma generować fale prostokątną o częstotliwości sterowanej przełącznikiem, zgodnie z tym, co wcześniej napisałem.
    Dla elektronika to może faktycznie nie byłaby żadna poprzeczka - ja niestety jestem tylko informatykiem i z praktyczną elektroniką nigdy nie miałem nic wpólnego.

    Pozdrawiam i dziękuję wszystkim za odpowiedzi!!
  • #14 1520833
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Jeżli to ma być tylko kilka f przełączanych skokowo to nie byłoby by problemu z wyjątkiem tych 10MHz. (Są AVRy napędzane 20MHz ale to nieco za mało do uzyskania 10MHz na wyjściu).
    Jedyne co można zrobić nie angażując sporej ilości dodatkowego sprzętu to wykorzystać szybki PWM, który jest w niektórych uC stosowany (np. ATtiny26 ma mnożnik PLL do PWM x64), co sygnalizował już kolega ko_rex.
    Jeszcze inna możliwość to zrobić generator mieszany, tzn. do 1MHz brać sygnał z uC, a 10MHz z generatora.

    Idea jest taka jak na rysunku, bramki AND złużą do wyboru źródła sygnału (czy z I/O procka, czy z xtal), wystawienie 1 na PORTD5 powoduje uaktywnienie sygnału z xtal, podanie 1 na PORTD6 uaktywnia sygnał z wyjścia I/O (oczywiście trzeba pamiętać, że PORTD5 i PORTD6 trzeba przełączać komplementarnie, tzn. nigdy nei może być na obydwóch 1).
    Aha, kwarc wtedy trzeba dać 10MHz, żeby pasowało do wymagań (ewentualnie procek ATmega48 i kwarc 20MHz i na wyjścia AND'a z XTAL dołożyć dzielnik f/2 z przerzutnika D). Na PORTD7 generujesz sobie uC wszystko od 1MHz w dół (to się dałatwo zrobić w pętli w programie głónym, ewentualne wszystkie nastawy w przerwaniu, z założeniem, że zmienana nastaw wiąże się z utratą stabilności f generatora).

    PS. I tak uważam, że to zakopywanie poprzeczki, co to za informatyk, który nie wie jak działa sprzęt, który programuje? Zgroza.
    Załączniki:
    • Schemat generatora fali prostokątnej na mikrokontrolerze AVR gen.JPG (30.13 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #15 1520951
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    A ja chę stworzyć taki generatorek który będzie generował częstotliwość w zakresie 0-200Hz i z regulowaną dlugością czasu trwania stanu wysokiego od 1ms do 30ms. Jak myślicie uda się to zrobić na dwuch timerach. 16-to bitowy z preskalerem do generacji okresu a 8-mio bitowy do regulacji czasu stanu wysokiego. MOże ktoś już trenował coś podobnego. Nie zależy mi na idealnej precyzji a raczej jak największej interaktywności.
  • #16 1520969
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    bocian_s: do tego celu służy PWM, który w uC AVR jest wspomagany sprzętowo - polecam lekturę manuala.
    Ewentualnie możesz użyć tajmera 1 (w np. ATmega8 16 bit) i przerwań od porównań (CompareA i CompareB).
  • #17 1523275
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    A może tak zastosować ATtiny2313 on ma sprzętowe wyjści sygnału zegarowego. Jego wersja 5V chodzi nawet na 16MHz plus kawałek programu dla niższych częstotliwości. Co o tym myslicie ?
  • #18 1525121
    ko_rex
    Poziom 19  
    Posty: 253
    Pomógł: 38
    Ocena: 2
    GienekS, patrz układ z posta kolegi Tdv. Program będzie prościutki, bo 2313 posiada możliwość sprzętowego generowania sygnałów, więc ograniszy się to konfiguracji licznika i obsługi przycików.
  • #19 1525424
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Układ ze schematu kolegi Tdv można uprościć, wykorzystując bramki NAND, co ma zaletę - używamy tylko jednego dodatkowego układu scalonego. Dodatkowo można zredukowac ilość użytych wyprowadzeń o jedno, używając jeszcze jedną bramkę NAND (dostepną np. w 74HC00 - dodatkowa obciążalność XTAL2 wynosi tylko 1 wejście CMOS) jako sterowany negator przełączający bramkowanie sygnałów : oscylator kwarcowy/sygnał wewnętrzny. Brak sygnału wewnętrznego i przełączenie na ten sygnał da również czasem pożądany efekt wyłaczenia generacji przebiegu.
  • #20 1536219
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Tdv napisał:
    bocian_s: do tego celu służy PWM, który w uC AVR jest wspomagany sprzętowo
    ...

    PWM odpada. NIe da się w sposób płynny zmieniać częstotliwości podstawowej PWM. Jest tylko kilka wybranych w zależności od prescalera.
  • #21 1536569
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    bocian_s napisał:
    PWM odpada. NIe da się w sposób płynny zmieniać częstotliwości podstawowej PWM. Jest tylko kilka wybranych w zależności od prescalera.
    Oj cienko z informacjami... ;) Słyszał o wpisywaniu w każdym wystąpieniu przerwania "TmerOverflow" dokładnie wyliczonej pod względem czasu wystepowania przerwania wartości do rejestru stanu licznika, np. TCNT1L:TCNT1H?
  • #22 1536693
    Machoni
    Poziom 13  
    Posty: 55
    Pomógł: 1
    Ocena: 1
    GienekS napisał:
    A może tak zastosować ATtiny2313 on ma sprzętowe wyjści sygnału zegarowego. Jego wersja 5V chodzi nawet na 16MHz plus kawałek programu dla niższych częstotliwości. Co o tym myslicie ?


    5V wersja chodzi nawet na 20MHz. A cos wiecej o tym sprzetowym wyjsciu sygnalu zegarowago mozesz napisac.

    A swoja droga, ile max dalo by sie wyciagnac z wlasnie 20MHz AVR, przy zalozeniu ze nie interesuje nas symetria sygnalu, niewazne sa stopnie wypelnienia, a jedynie jak najwieksza czestotliwosc. Ale z drugiej strony bez uzycia rozwiazan "zewnetrznych", tylko to co oferuje uC (i zewnetrzny kwarc).
    Mi wychodzi wlasnie jakies 5MHz, da sie wiecej ??
  • #23 1538011
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Light'I napisał:
    bocian_s napisał:
    PWM odpada. NIe da się w sposób płynny zmieniać częstotliwości podstawowej PWM. Jest tylko kilka wybranych w zależności od prescalera.
    Oj cienko z informacjami... ;) Słyszał o wpisywaniu w każdym wystąpieniu przerwania "TmerOverflow" dokładnie wyliczonej pod względem czasu wystepowania przerwania wartości do rejestru stanu licznika, np. TCNT1L:TCNT1H?


    To muszę to jeszcze raz przetrawić. Szykuje się droga przez mękę. Długie godziny nad AVRStudio i dzięsiątki symulacji.
  • #24 1538705
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    bocian_s napisał:
    Light'I napisał:
    Słyszał o wpisywaniu w każdym wystąpieniu przerwania "TmerOverflow" dokładnie wyliczonej pod względem czasu wystepowania przerwania wartości do rejestru stanu licznika, np. TCNT1L:TCNT1H?
    To muszę to jeszcze raz przetrawić. Szykuje się droga przez mękę. Długie godziny nad AVRStudio i dzięsiątki symulacji.
    A co tu symulować dziesięć razy ? Najpierw matematyka...
    #ifndef Tdiv1
    	#define Trise		0x07
    	#define Tfall		0x06
    	#define Tdiv1024	0x05
    	#define Tdiv256		0x04
    	#define Tdiv64		0x03
    	#define Tdiv8		0x02 
    	#define Tdiv1		0x01
    	#define Tstop		0x00
    	#define usDiv		1000000	// microsecond divisor
    	#define msDiv		1000	// milisecond divisor
    #endif
    #define T1div		Tdiv64
    #define T1Tick		40
    #define T1TickDiv	usDiv // usDiv or msDiv
    #ifndef T1cnt
    	#if (T0div==Tdiv1024)
    		#define T1Scale	1024
    	#elif (T0div==Tdiv256)
    		#define T1Scale	256
    	#elif (T0div==Tdiv64)
    		#define T1Scale	64
    	#elif (T0div==Tdiv8)
    		#define T1Scale	8
    	#elif (T0div==Tdiv1)
    		#define T1Scale	1
    	#endif
    	#define T1ovr1	(T1Tick*F_CPU)
    	#define T1ovr2	(T1TickDiv*T1Scale)
    	#define T1ovr	(T1ovr1/T1ovr2)
    	#define T1cnt	0xFFFF-T1ovr
    #endif
    T1cnt to wartość do wpisania w rejestrze licznika co przerwanie, na jego początku. T1div dobierasz tak, aby nie było zbyt duże(niedokładność) i zbyt małe(przepełnienie licznika przed upłynięciem potrzebnego czasu).
    --
    Pozdrawiam, Light'I
  • #25 1539340
    ko_rex
    Poziom 19  
    Posty: 253
    Pomógł: 38
    Ocena: 2
    Machoni, jest sposób. Jednak tylko teoretyczny, a sens tego rozwiązania jest delikanie mówiąc żaden. Oto rozwiązanie:
    ldi r16,1
    ldi r17,0
    loop:
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    out portb,r16
    out portb,r17
    ...
    ...
    out portb,r16
    out portb,r17
    rjmp tu

    Takim sposoben osiągamy 10MHz przy Fclk=20MHz, bo instrukcja OUT to jeden cykl zegarowy. Nie jest to czysty przebieg, bo mamy przerwę na skok.

Podsumowanie tematu

✨ Dyskusja dotyczy schematu generatora fali prostokątnej o regulowanej częstotliwości, realizowanego na mikrokontrolerze AVR, z wymogiem sterowania częstotliwością w zakresie od 100 Hz do 10 MHz. Propozycje rozwiązań obejmują generowanie sygnału przez bezpośrednie ustawianie i zerowanie bitu portu w pętli, wykorzystanie sprzętowego PWM mikrokontrolera, a także zastosowanie timerów i przerwań dla uzyskania lepszej symetrii sygnału. Wskazano ograniczenia częstotliwości generowanych bezpośrednio przez AVR (maksymalnie kilka MHz przy taktowaniu 20 MHz) oraz konieczność użycia syntezatorów częstotliwości (np. SAA1057, TSA6057) dla wyższych częstotliwości. Omówiono także alternatywne rozwiązania z wykorzystaniem generatorów kwarcowych i dzielników częstotliwości (np. 74LS90) bez mikrokontrolera, jednak ze względu na wymóg projektu (zadanie na zaliczenie) procesor musi być użyty. Zaproponowano użycie mikrokontrolerów takich jak ATmega48, ATtiny26, ATtiny2313, które posiadają sprzętowe funkcje generowania sygnałów zegarowych i PWM. Poruszono kwestie implementacji programowej, w tym wykorzystanie przerwań TimerOverflow i precyzyjne ustawianie rejestrów liczników dla regulacji częstotliwości i wypełnienia. Wskazano, że dla najwyższych częstotliwości (około 10 MHz) konieczne jest zastosowanie generatora zewnętrznego lub syntezatora PLL, a mikrokontroler może sterować przełączaniem źródeł sygnału. Dyskusja zawiera także przykłady kodu asemblerowego do generacji sygnału o częstotliwości do 2,5 MHz i 5 MHz na AVR taktowanym 20 MHz. Podkreślono, że PWM nie pozwala na płynną regulację częstotliwości, a jedynie na wybór kilku stałych wartości zależnych od preskalera. Wskazano na możliwość realizacji generatora o niskich częstotliwościach (0-200 Hz) z regulacją czasu trwania stanu wysokiego za pomocą dwóch timerów. Całość podkreśla konieczność kompromisu między prostotą, precyzją, zakresem częstotliwości i wymogami projektowymi.
Wygenerowane przez model językowy.
REKLAMA