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