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

ADSP-219X Generator funkcji

revolt 05 Paź 2008 15:19 2000 7
  • #1 5601415
    revolt
    Poziom 34  
    Czy ktoś próbował może wykonać na tej rodzinie procesorów generator funkcji? Na razie mam koncepcję :) tylko żeby użyć timera i odpowiednich wzorów na trójkąt, prostokąt, trapez i jakiejś gotowej tablicy dla sinusoidy. Mógłby ktoś podrzucić jakis kod użycia timerów jako danych wejściowych?
  • Pomocny post
    #2 5601607
    Freddie Chopin
    Specjalista - Mikrokontrolery
    revolt napisał:
    Mógłby ktoś podrzucić jakis kod użycia timerów jako danych wejściowych?

    hę? przeciez timer robi tylko i wylacznie za zegar probkowania... ja np nie wiem o co ci chodzi, niemniej jednak uwazam, ze tak zaawansowany procesor do tak prostackiej funkcji to przesada. generator mozna zrobic na pierwszym lepszym procku i nie musi to byc od razu DSP.

    4\/3!!
  • #3 5601652
    revolt
    Poziom 34  
    I tu się pojawia problem bo to musi być procesor DSP :) Chodzi mi o to, że mając wzorek na trójkąt (ax+b lub -ax+b) mogę sobie mnożyć stan timera (jako x) i mam przebieg. Niestety o samych ADSP mam mgliste pojęcie aczkolwiek walcze z dokumentacją i zaczynam powoli łapać.
  • Pomocny post
    #4 5601687
    Freddie Chopin
    Specjalista - Mikrokontrolery
    eeee.... ale to wciaz jest mocno bezsensowne. przeciez nie wygenerujesz trojkata o czestotliwosci 500MHz tak czy siak, bo porty tyle nie wyrabiaja.

    tak naprawde to prosciej wygenerowac jeden okres sygnalu do RAMu, a w przerwaniu po prostu wyrzucac kolejne probki. przerwanie wtedy po prostu realizuje 3 operacje:
    1. wystawienie i-tej probki z tablicy na przetwornik
    2. zwiekszenie indexu i
    3. sprawdzenie czy i jest wieksze niz okres, jesli tak, to i=0;

    zas co do dynamicznych zmian parametrow sygnalu (czestotliwosci glownie), to poczytaj o DDS (Direct Digital Synthesis) - dzieki tej technice jestes w stanie z wygenerowanego wczesniej jednego okresu sygnalu o jakiejstam czestotliwosci (dosyc niskiej) wygenerowac sygnaly o czestotliwosciach wiekszych. realizujesz to poprzez zwiekszanie owego 'i' o wiecej niz 1. dodatkowo mozna zalozyc, ze twoj wygenerowany okres ma np 65536 probek, ale w rzeczywistosci istnieje tylko 4096 (rozlozonych oczywiscie rownomiernie) - brakujace probki realizowane sa poprzez interpolacje liniowa dwoch sasiednich, ktore istnieja rzeczywiscie. dla przykladu podanych przezemnie wartosci - wyzsze 12bitow indexu (16-bitwego) indexuje rzeczywiste probki w tablicy, a 4 najmlodsze bity uzywane sa do interpolacji liniowej na zasadzie ((a-b)/2^4)*4LSB, gdzie a i b to najblizsze istniejace probki.

    ta metoda idealnie nadaje sie do sygnalow zmieniajacych sie plynnie, czyli sinusa i pochodnych, nada sie tez do trojkata, ale moze mu lekko przytepic wierzcholki. to samo przy trapezie.

    na pewno metoda ta nie ma sensu przy prostokacie <:

    4\/3!!
  • #5 5602458
    revolt
    Poziom 34  
    Z tego co wyczytałem to timer może generować okresy od 80ns do 5.42ms bez skalowania. Mi spokojnie wystarczy generowanie gdzieś w połowie tego. To ma być pokazówka.
  • #6 5625131
    revolt
    Poziom 34  
    Tak się zastanawiam jak wygenerować szum biały. Ma ktoś jakiś pomysł?
  • #8 5660954
    revolt
    Poziom 34  
    Jakos powoli brne przez to wszystko, ale po wpisaniu takiego kodu:

    pila:
    AX0=DM(punkt);
    AY0=0x0148;
    AR=AX0+AY0;
    if AV jump napraw ;
    MY0=AR;
    MX0=DM(multi_c);
    MR=MY0*MX0(SS);

    DM(Left_Channel_Out)=MR1;

    AX1=1;
    AX0=DM(punkt);
    AR=AX0+AX1;
    DM(punkt)=AR;
    jump sawtooth;

    napraw: AX0=1;
    DM(punkt)=AX0;
    jump pila:

    Czyli przy kazdym wywolaniu dodaje sobie stala wartosc do zmiennej punkt. Zmienna multi_c to mnoznik- krecac potencjometrem moge zmieniac amplitude. Powinnien liniowo wyjsc sygnal piloksztaltny. Niestety wychodzi cos z zalacznika. Dlaczego sygnal jest taki "zaokraglony"?
REKLAMA