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

[ATmega128][c] - "wyjście analogowe", generowanie krzywej

loczi 08 Gru 2011 01:05 3996 20
  • #1 10232133
    loczi
    Poziom 13  
    Witam,

    posiadam uP ATmega128 i z tego co wiem i sprawdzałem nie posiada on wyjścia analogowego. Jeśli ma to niech ktoś poda gdzie takie coś jest opisane w dokumentacji ;)

    więc...

    żeby wygenerować sygnał analogowy trzeba użyć PWM. Jak np wygenerować sinus trójkąt czy coś tego typu(nie prostokąt), trzeba jakiś dodatkowy układ?
    Znalazłem i przerobiłem kod programu który ma generować trójkąt, ale póki co jest to tylko sygnał PWM

    Jak wygenerować np. trójkąt po przez ATmega128?
    Jakiś konwenter PWM na analog? (w VMLAB stosuje filtr RC i nie za bardzo to wygląda)
  • Pomocny post
    #2 10232370
    Father
    Poziom 26  
    loczi napisał:
    Jak wygenerować np. trójkąt po przez ATmega128?
    Jakiś konwenter PWM na analog? (w VMLAB stosuje filtr RC i nie za bardzo to wygląda)

    Tak, wszystko opisane jest tutaj Using PWM to Generate Analog Output
  • #3 10235260
    loczi
    Poziom 13  
    Jakieś kształty piło-kształtne się pojawiają, lecz myślę że coś jest nie tak.

    Mógłby ktoś wrzucić jakiś kod w C(obojętnie dla jakiej atmegi) i napisać jak wygląda wygenerowany sygnał? Otwieram kody z avrfreaks i jakoś mi działać nie chcą
  • Pomocny post
    #4 10235759
    elektryk101
    Warunkowo odblokowany
    Zamiast PWM można użyć drabinki R2R, ale zajmie to więcej portów mikroprocesora.
    Popatrz:
    http://www.myplace.nu/avr/minidds/
    Co prawda w ASM a nie w C...
    A jak chcesz używać PWM to bez wyliczenia wartości elementów R, C(filtra) przebieg może być niepoprawny.
  • Pomocny post
    #5 10235787
    INTOUCH
    Poziom 30  
    Nie chcą działać czy kompilować?
    Jaki kod pod jaką ATmegę? Ty masz ATmega 128.
    Piły z PWM bezpośrednio nie uzyskasz.
    Musisz dać po drodze jakiś filtr aktywny lub pasywny.
    Od tego jak dobierzesz parametry RC będzie wyglądał przebieg.
    Wartości RC będą inne dla innej częstotliwości, żeby uzyskać przebieg o podobnym kształcie.
    O jaki przebieg piłokształtny ci chodzi?:
    a) ΛΛΛΛΛΛΛΛΛΛΛΛ
    b) |\|\|\|\|\|\|\|\|
    c) /|/|/|/|/|/|/|/|/|
  • #6 10236032
    loczi
    Poziom 13  
    Ogólnie chcę generować stały - (o różnych poziomach) Sinus, prostokąt i piłe |\ lub /|

    Nie zależy mi na żadnej konkretnej "technologi" typu PWM.

    Ale widząc link od elektryk101 bardzo mnie to zaciekawiło. Myślę że kod jest prosty(nie znam asm), a przynajmniej krótki. Jakby ktoś miał w C to bym był szczęśliwszy(choć myślę że to tylko wygenerowanie tablic jest problemem).

    Oczywiście na inne propozycje czy sugestie też czekam ;-)

    Oznaczenie przy drabince rezystorowej "10/20k" oznacza że jest 10pinowa(9rezystorów w środku) i każdy ma 20kΩ?
  • Pomocny post
    #7 10237211
    INTOUCH
    Poziom 30  
    Na ATmega 128 posiada sporo pinów. Jeśli 8 z nich ci nie jest potrzebnych to możesz spokojnie taki przetwornik wykonać. Rozdzielczość przetwornika będzie wynosić 8bit, czyli 256 stanów logicznych. Filtr i tak musisz zastosować w celu wygładzenia przebiegu schodkowego. Stosuj rezystorki z zakresu 10-20KOhm ale bardzo zbliżonej zmierzonej rzeczywistej rezystancji wtedy wysokość schodków będziesz miał taką samą. Jeśli chodzi o generacje przebiegu, to możesz wykorzystać, jeden z timerów, lub tablicę. Jeśli umiesz mrugać diodą i programować w C to nie powinieneś mieć problemu z napisaniem testowej funkcji generującej sygnał o częstotliwości 50Hz.
  • Pomocny post
    #8 10238067
    elektryk101
    Warunkowo odblokowany
    Popatrz jeszcze na to:
    https://www.elektroda.pl/rtvforum/topic1382028.html
    autor tego tematu przerobił kod z ASM na C z tego linku który podałem wcześniej.
    A z tą drabinką, to popatrz na to:
    http://en.wikipedia.org/wiki/File:R2r-ladder.png
    w przypadku projektu ze strony do której podałem link w poprzednim poście rezystor 2R ma wartość 20k a rezystor R ma wartość 10k.
  • #9 10238951
    loczi
    Poziom 13  
    Wielkie dzięki za rady i kody ;-) nie omieszkam umieścić rezultatów niedługo.

    INTOUCH napisał:
    Filtr i tak musisz zastosować w celu wygładzenia przebiegu schodkowego.

    Też filtr RC? R i C zależne od częstotliwości? (chciałem zrobić niezależny od częstotliwości - konfigurowalną częstotliwość po przez program)[/quote]

    INTOUCH napisał:
    Stosuj rezystorki z zakresu 10-20KOhm

    Kupiłem już 1-2K, jeśli będą złe to przelutuje.

    INTOUCH napisał:
    Jeśli chodzi o generacje przebiegu, to możesz wykorzystać, jeden z timerów, lub tablicę. Jeśli umiesz mrugać diodą i programować w C to nie powinieneś mieć problemu z napisaniem testowej funkcji generującej sygnał o częstotliwości 50Hz.

    Myślę, że nie będzie problemów. Będę zmieniał tyło napięcie na PINach (tam gdzie teraz jest zasilanie 5V). Tylko mnie zastanawia. Czy da się osiągnąć tym sposobem 5V na wyjściu?(bez podłączania pinu 5v bezpośrednio do wyjścia, bo myślę, że wtedy będzie za duży skok)

    [ATmega128][c] - "wyjście analogowe", generowanie krzywej
    Na schemacie użyłem "drabinki" 5 nóżkowej dla uproszczenia. Do generatora myślę o 9 lub dwóch po 9.
  • #10 10240173
    INTOUCH
    Poziom 30  
    Zmierz napięcie na nóżce niżej i wyżej to uzyskasz odpowiedź na swoje pytanie.
    Wartości rezystorów 10/20 dobrane są do przetwornika 8 bit, który jest oparty o dzielnik napięcia.

    loczi napisał:

    Też filtr RC? R i C zależne od częstotliwości? (chciałem zrobić niezależny od częstotliwości - konfigurowalną częstotliwość po przez program)

    [/quote]
    Parametry R i C będą inne dla przebiegu o częstotliwości 1Hz, inne dla 1kHz.

    Głównie chodzi o stałą czasową ładowania się kondensatora, oraz tłumienie wysokich , (jeśli trzeba niskich) częstotliwości.
    W praktyce parametry filtru liczy się na górną i dolną częstotliwość graniczną.
    Jeżeli policzysz filtr dla sinusa 50Hz to nie będzie działał dla przebiegu piłokształtnego z prawie natychmiastowym opadającym zboczem.
    Dla piły czas narastania może wynieść T1 =19,999 ms, a opadania T2=1us.
    Jeżeli stała czasowa będzie wynosić więcej niż T2/4 to będziesz miał zniekształcenia po filtracji. Dobierz parametry filtru do górnej częstotliwości granicznej, lub dla filtru pasmowo przepustowego. Jeżeli schodki ci nie przeszkadzają wcale nie musisz dodawać filtru. Przy ośmiobitowym przetworniku schodki są widoczne i czasami przeszkadzają. Przy 10 bitowym przetworniku filtr do większości amatorskich aplikacji nie jest potrzebny.

    Tu masz odnośnik do stronki która liczy filtry aktywne i pasywne.
    http://mikrokontrolery.blogspot.com/p/kalkulatory-elektronika.html
  • #11 10258644
    Sławek-K
    Poziom 15  
    Rozwiązanie z drabinką myślę , że będzie bardzo dobre, tylko mała uwaga: Na każdym z wyjść z uP (w szereg z rezystorem) nie powinna być dioda? Dowolna , aby prąd nie wpływał do pinu który będzie logicznym "0", tylko wypływał (dioda anodą do pinu) ?
  • #12 10258670
    Konto nie istnieje
    Konto nie istnieje  
  • #13 10258981
    janbernat
    Poziom 38  
    To jest przecież stary poczciwy covox.
    Należy tylko zrobić jakieś tablice w pamieci i z niej czytać.
    Częstotliwość będzie zalezała od szybkości odczytu a kształt- od tego co jest w tablicy.
    Ponieważ jest to drabinka R-2R to wykonanie jej jest proste.
    Oporniki mają być jednakowe- a ich wartość ma mniejsze znaczenie.
    Kupujemy 100-200 oporników 10k, bierzemy miernik i wybieramy jednakowe.
    Miernik zwykle jest niedokładny- ale jego błąd jest zawsze taki sam.
    Z tych oporników układamy R-2R tak że jako 2R dajemy w szereg dwa oporniki.
  • #14 10306697
    loczi
    Poziom 13  
    Po woli zacząłem się brać za układ i pojawia się pytanie.

    Czy można jakoś w prosty sposób zwiększyć napięcie wyjściowe z drabinki (powiedzmy 0-5V) na 0-10V. Najlepiej bez podłączania napięcia zewnętrznego(lub ewentualnie 12V)
  • Pomocny post
    #15 10306839
    janbernat
    Poziom 38  
    Wzmacniacz operacyjny zasilany z 12V.
  • Pomocny post
    #16 10306890
    Sławek-K
    Poziom 15  
    Niestety bez napięcia zewnętrznego nic nie zrobisz. Zastosuj wzmacniacz operacyjny (lub wzmacniacz audio np coś z bardzo popularnych TDA ).
    Napięcie oczywiście musisz dać zewnętrzne, np +12VDC.
  • #17 10307065
    loczi
    Poziom 13  
    Czyli jak bym zrobił układ, na TDA2003, wg schematu wzmacniacza nie odwracającego(patrz niżej), gdzie jako R2 dałbym potencjometr do możliwości kalibracji generatora, a na "supply" 12V. To działało by dobrze? (Układ wybrany pierwszy lepszy pasujący pod wymogi - nie znam się na tym jakie są używane lub są dobre)

    [ATmega128][c] - "wyjście analogowe", generowanie krzywej
  • #18 10307121
    janbernat
    Poziom 38  
    No ale to nie jest pełny schemat- potrzebne są kondensatory na wejściu i wyjściu.
    Zależy ile prądu potrzebujesz na wyjściu i jaka dolna częstotliwość.
    Ja bym dał LM324, 358 albo jakiegoś TL.
  • #19 10307767
    Sławek-K
    Poziom 15  
    Troszkę zamieszałeś. Jeśli masz (lub chcesz zakupić ) TDA 2003 to trzymaj się oryginalnego schematu, takiego jaki jest w załączonym przez Ciebie linku. Uproszczeń lepiej nie wprowadzaj. Jeśli natomiast chcesz na wzmacniaczu operacyjnym jak na rysunku jaki umieściłeś, to zwróć uwagę , że jest tam napięcie symetryczne czyli np +/-12VDC. Jeśli posiadasz zasilacz tylko z jednym napięciem (+12VDC) to ten schemat się nie nadaje. (No bo co podłączysz pod -U).
    Zobacz na ten schemat wz-cza.
    https://www.elektroda.pl/rtvforum/topic688358.html
  • #21 10315854
    jony15
    Poziom 24  
    Nie lepiej przetwornik C/A np MCP4911 prosty w "obsłudze" mały a cena ok 8pln
REKLAMA