www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Generiranje sinusa

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
zaz
Član
Član



Pridružen-a: Pon 06 Apr 2015 14:23
Prispevkov: 89
Aktiv.: 0.81
Kraj: Ljubljana

PrispevekObjavljeno: Čet Mar 31, 2016 7:34 pm    Naslov sporočila:  Generiranje sinusa Odgovori s citatom

Pozdravljeni,
delam na projektu, ki zahteva na izhodu mikrokrmilnika sinusni signal konstantne frekvence. Pri projetku uporabljam STM32F407-DISCOVERY ploščico, na kateri je zelo zmogljiv DAC pretvornik, ki po specifikacijah popolnoma zadošča za potrebno "kvaliteto" sinusa pri projektu.
Najprej se mi je pojavljala težava, da pri generiranju sinusa frekvenca ni bila ves čas konstantna. Težavo sem našel v overflow-u spremenljivke n.
Težavo, sem rešil tako, da ko spremenljivka n doseže 48000(na I2S vodilu imam nastavljeno hitrost oddajanja vzorcev 48kHz) jo vrnem ponovno na začetek. Problem nastane, ker se na sinusnem signalu precej pozna, kdaj program skoči v ta if stavek.
Ima kdo mogoče predlog, kako bi lahko rešil to težavo?

koda:
Koda:
double sample = 0;
double n = 0;
double w = 0.0144;             //samo poskusno izračunana krožna frekvenca za 440Hz na izhodu, pri vzorčni frekvenci 48kHz
double sin_parameter;


    while(1)
    {

       if (SPI_I2S_GetFlagStatus(CODEC_I2S, SPI_I2S_FLAG_TXE))
       {
          SPI_I2S_SendData(CODEC_I2S, sample);
          sin_parameter = w*n;
          sample = (sin(sin_parameter) + 1)*((0xFFF+1)/2);
          n++;
          if(n == 48000)
          {
             n=0;
          }
       }


    }


Najlepša hvala za odgovore!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter
Član
Član



Pridružen-a: Sre 30 Jun 2004 12:55
Prispevkov: 375
Aktiv.: 1.69
Kraj: Pod krvavcem nekje

PrispevekObjavljeno: Čet Mar 31, 2016 9:38 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljen

Poglej si tale primer : Primer če ti kaj pride prav.
primer

LP Peter

_________________
Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zaz
Član
Član



Pridružen-a: Pon 06 Apr 2015 14:23
Prispevkov: 89
Aktiv.: 0.81
Kraj: Ljubljana

PrispevekObjavljeno: Čet Mar 31, 2016 10:55 pm    Naslov sporočila:   Odgovori s citatom

Oba primera sem že pogledal.
Pri prvem primeru me moti, da ima tabelirane vrednosti. To pri meni ne pride v poštev, ker želim sinusu spreminjati frekvenco.
V moji kodi je upoštevana enačba navedena v pdf-ju, ki si ga navedel. Enačba se obnese, problem je z overflovom indeksa n.

Trenutno si ogledujem izvedbo z "digitalnim" oscilatorjem, omenjeno v tem dokumentu link.
Zadeva deluje, sem stestiral v matlab-u. Ne razumem, kako pa bi tak digitalni filter sprogramiral. Probleme mi dela enotin impulz na začetku, ker nevem kaj naj bi to v programu dejansko bilo, in spet bi se mi pojavil problem z overflovom indeksa n.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6540
Aktiv.: 29.45
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Čet Mar 31, 2016 11:17 pm    Naslov sporočila:   Odgovori s citatom

Precej potraten način si izbral za tole. Če generiraš sinus, bo verjetno dovolj preračun ene periode ... vse naprej bodo enake ... do spremembe frekvence?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
zaz
Član
Član



Pridružen-a: Pon 06 Apr 2015 14:23
Prispevkov: 89
Aktiv.: 0.81
Kraj: Ljubljana

PrispevekObjavljeno: Pet Apr 01, 2016 12:10 am    Naslov sporočila:   Odgovori s citatom

Če bi delal na način, da bi si najprej preračunal vrednosti, jih nato spakiral v neko zbirkoin nato samo bral, je dovolj tudi samo četrtina periode, ker se potem itak vse vrednosti ponovijo, le vrstni red in predznak(v mojem primeru zamik od sredine območja) je potrebno upoštevati. Moj program pa vsakič izračuna vrednost, ki jo mora dati na izhod.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zaz
Član
Član



Pridružen-a: Pon 06 Apr 2015 14:23
Prispevkov: 89
Aktiv.: 0.81
Kraj: Ljubljana

PrispevekObjavljeno: Pet Apr 01, 2016 7:15 am    Naslov sporočila:   Odgovori s citatom

Ali pozna kdo spletno stran na kateri bi bili objavljeni DSP algoritmi. V principu mi je obdelava diskretnih signalov na papirju jasna, zanima pa me kako izgledajo ti algoritmi, ko mora zadeva laufat v realnem času.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
s56al
Član
Član



Pridružen-a: Pon 19 Sep 2005 12:03
Prispevkov: 740
Aktiv.: 3.33
Kraj: JN66SI & JN76TM

PrispevekObjavljeno: Pet Apr 01, 2016 7:49 am    Naslov sporočila:   Odgovori s citatom

zaz je napisal/a:
...
Pri prvem primeru me moti, da ima tabelirane vrednosti. To pri meni ne pride v poštev, ker želim sinusu spreminjati frekvenco...


Tabelirane vrednosti sinusa niso ovira za spreminjanje frekvence, tudi s praktično poljubno ločljivostjo. Rešitev se imenuje DDS:

http://www.radio-electronics.com/info/rf-technology-design/pll-synthesizers/direct-digital-synthesizer-dds-tutorial.php
http://www.analog.com/media/en/training-seminars/tutorials/MT-085.pdf

V tvojem primeru ga, z izjemo D/A pretvornika, v celoti izvedeš programsko. Za frekvence do nekaj 10 kHz se ta reč (preverjeno) brez težav da izvesti v preprostem prekinitvenem podprogramu celo na klasičnih 8 bitnikih (v mojem primeru recimo PIC18F...), v 32 bitnem mikrokontrolerju pa še toliko lažje.

Za lep / pravilen sinus na izhodu je seveda pomembno tudi, da le-tega generiraš v podprogramu z najvišjo prioriteto, ki ga proži eden od internih časovnikov v enakomernih presledkih! Na začetku prekinitvenega podprograma daš na izhod D/A pretvornika vrednost, izračunano v predhodni prekinitvi, nato se lotiš izračuna vrednosti D/A za naslednji korak. Dolžina oz. trajanje samega izračuna tako ne povzroča dodatnega "faznega šuma".

Če si spodobnega HW LP filtra na izhodu ne moreš privoščiti, lahko pred D/A pretvorbo izvedeš še programsko (DSP) LP filtriranje, in narediš na izhodu le preprost R/C člen, ki izloča taktno frekvenco D/A pretvorbe.

LP, S.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
zaz
Član
Član



Pridružen-a: Pon 06 Apr 2015 14:23
Prispevkov: 89
Aktiv.: 0.81
Kraj: Ljubljana

PrispevekObjavljeno: Pet Apr 01, 2016 7:00 pm    Naslov sporočila:   Odgovori s citatom

s56al je napisal/a:
zaz je napisal/a:
...
Pri prvem primeru me moti, da ima tabelirane vrednosti. To pri meni ne pride v poštev, ker želim sinusu spreminjati frekvenco...


Tabelirane vrednosti sinusa niso ovira za spreminjanje frekvence, tudi s praktično poljubno ločljivostjo. Rešitev se imenuje DDS:

http://www.radio-electronics.com/info/rf-technology-design/pll-synthesizers/direct-digital-synthesizer-dds-tutorial.php
http://www.analog.com/media/en/training-seminars/tutorials/MT-085.pdf

V tvojem primeru ga, z izjemo D/A pretvornika, v celoti izvedeš programsko. Za frekvence do nekaj 10 kHz se ta reč (preverjeno) brez težav da izvesti v preprostem prekinitvenem podprogramu celo na klasičnih 8 bitnikih (v mojem primeru recimo PIC18F...), v 32 bitnem mikrokontrolerju pa še toliko lažje.

Za lep / pravilen sinus na izhodu je seveda pomembno tudi, da le-tega generiraš v podprogramu z najvišjo prioriteto, ki ga proži eden od internih časovnikov v enakomernih presledkih! Na začetku prekinitvenega podprograma daš na izhod D/A pretvornika vrednost, izračunano v predhodni prekinitvi, nato se lotiš izračuna vrednosti D/A za naslednji korak. Dolžina oz. trajanje samega izračuna tako ne povzroča dodatnega "faznega šuma".

Če si spodobnega HW LP filtra na izhodu ne moreš privoščiti, lahko pred D/A pretvorbo izvedeš še programsko (DSP) LP filtriranje, in narediš na izhodu le preprost R/C člen, ki izloča taktno frekvenco D/A pretvorbe.

LP, S.


Bom poskusil narediti po teh dveh tutorialih pa javim kako bo šlo. Hvala za odgovore!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 49 dni


Powered by phpBB © 2001, 2005 phpBB Group