home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Elettronica Generale
Qui si parla di tutto....dall'analogico al digitale, dal software all'hardware, dal semplice crepuscolare al computer.


SDR e FM
     
Autore Messaggio opzioni
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
12.07.2021, alle ore 09:07
Il codice provvisoriamente è questo, per adesso i trenini viaggiano con la modulazione di ampiezza.
#include "fubit50Mhz32.c"//clock FRC w/PLL 8/2*24/2=48MHz, peripheral 48/1=48Mhz 
#define ledv _LATB4        //out RB4 pin11 led verde
#define ledr _LATA4        //out RA4 pin12 led rosso
int busp, busm, bucp, bucm;//campioni semionda più,meno,seno,coseno
int dis, dic; //differenza campioni seno,coseno
int qua, quap, ang; //quadrante,precedente,angolo
long int fas, fac;//filtro amplificato seno,coseno

int main(void) {
    //SYSKEY=0xAA996655;
    //SYSKEY=0x556699AA;
    //OSCTUNbits.TUN=-32;    //1:31cresce; -1:-32 decresce circa 10%
    //SYSKEY=0x33333333;
    //RPA2R=7;             // RPA2 pin9 tied to REFCLKO
    //REFOCONbits.ROSEL=7; //ref oscill out select from system PLL 
    //REFOCONbits.OE=1;    //ref oscill out enable 
    //REFOCONbits.RODIV=4; //ref oscill out 80/(2*4)=10MHz RPA2 pin9
    //REFOCONbits.ON=1;    //ref oscill module ON
    TRISB = 0b1111111111101111;       //out RB4 pin11 led verde
    TRISA = 0b1111111111101111;       //out RA4 pin12 led rosso
AD1CHSbits.CH0SA = 11;  //AN11 pin 24 input media frequenza
//AD1CHSbits.CH0NA =0    //Channel 0 negative input is VREFL 
//AD1CHSbits.CH0NA =1;   //Channel 0 negative input is AN1 
AD1CON1bits.SSRC=7;    //ADC1 module auto-convert
AD1CON3bits.SAMC = 5;  // SAMPLE TIME 5 ADC CK  
AD1CON3bits.ADCS = 1;  //ADC CK 48/2*(ADCS+1)=12MHz 12conv+5samp 706kS/s 1,4us
//AD1PCFG = 0b1111011111111111;  //AN11 pin24 analog vedi reference manual????
//AD1CSSLbits.CSSL9 = 1;           //AN9 pin26 select for scan 
//AD1CON2bits.CSCNA=0;     //do not scan inputs
AD1CON2bits.VCFG=3;    //VREFH=Vref+pin2 VREFL=Vref-pin3,obbligatorio oltre 5Mhz
AD1CON1bits.ADON=1;    //ADC1 module ON
PR1 = 480;             //periodo timer1 100 khz 
T1CONbits.TON = 1;     //timer1 run ON 
//T2CONbits.TON = 1;     //timer2 run ON 

prova:
while (TMR1<120) ;  
busp=ADC1BUF0;
AD1CON1bits.SAMP=1; 
dis=dis+busp-busm;
fas=fas+dis;
fas=fas-(fas>>4);
if(ang>0) { _LATA4=1; _LATB4=0; }
if(ang<0) { _LATA4=0; _LATB4=1; }

while (TMR1<240) ; 
bucp=ADC1BUF0;
AD1CON1bits.SAMP=1; 
dic=dic+bucp-bucm;
fac=fac+dic;
fac=fac-(fac>>4);
quap=qua;
if(fac>0 && fas>0) qua=1;
if(fac<0 && fas<0) qua=3;
if(fac>0 && fas<0) qua=4;
if(fac<0 && fas>0) qua=2;

while (TMR1<360) ;
busm=ADC1BUF0;
AD1CON1bits.SAMP=1; 
dis=busp-busm;
if(qua==1 && quap==4) 
{ ang++; goto quad; }
if(qua==4 && quap==1) 
{ ang--; goto quad; }
if(qua>quap) ang++;
if(qua<quap) ang--;
quad:

while (TMR1>=360) ;
bucm=ADC1BUF0;
AD1CON1bits.SAMP=1; 
dic=bucp-bucm;
if (ang!=-1) ang = ang-(ang>>2);
goto prova; }



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
double_wrap




una ogni 100 livelli
una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
12.07.2021, alle ore 18:26
pippodue:
[CUT]considerando cautelativamente una deviazione di frequenza di + o - 75kHz, ed un segnale modulante sinusoidale a 20 kHz, la deviazione di fase supererebbe di poco un angolo giro. [CUT]


Nella WFM monofonica la deviazione e' 75KHz, la modulante 15 KHz, quindi la banda e' di 180 KHz e l'indice di modulazione FM=5 (delta_Fport/F_mod), quindi (se ho letto bene il DeCastro) la massima deviazione di fase è di 5 radianti~266 gradi.
Nella WFM stereo la banda deve restare nei soliti 200 Khz statali, la modulante e' di 15+(38+15)KHz~53 Khz e l'indice di modulazione scende a 0,9, quindi sono 51 gradi.

Non sono andato oltre nella matematica (per me ormai abbastanza pesante) ma in alcuni esempi si cita un indice di modulazione 20 (ed una banda parecchio larga) con cui si fanno effettivamente piu' di 3 giri completi, 20 radianti di fase. Resto col dubbio irrisolto di come la si demoduli (a meno di usare la demodulazione in AM con due diodi sui fianchi della curva di due filtri) visto che arcoseni e arcotangenti sono funzioni polidrome (come già evidenziato da schottky) Di solito ci si limita a +/- PIGRECOMEZZI. Usando rivelatori in quadratura e ritardo servono le funzioni trigonometriche.

Tornando al saldatore fumante: nella tua applicazione ti serve una de/modulazione FM/PM analogica (modulante simil voce) oppure basta quella digitale tipo QPSK, ad esempio a 4 fasi distanziate di 90 gradi per avere due bytes per simbolo. In tal caso la rivelazione a <mappa> e' agevole usando i due segnali I(coseno) e Q(seno) che danno gia' il quadrante e quindi i simboli 00, 01, 11, 10.



"se peso cado, ma se cado non peso"
adamatj.altervista.org
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
12.07.2021, alle ore 18:59
Intanto molte grazie, quando avrò il PC a disposizione vorrei aggiungere qualcosa


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
13.07.2021, alle ore 10:00
Nella fonia, mantenere un indice di modulazione costante per tutte le frequenze della modulante comporta attenuare le frequenze più basse, giusto?
Per quanto riguarda la mia applicazione non ci sono problemi, i dati da trasmettere sono pochi e possiamo occupare tutta la banda che vogliamo, funziona già in AM e per passare alla FM la soluzione più semplice sarà quella che va bene.
Tornando alla demodulazione FM in generale, io ho capito questo:
Coi discriminatori analogici non abbiamo limiti di banda nè di fase
Coi discriminatori digitali, cioè basati su squadratori e porte logiche ma dotati di uno sfasatore analogico, sarebbe lo stesso discorso.
Una SDR invece fa soltanto calcoli numerici su campioni della portante modulata, o su campioni delle due sue componenti in quadratura se il frontend appartiene a un tipo capace di separarle già. A monte avviene una conversione (che vecchia parola!) per scendere a una media frequenza ragionevole. Rivelarne direttamente la frequenza, catturando i fronti, non mi sembra una strada percorribile in pratica, mentre si finisce per fare dei confronti fra le componenti e poi applicare delle funzioni circolari inverse. Queste funzioni circolari hanno carattere polidromo ma non mi sembra che un software che sia un minimo sofisticato avrebbe delle difficoltà a individuarne il valore corretto. La difficoltà è invece un'altra ed è l'enorme carico di istruzioni per la CPU. Il programmino che ho postato gira a 48 Mips senza fare uso di interrupt quindi senza salvataggio di registri con una portante a 100 kHz, discrimina appena il segno dello scostamento o poco più ed è già vicino alla saturazione. Però c'è anche da dire che la separazione delle componenti in questo caso viene fatta dallo stesso programma. Presumo che le SDR facciano uso di hardware dedicato, non so.



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
caccamo2





postato il:
13.07.2021, alle ore 13:05
pippodue:
caccamo2:
pezza con un passa basso

Il passa basso serve soltanto per tagliare la componente continua.

Mi spieghi come può un passa basso tagliare la continua? Caso mai un passa alto.
Ribadisco, fondamentale uno schema a blocchi, non il codice, uno schema perché siamo elettronici non informatici.




Never use ideal current sources in simulation
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
13.07.2021, alle ore 14:00
pippodue:
[ un inconveniente: basta un piccolissimo spostamento permanente di frequenza e l'angolo di fase rivelato andrà sicuramente in overflow. Per evitare ciò, al valore rivelato si applica un filtraggio taglia-basso del primo ordine che lo riporta verso lo zero e gli conferisce il carattere di una rivelazione di frequenza e non più di fase, entro la banda interessata dal taglio.

La selettività
Se arriva un segnale con una frequenza molto diversa da quella locale, quelle differenze fra i campioni, da cui ha preso inizio l'elaborazione, cambiano di segno più frequentemente. Filtrare tali differenze con una o più celle passa-basso equivale ad attenuare il segnale al di fuori di una certa banda passante.

Come vedi è taglia basso, non passa basso. Sono stato fuorviato da una successiva domanda. I passa basso ci sono pure ma servono per la selettività e operano separatamente sulle componenti, farò lo schema a blocchi



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
14.07.2021, alle ore 10:41
Nello schema a blocchi vengono cose strane tipo un selettore rotante a 4 posizioni e poi chissà che altro, per il momento lascio perdere.


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
caccamo2





postato il:
14.07.2021, alle ore 20:28
Ti sembra una cosa strana perché non sei abituato, vai avanti, i selettori disegnali cosi per semplificarti la vita

Spezza in diverse parti e poi fai un generale che li collega assieme, vedrai che solo disegnandolo lo capirai meglio anche tu.



Never use ideal current sources in simulation
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
18.07.2021, alle ore 09:46
gabe:
programma per demodulare il segnale:
https://github.com/ha7ilm/csdr

Questo programma è fatto per girare sul PC o su MCU o che?
Per me è una cosa del tutto nuova e non capisco come possa essere tanto portabile.
Personalmente, sul PC sono in grado di eseguire soltanto procedure di istallazione standard e sulle MCU non è che posso prendere un source o un .exe e farlo girare tal quale su qualsiasi hardware.



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
18.07.2021, alle ore 09:48
.hex


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 

 
 
indietro | homepage | torna su copyright © 2004/2021 GRIX.IT - La community dell'elettronica Amatoriale