Digital SSB-modulator med dsPIC30F3012 [Radio]

Berätta om dina pågående projekt.
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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:
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.
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: Markera allt

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: Markera allt


; ..............................................................................
;    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: Markera allt

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: Markera allt

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: Markera allt

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.
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 )
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.... :!:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
gkar
Inlägg: 1453
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av gkar »

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å! :-)
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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/
Användarvisningsbild
hcb
Moderator
Inlägg: 5739
Blev medlem: 23 februari 2007, 21:44:50
Skype: hcbecker
Ort: Lystrup / Uppsala
Kontakt:

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av hcb »

Mycket intressant. :tumupp:
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av blueint »

Instämmer :tumupp:

Har du schema på den där kopplingen?
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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).
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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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.
SSB exciter.jpg
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.
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)
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

Tar med schemat också ifall någon är intresserad av att titta i det
(Och blir inspirerad av högfrekvensbyggen....) :)
SSB Exciter ver1.pdf
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
hcb
Moderator
Inlägg: 5739
Blev medlem: 23 februari 2007, 21:44:50
Skype: hcbecker
Ort: Lystrup / Uppsala
Kontakt:

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av hcb »

Mycket snyggt! Jag tackar för byggbeskrivningen och inspirationen.
Användarvisningsbild
Oskar
Inlägg: 1804
Blev medlem: 6 september 2005, 15:11:36
Ort: Storsjö, Sorsele

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av Oskar »

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 ...
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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".
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

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 ).
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av void »

YD1150 skrev:Tar med schemat också ifall någon är intresserad av att titta i det
(Och blir inspirerad av högfrekvensbyggen....) :)
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?
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

Stämmer bra att de är ritade med ExpressSCH och ExpressPCB, de fungerar
bra, saknar en del finesser men man kan inte få allt :)
Användarvisningsbild
YD1150
Inlägg: 1943
Blev medlem: 29 oktober 2010, 22:41:10

Re: Digital SSB-modulator med dsPIC30F3012 [Radio]

Inlägg av YD1150 »

Dags för lite tester av dsPIC som "mjukvaru"-mottagare.

Först ett blockschema över mjukvarudelen:
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:
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar