|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Čet Mar 31, 2016 7:34 pm Naslov sporočila: Generiranje sinusa |
|
|
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 |
|
|
Peter Član
Pridružen-a: Sre 30 Jun 2004 12:55 Prispevkov: 375 Aktiv.: 1.69 Kraj: Pod krvavcem nekje
|
Objavljeno: Čet Mar 31, 2016 9:38 pm Naslov sporočila: |
|
|
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 |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Čet Mar 31, 2016 10:55 pm Naslov sporočila: |
|
|
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 |
|
|
frenki Moderator
Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6540 Aktiv.: 29.45 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Čet Mar 31, 2016 11:17 pm Naslov sporočila: |
|
|
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 |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Pet Apr 01, 2016 12:10 am Naslov sporočila: |
|
|
Č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 |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Pet Apr 01, 2016 7:15 am Naslov sporočila: |
|
|
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 |
|
|
s56al Član
Pridružen-a: Pon 19 Sep 2005 12:03 Prispevkov: 740 Aktiv.: 3.33 Kraj: JN66SI & JN76TM
|
Objavljeno: Pet Apr 01, 2016 7:49 am Naslov sporočila: |
|
|
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 |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Pet Apr 01, 2016 7:00 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|