Discussione:
Sinusoide con PIC
(troppo vecchio per rispondere)
Vreg
2012-08-30 18:00:46 UTC
Permalink
Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.

Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.

Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
Ho già letto alcuni articoli su internet ma ho davvero molta confusione in
testa sul praticare tale tecnica e soprattutto nella creazione della Sine
Lookup Table.
Qualcuno può aiutarmi ?

Grazie fin da ora a chi mi legge.

Robby
Vreg
2012-08-30 18:02:35 UTC
Permalink
Per la parte hardware direi che non ci sono problemi: filtro PB, eventuale
R-2R ecc... mi mancano i concetti di logica/programmazione.
Grazie ancora.

Robby

"Vreg" ha scritto nel messaggio news:503faa4f$0$17955$***@reader1.news.tin.it...

Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.

Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.

Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
Ho già letto alcuni articoli su internet ma ho davvero molta confusione in
testa sul praticare tale tecnica e soprattutto nella creazione della Sine
Lookup Table.
Qualcuno può aiutarmi ?

Grazie fin da ora a chi mi legge.

Robby
Hexfet13
2012-08-30 20:48:30 UTC
Permalink
Post by Vreg
Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.
Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.
Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
[...]
Post by Vreg
Ho già letto alcuni articoli su internet ma ho davvero molta confusione in
testa sul praticare tale tecnica e soprattutto nella creazione della Sine
Lookup Table
Ciao,
diciamo che con il pwm si possono fare molte cose ma non tutto.
Se vuoi frequenze elevate e alto numero di bit allora abbandona il pwm; con un pic @4MHz e con un pwm a 16 bit riesci a generare segnali pwm con frequenza delle decine di Hz.

Piuttosto, puoi generare una tabella di valori binari (anche con excel) che rifletta la forma d'onda desiderata e il numero N di bit di risoluzione di cui necessiti; questa tabella la devi scrivere poi, preferibilmente nella parte flash del microcontrollore . Una volta che ti chei un contatore che scorra la tabella leggendone i valori hai praticamente fatto: basta che il valore letto o lo mandi ad un DAC oppure ad una rete R 2R usando N pin del micro.
Se conosci l'assembply dei pic puoi realizzare questo sintetizzatore senza troppi sforzi.
Vreg
2012-08-31 19:22:05 UTC
Permalink
Post by Hexfet13
Piuttosto, puoi generare una tabella di valori binari (anche con excel)
che rifletta la forma d'onda desiderata e il numero N di bit di risoluzione
di cui necessiti; questa tabella la devi >scrivere poi, preferibilmente
nella parte flash del microcontrollore . Una volta che ti chei un contatore
che scorra la tabella leggendone i valori hai praticamente fatto: basta che
il valore >letto o lo mandi ad un DAC oppure ad una rete R 2R usando N pin
del micro.
Se conosci l'assembply dei pic puoi realizzare questo sintetizzatore senza troppi sforzi.
Grazie per la risposta,
purtroppo sono i dati della tabella che non mi sono molto chiari e come
utilizzarli per ricreare la mia sinusoide, per esempio da 1 khz.

Grazie

Robby
Hexfet13
2012-08-31 23:03:07 UTC
Permalink
Post by Vreg
Post by Hexfet13
Piuttosto, puoi generare una tabella di valori binari (anche con excel)
che rifletta la forma d'onda desiderata e il numero N di bit di risoluzione
di cui necessiti; questa tabella la devi >scrivere poi, preferibilmente
nella parte flash del microcontrollore . Una volta che ti chei un contatore
che scorra la tabella leggendone i valori hai praticamente fatto: basta che
il valore >letto o lo mandi ad un DAC oppure ad una rete R 2R usando N pin
del micro.
Se conosci l'assembply dei pic puoi realizzare questo sintetizzatore senza
troppi sforzi.
Grazie per la risposta,
purtroppo sono i dati della tabella che non mi sono molto chiari e come
utilizzarli per ricreare la mia sinusoide, per esempio da 1 khz.
Grazie
Robby
Nell'esempio da 4 bit: dividi il periodo della sinusoide in 16 segmenti e, ad esempio, all'inizio di ognuno decidi di valutare l'ampiezza della tua sinusoide. Questo valore di tensione dovrà essere rappresentato a 4 bit.
Successivamente ottieni una tabella, che in realtà è una sola colonna composta da 16 righe dove ognuna contiene la tensione campionata della sinusoide.
Decidi poi il tempo di scansione della tabella, ad esempio 12.5us per valore, e cosi' in uscita dal tuo dac avrai la tua sinusoide con periodo di 200us cioè 5KHz. Se il tempo di scansione lo metti a 125us avrai invece una sinusoide a 500Hz.
La sinusoide che otterrai sarà molto grezza, tutta squadrettata, e andrà filtrata e, visto che usi campioni che hanno una frequenza di aggiornamento 16volte superiore rispetto alla sinusoide di 5KHz puoi fare un filtro passa basso con frequenza di taglio anche a 5KHz.
Se aumentassi il numero di bit, ad esempio 8, allora avresti una serie di 256 valori che compongono la tua sinusoide. Anche in questo caso, considerando la sinusoide a 5KHz da 256 valori,rispetto al tuo filtro passa basso da 5KHz lavori a frequenza 256volte maggiore e in uscita dal filtro avrai una sinusoide sicuramente migliore, piu' simile ad una sinusoide vera, che nel caso precedente con solo 16 livelli.
Se hai intenzione di realizzare il circuito con la sola alimentazione singola per ricavarti i valori dovrai scalare la sinusoide a VCC/2(da picco a picco) e sommargli VCC/2, cosicchè la tua sinusoide sia all'interno del range 0V...VCC.
Spero di esserti stato utile.
Vreg
2012-09-03 20:01:55 UTC
Permalink
Post by Hexfet13
Nell'esempio da 4 bit: dividi il periodo della sinusoide in 16 segmenti e,
ad esempio, all'inizio di ognuno decidi di valutare l'ampiezza della tua
sinusoide. Questo valore di tensione dovrà >essere rappresentato a 4 bit.
Esatto, quindi come ho scritto anche a Stefano , la tabella mi da i tempi
che deve avere una determinata tensione per creare la mia sinusoide ?
Post by Hexfet13
Spero di esserti stato utile.
Utilissimo. Grazie davvero!

Robby
MarKoZaKKa
2012-08-31 09:21:30 UTC
Permalink
Visto che hai interessi per i PIC e conosci "solo" il BASIC, dai
un'occhiata a questo progetto FREE:

pptea.altervista.org
Post by Vreg
utilizzando un PIC 16F876 o inferiore.
Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.
Vreg
2012-08-31 19:22:36 UTC
Permalink
Post by MarKoZaKKa
Visto che hai interessi per i PIC e conosci "solo" il BASIC, dai
pptea.altervista.org
Grazie per il link, guardo subito

Robby
SB
2012-08-31 15:14:07 UTC
Permalink
Post by Vreg
Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.
Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.
Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
Ho già letto alcuni articoli su internet ma ho davvero molta confusione in
testa sul praticare tale tecnica e soprattutto nella creazione della Sine
Lookup Table.
Per la creazione di una tabella in un vecchio messaggio avevo messo il listato
in QB per fare una Eprom con i valori di una sinusiode
:
http://goo.gl/SWUAa
Post by Vreg
Qualcuno può aiutarmi ?
Com un PWM potresti generare sinusiodi solo a frequenze molto basse,
meglio usare un DAC, anche una rete R-2R va bene, poi dai fuori i valori
sincronizzando il tutto con un timer, naturalmente a frequenza n*step.

In uscita dovrai aggiungere un filtro passa-basso per togliere i residui di alta
frequenza.



--
ciao
Stefano
Vreg
2012-08-31 19:19:34 UTC
Permalink
Post by SB
Per la creazione di una tabella in un vecchio messaggio avevo messo il listato
http://goo.gl/SWUAa
Grazie per la risposta.
Praticamente ammettiamo di dovere creare un'onda sinusoidale da 1 khz
utilizzando 4 resistenze da 1-2-3.9 e 8.2k all'uscita del PIC RC0,1,2,3 e un
filtro PB.
Ho trovato questo esempio su internet :
http://www.ke4nyv.com/picprojects.htm
( verso la fine della pagina ).

Utilizzando la tecnica DDS dovrei quindi calcolare i valori della sinusoide
e caricare i dati nella ROM .
Nel mio esempio ho un DAC costituito da 4 resistenze, quindi posso
ricostruire la sinusoide con 2^4 punti.
Prendendo come esempio la freq di 1 khz per prima cosa calcolo il periodo
che è 1/1000 = 0.001 sec o 1 ms
A questo punto se il mio DAC ricostruisce la sinusoide in 16 punti significa
che dovrò dare 1 valore ogni 0,001sec/16=62us
Se non ho capito male la tabella contenenti i valori della sinusoide servono
per dare il giusto livello e il tempo per ogni valore "16 nel mio caso" che
compone la sinusoide.
Ho capito bene o sono ancora sulla cattiva strada ?
Post by SB
Com un PWM potresti generare sinusiodi solo a frequenze molto basse,
meglio usare un DAC, anche una rete R-2R va bene, poi dai fuori i valori
sincronizzando il tutto con un timer, naturalmente a frequenza n*step.
Ok! Grazie
Post by SB
In uscita dovrai aggiungere un filtro passa-basso per togliere i residui di alta
frequenza.
Perfetto.

Grazie ancora
Robby
SB
2012-09-01 08:56:42 UTC
Permalink
Post by Vreg
Post by SB
Per la creazione di una tabella in un vecchio messaggio avevo messo il listato
http://goo.gl/SWUAa
Grazie per la risposta.
Praticamente ammettiamo di dovere creare un'onda sinusoidale da 1 khz
utilizzando 4 resistenze da 1-2-3.9 e 8.2k all'uscita del PIC RC0,1,2,3 e un
filtro PB.
http://www.ke4nyv.com/picprojects.htm
( verso la fine della pagina ).
La sinusoide che potresti ottenere con un convertitore a 4 bit come quello ha
una distorsione elevata e un residuo di alta frequenza altrettanto importante,
dal momento che la frequenza di commutazione è solo 16 volte quella della
sinusoide.

Poi può darsi che per i tuoi scopi vada bene, ma è bene che tu sappia che l'onda
che ricaveresti non è certo quella di un oscillatore.
Post by Vreg
Utilizzando la tecnica DDS dovrei quindi calcolare i valori della sinusoide
e caricare i dati nella ROM .
Nel mio esempio ho un DAC costituito da 4 resistenze, quindi posso
ricostruire la sinusoide con 2^4 punti.
Prendendo come esempio la freq di 1 khz per prima cosa calcolo il periodo
che è 1/1000 = 0.001 sec o 1 ms
A questo punto se il mio DAC ricostruisce la sinusoide in 16 punti significa
che dovrò dare 1 valore ogni 0,001sec/16=62us
Si, 16kHz = 62,5 µS
Post by Vreg
Se non ho capito male la tabella contenenti i valori della sinusoide servono
per dare il giusto livello e il tempo per ogni valore "16 nel mio caso" che
compone la sinusoide.
Ho capito bene o sono ancora sulla cattiva strada ?
Diciamo che i dati della tabella dovrebbero corrispondere al valore di una
sinusiode ideale in quel momento., come se tu disegnassi una forma d'onda per
punti, tipo l'esempio sul sito che hai linkato.

Credo che il disegno sul sito che traccia segmenti curvi per unire i punti della
sinusoide sia concettualmente sbagliato, in realtà i punti andrebbero uniti da
segmenti rettilinei, e se tu fai questa operazione capisci che 16 step sono
pochi e la forma d'onda in uscita non assomoglia a una sinusiode ideale ma forse
a un dente di sega.

Quindi avrai si una forma sinusoidale, ma con una distorsione armonica elevata.

Quello che può trasformare il segnale così ottenuto in una sinusoide è solo una
pesante filtratura in uscita, cosa accettabile se lavori a frequenza fissa, ma
non a frequenza variabile di qualche decade..


--
ciao
Stefano
Vreg
2012-09-03 19:59:49 UTC
Permalink
Ciao Stefano e grazie per le tue risposte.
In pratica la tabella serve per avere l'ampiezza e quindi la durata di una
determinata tensione che andrà a formare la mia sinusoide giusto ?

Alla fine devo creare 2 sinusoidi una a 1200hz e una a 2200hz per creare un
modem packet ax.25 a 1200bps.
E' a puro scopo hobbystico.
Una volta terminato il codice per creare le sinusoidi dovrò capire come
trasmettere a 1200 bps...vedremo :-)

Ciao!

Robby
mmm
2012-09-04 09:30:53 UTC
Permalink
Post by Vreg
Ciao Stefano e grazie per le tue risposte.
In pratica la tabella serve per avere l'ampiezza e quindi la durata di
una determinata tensione che andrà a formare la mia sinusoide giusto ?
Alla fine devo creare 2 sinusoidi una a 1200hz e una a 2200hz per creare
un modem packet ax.25 a 1200bps.
se lo scopo e' "solo" questo allora ti conviene generare onde quadre
alle due frequenze e filtrare con un filtro attivo, senza andarti ad
impelagare con la generazione analogica delle sinusoidi
magari se usi due pin distinti per i due segnali puoi utilizzare due
filtri attivi distinti ottimizzati per le due frequenze.
Post by Vreg
E' a puro scopo hobbystico.
Una volta terminato il codice per creare le sinusoidi dovrò capire come
trasmettere a 1200 bps...vedremo :-)
Ciao!
Robby
NNTP
2012-09-02 15:44:14 UTC
Permalink
Post by Vreg
Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.
Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.
Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
Ho già letto alcuni articoli su internet ma ho davvero molta confusione
in testa sul praticare tale tecnica e soprattutto nella creazione della
Sine Lookup Table.
Qualcuno può aiutarmi ?
Grazie fin da ora a chi mi legge.
Robby
Guardati questo sito ha una marea di utili esempi:
http://www.romanblack.com/
blisca
2012-09-03 12:41:37 UTC
Permalink
Post by Vreg
Ciao a tutti,
mi sarebbe piaciuto creare un'onda sinusoidale di freq. x compresa tra
500-5khz utilizzando un PIC 16F876 o inferiore.
Come linguaggio purtroppo conosco solo il basic e qualche elementare
istruzione assembler.
Ho letto che è possibile ricreare un' onda sinusoidale utilizzando la
tecnica DDS o PWM.
Ho già letto alcuni articoli su internet ma ho davvero molta confusione in
testa sul praticare tale tecnica e soprattutto nella creazione della Sine
Lookup Table.
Qualcuno può aiutarmi ?
Grazie fin da ora a chi mi legge.
Robby
dovresti però spiegare a cosa ti serve quella sinusoide,per capire quanti
bit di risoluzione ti servono
Vreg
2012-09-03 19:55:41 UTC
Permalink
"blisca" ha scritto
Post by blisca
dovresti però spiegare a cosa ti serve quella sinusoide,per capire quanti
bit di risoluzione ti servono
Devo creare 2 toni uno a 1200 hz e uno a 2200 hz per realizzare un modem
packet ax.25 a 1200bps.

Ciao!
Loading...