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.

Generator sinusa na Atmedze8?

kozunami 01 Gru 2008 13:06 4025 13
  • #1 01 Gru 2008 13:06
    kozunami
    Poziom 12  

    Witam!
    Chodzi mi o wygenerowanie sinusa (poźniej i inne kształty) na avr-erze w granicach +5V, -5V tak jak na rysunku. Czy sprzętowy przetwornik A/C może być również wyjściem C/A? Czy ktoś już realizował podobny projekt? Z góry dziękuje za odpowiedź.
    Generator sinusa na Atmedze8?

    0 13
  • #2 01 Gru 2008 13:36
    Przemek_Kuchta
    Poziom 20  

    Z ADC nie zrobisz DAC, nie ma takiej mozliwości. Potrzebujesz zewnętrznego przetwornika DAC i wzmacniaczy operacyjnych by zrobić sygnał symetryczny. Nie napisałeś jakie częstotliwości chcesz uzyskać.

    0
  • #3 01 Gru 2008 13:40
    d3zerter
    Poziom 12  

    możesz spróbować na PWM ale w zakresie 0-5V

    0
  • #5 01 Gru 2008 14:01
    Przemek_Kuchta
    Poziom 20  

    Da radę dla niskich częstotliwości ale i tak będzie wyglądał mało gładko.

    0
  • #6 01 Gru 2008 14:28
    tplewa
    Poziom 38  

    Lepiej i latwiej bedzie chyba zastosowac jakiegos DDS-a od AD.

    Ewentualnie jak juz musi byc to AVR to zrobic przetwornik na rezystorkach tak jak np. w tym rozwiazaniu:

    http://www.myplace.nu/avr/minidds/index.htm


    +-5V to juz sprawa przemyslenia i wykonania jakiegos wyjscia na operacyjnych...

    0
  • #7 01 Gru 2008 15:01
    pubus
    Poziom 30  

    Nie podajesz jaki zakres częstotliwości cie interesuje a jest to dość istotne...
    Poszukaj na forum o DDS...

    0
  • #8 01 Gru 2008 18:23
    kozunami
    Poziom 12  

    Zakres częstotliwości powiedzmy od kilku Hz do 100k.

    0
  • #9 01 Gru 2008 19:25
    tplewa
    Poziom 38  

    kozunami napisał:
    Zakres częstotliwości powiedzmy od kilku Hz do 100k.


    No to masz takie rozwiazanie ktore podalem wyzej w linku...

    "It's controlled over RS232 from a small Windows program, and can generate Sine-, Sawtooth-, Trangle- and Sqare-waves ranging from 0.07 Hz to about 200-300 kHz in 0.07 Hz steps (depending on your crystal)."

    Masz schemat i kod zrodlowy w ASM na AVR-a AT90S2313... przerobienie tego na ATmega8 to chwila moment...

    0
  • #10 01 Gru 2008 19:25
    Przemek_Kuchta
    Poziom 20  

    Zapomnij o PWM. Jak wspomnieli poprzednicy, najlepszym rozwiązaniem będzie DDS.

    0
  • #11 01 Gru 2008 19:39
    kozunami
    Poziom 12  

    Nie brałem pod uwagę PWM z tego względu ze to jest modulacja szerokości impulsu a nie amplitudy. Niechcę gotowego układu tylko wskazówki jakich elementów użyć, poza tym potrzebuje generatora który będzie miał przynajmniej dwa wyjścia i możliwość zmiany przesunięć fazowych między nimi. Załóżmy ze nasz sinus będzie miał 256 "schodków" do wygenerowania zaprzęgniemy 8 wyjść uP, i co dalej, jakich części użyć jako elementu wykonawczego?

    0
  • #12 01 Gru 2008 21:28
    tplewa
    Poziom 38  

    kozunami napisał:
    Nie brałem pod uwagę PWM z tego względu ze to jest modulacja szerokości impulsu a nie amplitudy. Niechcę gotowego układu tylko wskazówki jakich elementów użyć, poza tym potrzebuje generatora który będzie miał przynajmniej dwa wyjścia i możliwość zmiany przesunięć fazowych między nimi. Załóżmy ze nasz sinus będzie miał 256 "schodków" do wygenerowania zaprzęgniemy 8 wyjść uP, i co dalej, jakich części użyć jako elementu wykonawczego?



    a co rozumiesz pod pojeciem element wykonawczy ? Bo tego akrat nie qmam ;)

    Jak chcesz 2 wyjscia to potrzebujesz dwa przetworniki cyfra/analog (i tu obojetne czy to przetwornik scalony czy uproszczona wersja na rezystorach). Oczywiscie wersja scalona bedzie miala lepsze parametry :)

    Owszem gotowca moze nie chcesz, ale warto takiego gotowca przeanalizowac jak dziala - wiele bys zrozumial i znikly by chyba wszelkie watpliwosci jak taki generator realizowac.

    Jakich elementow uzyc :) osobiscie to bym zrobil na jakims DDS lub bardziej rozbudowana wersja generatora sygnalow na DSP.

    Mozna i sie meczyc na procku poza prockiem potrzebujesz jak wspomnialem dwa przetworniki + bufor wyjsciowy np. na opampach, a reszta to juz software...

    0
  • #13 03 Gru 2008 17:06
    Paweł Es.
    Pomocny dla użytkowników

    Ogólna zasada generowania jest taka:

    Masz tablicę spróbkowanego sinusa, np. cały okres to 256 próbek (numerowanych od 0 do 255)

    Próbki te odtwarzasz przesyłając je co stały okres czasu $$Tp=\frac{1}{fp}$$ do przetwornika cyfrowo analogowego.

    Częstotliwość sygnału jaką uzyskasz tą metodą to:


    $$fwy=\frac{fp}{N}$$

    fp - częstotliwść próbkowania
    N - ilość próbek na okres.

    Czestotliwość możesz zmieniać na kilka sposobów:

    1. Zmiana częstotliwości próbkowania (zmieniasz okresy czasu pomiędzy wysłaniem kolejnych próbek).

    Rozwiązanie to ma jednak wadę. Sygnał z przetwornika powinien być wygładzany filtrem dolnoprzepustowym o częstotliwości odcięcia niższej niż fp/2 (np. 0.4 fp ) i o sporej stromosci. Zmienianie fp powoduje konieczność strojenia filtru co mocno komplikuje obwód (można co prawda użyć np. filtrów z przełączanymi pojemnościami wyrabianych jako gotowe kostki (np. Maxim takie robi) ale wymaga to generowania jeszcze sygnału taktującego taki filtr. Sygnał ten musi byc np. 100 razy większy niż częstotliwość generowana.)

    2. Zmiana długości tablicy czyli liczby N w mianowniku.

    Daje skokową zmianę częstotliwości, wymaga zapamiętania (lub programowego generowania sinusoidy do pamięci RAM o długości N.
    N nie może być zbyt małe, bo rosną zniekształcenia przebiegu.

    3. Zmiana kroku odtwarzania pamięci z przebiegiem.

    Otrzymujesz możliwość generowania następujących częstotliwości:

    $$fwy=k*\frac{fp}{N}$$

    gdzie

    k może się zmieniać od 1 do $$\frac{N}{2}-1$$

    Czyli jeżeli np. odtwarzasz co drugą próbkę z pamięci to uzyskujesz 2 razy większą częstotliwość.

    Metoda ta jest przydatna do uzyskiwania czystych przebiegów sinusoidalnych ale wymaga użycia długiej pamięci okresu. Np. dla pamięci 8kB i typowej dla akustyki częstotliwości próbkowania 48000 Hz
    wygenerować sygnały o czestotliwościach:

    fmin=5,859375 Hz dla k=1 do
    fmax=20003,90625 dla k=3414

    Oczywiście generowanie przebiegu wymaga dodawania przyrostu k do adresu pamięci oraz uwzględnienia zapętlenia wskaźnika pamięci gdy wynik sumowania jest większy niż długość tablicy N (odejmujesz wtedy N, by indeks był z zakresu 0 do N-1)

    4. Indeks (równoważny fazie przebiegu) może być także zwiększany o liczbę ułamkową co pozwala uzyskać wartości będące niecałkowitym przyrostem częstotliwości.

    W tym przypadku indeks jest liczbą z ułamkiem, którą przed użyciem do adresowania tablicy zamienia się na liczbę całkowita z zakresu 0 do N-1.
    Zależnie od metody zamiany (obcięcie części ułamkowej lub zaokrąglenie) uzyskuje się różny poziom zniekształceń sinusoidy.

    Przy przyroście 1.5 dla metody obcinania ułamka, kolejno odtwarzane są komórki pamięci

    Faza -> adres
    0.0 -> 0
    1.5 -> 1
    3.0 -> 3
    4.5 -> 4
    6.0 -> 6
    7.5 -> 7





    Dla metody zaokraglania (tu są trochę mniejsze błędy sinusoidy)

    Faza -> adres
    0.0 -> 0
    1.5 -> 2
    3.0 -> 3
    4.5 -> 5
    6.0 -> 6
    7.5 -> 8

    oczywiście dokładność przestrajania zależy od ilości bitów części ułamkowej przyrostu fazy.

    Powyższej metody używa się np. w elektronicznych instrumentach muzycznych do uzyskania odpowiedniej dokładności przestrajania częstotliwości (np. używa się wtedy 13 i więcej bitów ułamka)

    Najdokładnieszą metodą, będącą rozwinięciem powyższych jest metoda generowanis sygnału z interpolacją. Wymaga ona jednak szybkich obliczeń wartości pośrednich (interpolacja liniowa) pomiędzy wartościami próbek zapisanymi w pamięci:

    WY=T[index]+Ułamek*(T[index+1]-T[index])

    WY - wartość wysyłana do DAC (zaokrąglona do całkowitej)

    T[index] - wartość tablicy przebiegu dla danej chwili czasowej
    T[index+1] - wartość w następnej komórce tablicy przebiegu.
    UŁAMEK - część ułamkowa fazy z zakresu <0;1)

    Metoda ta wymaga szybkiego mnożenia (operacja dostępna w procesorach sygnałowych) i operacji zamiany na liczby całkowite.


    Powyższe rozważania dotyczą generowania przebiegu sinusoidalnego. W przypadku gdy zawartość tablicy nie jest przebiegiem sinusoidalnym powyższe metody przy stosowaniu wprost powodują generowanie przebiegów zniekształconych w stosunku do tego co jest zapisane w tablicy kształtu. Wynika to z teorii próbkowania przebiegów, która mówi, że przebiegi są odtwarzane poprawnie o ile wszystkie składowe przebiegów mają częstotliwości poniżej połowy częstotliwości próbkowania. Jeżeli nie, to przebiegi te pojawiają się w paśmie częstotliwości ale ich częstotliwość wynika z różnicy częstotliwości składowej przebiegu i częstotliwości próbkowania. Daje to np. przy zwiększaniu częstotliwości efekt taki, że składowe poniżej fp/2 zwiększają częstotliwość a za to te "wystające" ponad fp/2 jadą z czstotliwością w dół i do tego w sposób nie związany harmonicznie z sygnałem pierwotnym.
    Oczywiście na wyjściu dostajemy nierozdzielną sumę tych dwóch przebiegów co powoduje, że mamy przebieg zniekształcony.

    Ponieważ większość przebiegów "naturalnych" (prostokąt, piła) daje się przedstawić jako nieskończona suma przebiegów sinusoidalnych to widać, że problem wystapi praktycznie zawsze, bo zawsze znajdą się składowe, które wyjdą za te fp/2.

    Rozwiązaniem jest tu zapisywanie w tablicach sygnałów o skończonym widmie częstotliwości, tj. syntezujemy przebiegi złożone przez sumowanie sinusoid ale tylko do momentu, do którego mają one częstotliwości poniżej fp/2.
    Oczywiście jeżeli zakładamy możliwość przestrajania częstotliwości takiego generatora, to trzeba mieć ileś tablic z przebiegami wcześniej zsyntetyzowanymi (trudno by było te sumy liczyć "w locie") i odpowiednio przełączać tablice zależnie od zakresu częstotliwości. Tu oczywiście im wyższa częstotliwość tym mniej składowych i przebieg co raz bardziej odbiega od kształtu idealnego prostokąta czy piły.

    Przebieg prostokątny można też generować wpuszczając filtrowany przebieg z naszego generatora na wejście komparatora, który wygeneruje nam przebieg prostokątny.
    Niestety przebiegu piłokształtnego czy trójkątnego nie da się tak prosto wygenerować. Wymagało by to zastosowania integratora z współbieżną ze zmianą częstotliwości, zmianą prędkości narastania przebiegu liniowego, dla utrzymania stałości amplitudy.

    Pozostaje jeszcze problem rozdzielczości przebiegu wyjściowego. Osiem bitów nadaje się do prostych rozwiązań. Szesnaście bitów wymaga 2 razy większej pamięci i większej ilości operacji przy użyciu procesora 8 bitowego.

    Jak więc widać jest z czego wybierać :)

    0
  • #14 06 Gru 2008 13:42
    Nawigator
    Poziom 33  

    Może Fast PWM z zegarem PLL 64MHz w ATtiny 26 lub 25 bardziej się nada, wyjście łatwe do filtrowania, jest nota Atmela na ten temat.
    Pzdr. N.

    0