Utilizzando un dspic 30F4013 è possibile realizzare un analizzatore di spettro con display grafico. Il codice sorgente è riportato nel listato 1 ed è scritto per il compilatore mikroPascal di mikroelektronika. Il programma usa il canale 10 per l’acquisizione del dato analogico. In figura 1 il risultato visualizzato sul display grafico.
program spectrum_analyzer; uses FFTLib, BitReverseComplex, TwiddleFactors; var Samples : array[512] of word; absolute $1800; // Y data space Written : array[128] of word; freq : word; txt : string[5]; procedure InitAdc; begin ADPCFG := 0; ADCON1 := $00E0; // internal counter ends conversion ADCHS := 10; // connect RBxx/ANxx as CH10 input ADCSSL := 0; ADCON3 := $1F3F; // sample time = 31 Tad. ADCON2 := 0; ADCON1 := $83E0; // turn ADC ON, fractional result TRISB.10 := 1; end; procedure Init; var i: word; begin for i := 0 to 127 do begin Written[i] := 255; end; Glcd_Init(LATD.8, LATD.9, LATD.10, LATD.3, LATG.12, LATD.11, LATB); Glcd_Set_Font(@FontSystem5x8, 5, 8, 32); Glcd_Fill(0xAA); Delay_ms(500); Glcd_Fill(0x00); // clear screen InitAdc; txt := ‘ Hz’; Glcd_Write_Text(txt, 100, 0, 1); end; function Fract2Float(input: integer): real; begin if (input < 0) then input := - input; result := input/32768.; end; procedure WriteData; var Re, Im, tmpw, j, k, l, max : word; Rer, Imr, tmpR : real; begin ADPCFG := $FFFF; // PORTB is digital j := 2; k := 0; max := 0; freq := 0; while k <= 62 do begin re := Samples[j]; inc(j); im := Samples[j]; inc(j); Rer := Fract2Float(re); Imr := Fract2Float(im); tmpR := Rer * Rer; Rer := tmpR; tmpR := Imr * Imr; Imr := tmpR; tmpR := sqrt(Rer + Imr); Rer := tmpR*512.; re := Rer; re := re and $FF; if Re > 63 then re := Written[k-1]; // k = 0? if Re > max then begin max := re; freq := k; end; tmpw := Written[k]; if tmpw <> Re then begin l := 64 - tmpw; while l <= 63 do begin Glcd_Dot(k, l, 0); inc(l); end; l := 64 - Re; while l <= 63 do begin Glcd_Dot(k, l, 1); inc(l); end; Written[k] := Re; end; inc(k); end; end; function readadc: word; begin ADCON1.1 := 1; // start conversion while ADCON1.0 = 0 do nop; result := ADCBUF0; end; procedure SampleInput; var i: integer; begin // We use PORTB for GLCD as well, so we // have to set it to analogue input mode ADPCFG := $0000; TRISB.10 := 1; i :=0; while i <= 511 do begin Samples[i] := readadc; inc(i); Samples[i] := 0; inc(i); end; end; begin Init; while true do begin freq := 0; SampleInput; FFT(8, @TwiddleCoeff_256, Samples); BitReverseComplex(8, Samples); WriteData; freq := freq * 100; WordToStr(freq, txt); Glcd_Write_Text(txt, 70, 0, 1); end; end.
Listato 1 |

A livello di strumentazione l’analizzatore di spettro e’ da considerarsi abbastanza importante all’interno di un laboratorio. Con questo esempio viene messo in luce un progetto semplice low cost e il fatto che il goal e’ fare la FFT del segnale.