Electrokit Buggfix Plus
Aktuellt datum och tid: 23.13 2017-09-25

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 23 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 19.37 2012-11-25 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Har gjort förnyade tester med ännu en digital SSB modulator, den här gången med en dsPIC30F3012 från Microchip.
Bygget fungerar för övrigt fint som en röstförvrängare, kan "byta plats på bas och diskant".
Musik kan man få och låta hur illa som helst om frekvensfelet att tillräckligt, något 10-tal Hz räcker. :lol:

En bild på bygget:

Bilaga:
dsPIC30F3012_SSB.jpg


Den här gången använde jag mig av Microchips FIR-filter skrivna i assembler
som kompilerades med "C30" från Microchip.
Det gick åt ett antal timmar innan allt fungerade som det skulle. :mrgreen:
dsPIC skiljer sig en del från de vanliga (PIC12 -16 och 18-serien ) jag har hållit på med tidigare.

Bilaga:
dsPIC30F3012.jpg


Ska försöka förklara lite hur den fungerar.

Insignalen samplas med 32kHz / 12-bitar, det är en timer som ger interrupt med rätt tidsintervall ( 31,25us ).
Efter det delas och sedan filtreras signalen i två stycken allpassfilter med 2 x 128 "Taps".
Nu har vi två signaler, kallar dem för I och Q.
Allpassfiltret ( eller Hilbert filter ) ger en fasförskjutning mellan I och Q på 90 grader.

Så här anropas filtret i C:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
FIR(BLOCK_LENGTH, &FilterOut[0], &A_D_value[0], &Hilbert_Allpass_Filter_I_channel);
Out_I=FilterOut[0];

FIR(BLOCK_LENGTH, &FilterOut[0], &A_D_value[0], &Hilbert_Allpass_Filter_Q_channel);   
Out_Q=FilterOut[0];



Själva filtret är en samling hexadecimala tal, ett av "filtren" eller snarare filterkoefficienterna ser ut så här:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)

; ..............................................................................
;    File   Hilbert_Allpass.s
; ..............................................................................

                .equ Hilbert_Allpass_I_channel_NumTaps, 128

            

; ..............................................................................
; Allocate and initialize filter taps

;             
                .section Hilbert_AllpassFilter_I_channel_psvconst, code  ;<-Syntax supported in MPLAB C30
                                                                     ;v1.30 and later
                .align 256

Hilbert_allpass_I_channel_Taps:
.hword 0xffc7, 0xfe4f, 0xfb1e, 0xf714, 0xf4a6, 0xf76c, 0x027a, 0x160c
.hword 0x2de2, 0x4193, 0x4764, 0x38be, 0x1634, 0xe8bf, 0xbef0, 0xa6fb
.hword 0xa83b, 0xbf99, 0xe0e8, 0xfcc8, 0x082b, 0x0184, 0xf0dd, 0xe2d9
.hword 0xe172, 0xee97, 0x0396, 0x1580, 0x1bc4, 0x150c, 0x0794, 0xfcfb
.hword 0xfc44, 0x05c2, 0x1356, 0x1c98, 0x1c34, 0x130c, 0x0753, 0x005a
.hword 0x01e9, 0x0a0d, 0x12b2, 0x15c2, 0x110d, 0x077a, 0xfee2, 0xfc20
.hword 0xffff, 0x06ef, 0x0b9c, 0x0a7d, 0x040c, 0xfc3e, 0xf7bc, 0xf8c4
.hword 0xfddc, 0x02f9, 0x0457, 0x00eb, 0xfaef, 0xf638, 0xf595, 0xf901
.hword 0xfdcf, 0x009a, 0xff91, 0xfb94, 0xf774, 0xf5f7, 0xf7fa, 0xfc00
.hword 0xff51, 0xffe1, 0xfd9e, 0xfa60, 0xf88c, 0xf96e, 0xfc71, 0xff9b
.hword 0x00ff, 0xffff, 0xfda3, 0xfbc9, 0xfbd4, 0xfdcc, 0x0068, 0x020c
.hword 0x01da, 0x003f, 0xfe8f, 0xfe0d, 0xff17, 0x00f8, 0x0274, 0x02ac
.hword 0x01a7, 0x003d, 0xff77, 0xffd6, 0x010b, 0x023c, 0x02a3, 0x020f
.hword 0x00f9, 0x0022, 0x000b, 0x00a7, 0x0171, 0x01d3, 0x018d, 0x00d5
.hword 0x002b, 0xfffa, 0x0052, 0x00e5, 0x0146, 0x0130, 0x00b1, 0x0016
.hword 0xffb4, 0xffb2, 0xfffc, 0x0053, 0x0078, 0x004b, 0xfff3, 0xffdb


; ..............................................................................
; Allocate delay line in (uninitialized) Y data space

                .section .ydata, data, ymemory  ;<-Syntax supported in MPLAB C30
                                                ;v1.30 and later
                .align 512

Hilbert_I_Delay:
                .space Hilbert_Allpass_I_channel_NumTaps*2






; ..............................................................................
; Allocate and intialize filter structure

                .section .data
                .global _Hilbert_Allpass_Filter_I_channel

_Hilbert_Allpass_Filter_I_channel:
.hword Hilbert_Allpass_I_channel_NumTaps
.hword psvoffset(Hilbert_allpass_I_channel_Taps)
.hword psvoffset(Hilbert_allpass_I_channel_Taps) + Hilbert_Allpass_I_channel_NumTaps*2 - 1
.hword psvpage(Hilbert_allpass_I_channel_Taps)
.hword Hilbert_I_Delay
.hword Hilbert_I_Delay + Hilbert_Allpass_I_channel_NumTaps*2 - 1
.hword Hilbert_I_Delay



Filterkoefficienterna tog jag fram med Matlab:s "fdatool" samt en del egen kod
som skriver ut koefficienterna i en textfil. Sen är det bara klippa & klistra in i MPLAB.


Sedan finns det en mjukvarublandare som multiplicerar I och Q-signalerna med 8kHz ( 1/4-del av 32kHz )
Blandare nummer ett använder sekvensen 1, 0 ,-1, 0 att multiplicera I med.
Blandare nummer två använder sekvensen 0, 1 , 0,-1 att multiplicera Q med.
Då får vi en automatisk fasförskjutning på 90 grader ( jämför sin / cos ).

"Lokaloscillatorn" på 8kHz ser i stort sett ut så här:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
signed int I_Osc[Phases] = {1, 0,-1, 0};   // In-phase and Quadrature oscillator
signed int Q_Osc[Phases] = {0, 1, 0,-1};



if (p==4)   // Local oscillator control
   {
    p=0;
    }

p=p+1;


Sedan summeras ( eller subtraheras) de båda signalerna till en, vilket beror på vilket sidband man vill ha ut.
En mjukvaruversion av två stycken Mini-circuits "SBL-1" :?:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
Out_to_AD = ((Out_I * I_Osc[p]) - (Out_Q * Q_Osc[p])); // Software Mixer, sideband select.
Sound = (Out_to_AD  + 2048 );




Sen skickas data via SPI till en 12-bit D/A MCP4821 som ger ut den färdiga signalen.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
SPI1BUF   = ( Sound | 0x1000 );    // Send 16-bit data to D/A converter
      
   while ( SPI1STATbits.SPITBF == 1 )
   {
   }
   
   Dummy_read   =   SPI1BUF;



För mer information om "fasningsmetoden" för att fixa till SSB så finns ARRL-boken bl.a.

Klockoscillator är på 6,144MHz * 16x ger 98,304MHz / 4 ger en effektiv klockfrekvens på 24,576MHz.
dsPIC:en jobbar inte för fullt än, bilden visar hur lång tid filtret, lokaloscillator och blandning tar.
5us / div, periodtid 31,25us . Då signalen är noll så är dsPIC "ledig" och kan hinna med annat.
Inte illa med tanke på att den kör igenom 2 x 128 "taps" stora FIR-filter på den tiden bl.a.
Strömförbrukning ca 90mA @ 5V.

Bilaga:
uP_belastning 5us_div.jpg


Utsignalen övre sidbandet "USB", frekvensområdet (ca) 0 - 4,5kHz uppblandat med 8kHz oscillator till 8-12,5kHz.
Undre sidbandet "LSB" syns knappt ( frekvensområdet 3,5 - 8kHz )

Bilaga:
Spectrum USB.jpg


För radiobruk så kan det räcka med ett billigt keramiskt filter ( på t.ex. 455kHz ) som rensar bort onödigt skräp
blir i varje fall betydligt lättare än med den traditionella "filter-metoden" som kräver ett bra men dyrt kristallfilter.
En blandare tillkommer förstås som t.ex. NE612, har inte kommit så långt än.... :!:


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 21.31 2012-11-25 

Blev medlem: 15.28 2011-10-31
Inlägg: 897
Ort: Linköping
Stiligt, mer!

Om jag inte har otur när jag tänker...
Om du vill få loss fler cykler till annat så förenkla koden så att du inte multiplicerar med 1, 0, -1.
Om jag förstår din kod rätt... Rulla ut loopen 4 gånger:

Out_to_AD = ((Out_I * 1 ) - (Out_Q * 0 );
Out_to_AD = ((Out_I * 0 ) - (Out_Q * 1 );
Out_to_AD = ((Out_I * -1) - (Out_Q * 0 );
Out_to_AD = ((Out_I * 0 ) - (Out_Q * -1);

Vilket kan förenklas till:
Out_to_AD = ((Out_I ) - ( );
Out_to_AD = (( ) - (Out_Q );
Out_to_AD = ((Out_I * -1) - ( );
Out_to_AD = (( ) + (Out_Q );

Vilket kan förenklas till:
Out_to_AD = (Out_I );
Out_to_AD = (-Out_Q);
Out_to_AD = (-Out_I);
Out_to_AD = (Out_Q);

Fast detta har du säkert redan tänkt på så glöm det då! :-)


Upp
 Profil  
 
InläggPostat: 21.52 2012-11-25 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Det var ett intressant tips, multiplikation med noll är rätt onödigt trots allt :idea:
Var mest glad att jag fick den att fungera bra för en gångs skull :D
Ska titta vidare på det!

SSB med 4,5kHz bandbredd låter nästan "Hi-Fi" mot 2,4kHz som är vanligt.

Digitala filter skrivna i C är betydligt långsammare än de i assembler.
Har testat via den "hårda vägen", använd de i assembler i stället.
De är lite krångligare att använda men hastigheten är desto högre :D

Som mottagare använder jag denna: http://www.winrad.org/


Upp
 Profil  
 
InläggPostat: 10.49 2012-11-26 
Moderator
Användarvisningsbild

Blev medlem: 21.44 2007-02-23
Inlägg: 3805
Ort: Åkarp / Uppsala
Mycket intressant. :tumupp:


Upp
 Profil  
 
InläggPostat: 12.24 2012-11-26 

Blev medlem: 18.26 2006-07-04
Inlägg: 23239
Instämmer :tumupp:

Har du schema på den där kopplingen?


Upp
 Profil  
 
InläggPostat: 19.04 2012-11-28 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Bytte till en kristall på 7,2MHz, efter smärre ändringar i programmet så vart det en samplingsfrekvens av 40kHz.
Nu fungerar blandaren på 10kHz.
Ett lågpassfilter som bryter vid ca 13,5kHz har tillkommit. Dämpning ca -60dB vid ca 27-30kHz.
Varför det vart något mer brus i intervallet 0-10kHz det vet inte jag (än).

Bilaga:
10kHz blandning.jpg


Schema kommer så småningom, ska bygga upp den på ett kretskort.
De flesta kondensatorerna är bara för avkoppling, två till kristalloscillatorn.

Microchips Code Example CE118 innehåller mycket "bra att veta" om hur man använder FIR-filter.
Jag använde mig av den till det här bygget.

Finns på: http://www.microchip.com/CodeExamplesByFunc.aspx


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 15.33 2012-12-18 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Nu är bygget färdigt och testat med utsignal på 21,4MHz.
Ingen justering av SSB-generatorn kan göras eftersom allt sker i mjukvara.
Mjukvaran i dsPIC är ca 1kByte stor.

Några bilder:
Längst ner till vänster återfinns mikrofonförstärkaren en TL072.

Bilaga:
SSB exciter.jpg


Bilaga:
kortet.jpg


Själva SSB-generatorn är en dsPIC30F3012 samt 12-bit D/A MCP4821, dessa kretsar flyttar upp audio-frekvensområdet 0-3kHz till 10-13kHz.
Signalen filtreras i ett Cauer-lågpassfilter ( brytfrekvens 13kHz ) för att ta bort frekvenser mellan 27-30kHz (finns en "kopia" av den önskade signalen där!)
dsPIC30F3012 samplar mikrofonsignalen med 40kHz. dsPIC:en har mjukvara för 2st Hilbert-filter för I och Q-signal, mjukvarublandare på 10kHz och ett 10kHz högpassfilter.
Efter det så skickas signalen till en 12-bit D/A via SPI.

Bilaga:
dsPIC30F3012.jpg


En PIC12F683 används som oscillator och frekvensdelare. En frekvens på 17,734475MHz delas med totalt 40
som ger en fyrkantsvåg på ca 443kHz, den passerar ett lågpassfilter som tar bort övertoner. Ut kommer en
fin sinusvåg. En SA612 blandar ihop 443kHz med 10-13kHz, ut kommer 433kHz och 453kHz den sistnämnda
signalen filtreras ut med det keramiska filtret nedan. (Bandbredd 6kHz)
Bilaga:
Cer_filt.jpg


Sen blandas signalen från keramiska filtret med en frekvens på 20,94375MHz i en andra SA612 mixer.
Ut får vi återigen två frekvenser (ca) 20,488MHz och 21,398MHz. Filtrerar ut den önskade signalen
med ett kristallfilter avsett för FM 21,4MHz, bandbredd +/- 7,5kHz. Efter filtret följer det en impedansanpassning
från 1,5kohm till 50ohm. En MAV-11 MMIC höjer signalnivån med ca +13dB.

Om det är någon som undrar över frekvensen 17,734475MHz så är det 4x färgunderbärvågsfrekvensen
för PAL-TV systemet (4,433MHz) :wink:

Sen får man blanda 21,4MHz signalen till önskat amatörband
15m ( 21MHz ) blir lite knepigt men det går bra att använda 10,7MHz kristallfilter och 10,245MHz kristall
till den sista blandaren. Allt är vanliga standardkomponenter, lätta att hitta m.a.o.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 18.03 2012-12-18 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Tar med schemat också ifall någon är intresserad av att titta i det
(Och blir inspirerad av högfrekvensbyggen....) :)

Bilaga:
SSB Exciter ver1.pdf


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 18.30 2012-12-18 
Moderator
Användarvisningsbild

Blev medlem: 21.44 2007-02-23
Inlägg: 3805
Ort: Åkarp / Uppsala
Mycket snyggt! Jag tackar för byggbeskrivningen och inspirationen.


Upp
 Profil  
 
InläggPostat: 23.20 2012-12-18 
Användarvisningsbild

Blev medlem: 14.11 2005-09-06
Inlägg: 1061
Ort: Storsjö, Sorsele
Tjusigt, mycket snyggt! Har du förtennat kortet? Hur? Har provat med kemiskt tenn på jobbet, men det blir inte så värst jämt och snyggt ...


Upp
 Profil  
 
InläggPostat: 08.15 2012-12-19 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Förtenningen är gjord med just kemiskt tenn, tyskt fabrikat "SENO 3211 Glanzzinn EXTRA".

I bruksanvisningen står det att badet ska hålla en temperatur mellan 20-30 grader
för bästa resultat. Är temperaturen högre så blir tennkristallerna som fälls ut på kortet
större som i sin tur ger sämre "finish" (inte lika blankt).

Putsade laminatet efter etsningen med stålull (Svinto), sköljde med varmvatten och en skvätt aceton
på hushållspapper och torkade av kortet med den.
Sen ner med kortet i "Glanstennet" i några minuter, räcker med ett tunt tennlager.
Kortet oxiderar inte på samma sätt som ren koppar, blir lättare att löda om man inte bygger färdigt direkt.
Efteråt sköljs kortet först i kallt vatten sen i varmt.

http://www.seno.de/downloads/tis.html titta efter "SENO 3211".


Upp
 Profil  
 
InläggPostat: 12.54 2013-02-10 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Vill man byta sidband LSB / USB så går det också att byta kristallen X1 (se schemat)
20,945MHz till 21,855MHz så får man LSB (undre sidbandet).

Mjukvaran är för närvarande permanent inställd för USB ( övre sidbandet ).


Upp
 Profil  
 
InläggPostat: 18.17 2013-02-22 

Blev medlem: 10.06 2007-07-08
Inlägg: 119
Ort: Enköping
YD1150 skrev:
Tar med schemat också ifall någon är intresserad av att titta i det
(Och blir inspirerad av högfrekvensbyggen....) :)

Bilaga:
SSB Exciter ver1.pdf

Snyggt kretskort! Jag ser att du ritat schemat med ExpressSCH, men har du använt ExpressPCB eller annat program till layouten?


Upp
 Profil  
 
InläggPostat: 23.47 2013-02-22 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Stämmer bra att de är ritade med ExpressSCH och ExpressPCB, de fungerar
bra, saknar en del finesser men man kan inte få allt :)


Upp
 Profil  
 
InläggPostat: 20.09 2013-10-29 
Användarvisningsbild

Blev medlem: 21.41 2010-10-29
Inlägg: 1327
Dags för lite tester av dsPIC som "mjukvaru"-mottagare.

Först ett blockschema över mjukvarudelen:

Bilaga:
SW_RX.jpg


Ingången till dsPIC:ens A/D omvandlare är "RF" till vänster, om nu 10kHz är RF :)
Signalen filtreras genom ett digitalt bandpassfilter med en centerfrekvens på 11,5kHz.
Filtret släpper igenom signaler mellan ca 10kHz till lite drygt 13kHz.
Sedan är blandas signalen med en signal på 10,000 kHz, lokaloscillatorn "NCO" eller kanske
mer känd som BFO för radiointresserade.... BFO = Beat Frequency Oscillator.
NCO:n har sekvensen 1, 0, -1, 0 och ut får vi vår önskade demodulerade signal ca 300-3200Hz.
Innan D/A omvandling får signalen passera ett digitalt lågpassfilter med en brytfrekvens på ca 3,2kHz.

Med en insignal på 11kHz ser utgången från D/A-omvandlaren så här:

Bilaga:
RX_spektrum.jpg


Och vips så finns vår 11kHz insignal hörbar på 1kHz. Det kretsen gör är att flytta frekvenområdet
från 10-13kHz till 0-3kHz (nåja den går inte ner till DC... :mrgreen: )
Brusnivån är något högre i området 0-3kHz men det stör inte så farligt när man lyssnar med
hörlurar. Med frekvensen > 3,4kHz så faller bruset lite till.

Har testat med ett analogt bandpassfilter (med spolar!) på ingången med 10-13kHz passband och
vid test med insignaler mellan 7-10kHz så gick det inte att höra något alls så undertryckningen
av oönskat sidband är god.

Testade att tappa av lite signal från sändaren som är beskriven i tråden tidigare och det
gick bra, frekvensen var så pass exakt så det vart inget "Kalle Anka-ljud".

Insignalen bör hållas konstant med någon form av AGC (Automatic Gain Control).
Dynamiken är inte +100dB precis, har mätt upp ca 66dB som är användbart men det
är ju bara första versionen av mjukvaran än så länge. Får se hur mycket det går att förbättra.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 23 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 4 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010