|
|
|
||||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
oscilloscopio con glcd pic 16f887a
rieccomi qui.
allora pensavo di poter usare il display glcd ed un pic per creare un oscilloscopio portatile, naturalmente non predento che sia preciso al 100% pero vorri provare in modo tale anche da approfondire la programmazione dei pic. come idea mi e' venuta questa: Codice:
program prova_oscilloscopio
dim valore as word
dim mio as byte
dim tempo as byte
dim flag as byte
sub procedure interrupt
if TestBit(INTCON,2) ' qunado tmro è owerflow
Inc(tempo) 'incrementa il flag tempo
TMR0 = 255 'ricarica 255 in tmro
ClearBit(INTOCN,2) 'resetta il bit 2 del reg. intcon
end if
end sub
main:
mio = 0
tempo = 0
INTCON = $A0
OPTION_REG = $84
ADCON1 = $82
TRISA = $FF
TMR0 = 255
Glcd_Init(PORTB, 0, 1, 2, 3, 5, 4,PORTD)
Glcd_Fill(0)
while true
valore = ADC_Read(2)
mio = valore / 4
Glcd_Dot(tempo, mio, 1)
if (tempo = 127) then ' quando tempo arriva a fine schermo
tempo = 0 ' ricomincia da 0 e cancella lo schermo
Glcd_Fill(0)
end if
wend
end.
una cosa che ancora non riesco a fare è la seguente. il display glcd parte da 0 a 64 per y, e 0-127 per x. ora lo zero si trova in alto a sinistra. cosi com'e' il valore della tensione (y) parte da sopra scende quando il valore aumenta. come posso fare per avere la situazione contraria?? y=0 lato basso sinistra |
|
|
|
|
|
#2 |
|
Registered User
|
Amico! se non riesci a fare un complemento ti stai cacciando in cose più grandi di te.
__________________
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
#3 |
|
Registered User
|
me lo dicono tutti che mi caccio in cose piu grosse di me ma alla fine le faccio e spero che questa volta non sia l'eccezione.
ma scusa la mia ignoranza, il complemento non serve per invertire il segno di un numero binario? puoi spiegarmi meglio? per il resto trovi l'idea buona o da scartare?? Ultima Modifica di drake : 14-04-2009 13.27.14. |
|
|
|
|
|
#4 | |
|
Registered User
|
Quote:
Per quanto riguarda l'idea; mi sembra buona per imparare, approfondire ed avere anche degli "effetti speciali" anche se non potrai salire molto con la frequenza vista la lentezza intrinseca dei PIC.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
|
#5 |
|
Registered User
|
la mia idea infatti è soprattutto per imparare ad usare i pic. naturalmente sempre farlo con un risultato buono e soddisfacente.
secondo te fino a che frequenza posso arrivare? a me per ora basterrebbe anche avere una buona precisione fino a 1mhz |
|
|
|
|
|
#7 |
|
Registered User
|
Mi sono fatto un paio di calcoli, solo per aspettare che l'adc converta ci vogliono 20 istruzioni del pic se va a 20mhz (anche se dipende dalla temperatura).
Quindi potresti avere il segnale giusto dopo questo tempo (circa) e andresti a 1mhz poi puoi scriverlo sul glcd aspettando la prossima conversione |
|
|
|
|
|
#8 |
|
Registered User
|
Il tempo di conversione @20MHz è di 1,6uS aggiungendo qualche altra istruzione per memorizzare in un buffer e controllare l'A/D probabilmente riesci ad ottenere un periodo di campionamento di circa 3uS.
Considera che per visualizzare decentemente una forma d'onda servono almeno 10 campioni. In ogni caso questi sono giocattoli. Pure io ci avevo giocato tempo fa; ma con un display alfanumerico 2x16 Poor Man's Oscilloscope - MEL PICBASIC Forum |
|
|
|
|
|
#9 |
|
Registered User
|
se guardi sul datasheet del pic di drake vedi che il tempo di conversione è 2uS+x che è una variabile in base alla temperatura.
Io ho stimato 3/4uS che (con 4uS e 20Mhz) fanno 20 cicli. Comunque penso che un A/D a 8bit basti per fare un oscilloscopio con un pic e un piccolo lcd. Anche perchè lavorare a 10bit (dell'A/D) con un processore a 8 sarebbe alquanto scomodo |
|
|
|
|
|
#10 |
|
Registered User
|
ho visto il tuo oscilloscopio complimenti ,a me per ora basterebbe riuscire a visulaizzare la forma d'onda, non è che potresti postare il listato per dargli un occhiata?? naturalmente lo studierei solo
Ultima Modifica di drake : 15-04-2009 12.19.26. |
|
|
|
|
|
#11 | |
|
Registered User
|
Quote:
After the analog input channel is selected (or changed),an A/D acquisition must be done before the conversion can be started. Se non si cambia canale non è necessario; ed è sufficiente considerare il tempo di conversione. Il sorgente in pic basic è disponibile come allegato nel link suindicato. |
|
|
|
|
|
|
#13 |
|
Registered User
|
A me pare che il tempo minimo di conversione sia 11xTADmin=17,6us, ossia 56,8 kHz. Seguendo i noti teoremi al massimo puoi visualizzare un segnale alla metà di questa frequenza, ossia 28,4 kHz. Questo ovviamente non tenendo conto che ci vuole un po' di tempo anche per trasferire i dati in un buffer, e ancora di più se la memoria non ti basta e devi accedere a una esterna.
|
|
|
|
|
|
#15 |
|
Registered User
|
ok allora la frequenza massima che potrò visualizzare sarà di 50khz, up po pochina ma per cominciare andra più che bene.
dopo aver provato il programma sul display vedo la forma d'onda ma con una scansione sul display troppo veloce. per ovviare a questo problema avevo pensato di impostare cosi il ragionamento. mi creo un buffer con 127 locazione( la lunghezza del display). ogni tot. millisecondi copio il valore di tensione in questo buffer. arrivato alla 127 locazione visualizzo il buffer sul display con un ciclo for....next. visualizzata la forma d'onda ricomincio da capo. in questo modo credo di riuscire a vedere l'onda anche se la visualizzazione non sarà continua . cosa ne pensate??? ripeto il mio intento non è quello di creare un oscilloscopio vero e propio, ma imparare ed imparare. una volta che riuscirò a visualizzare la forma dopo porto anche regolare il tempo di scansione, frequenza, naturalmente una cosa alla volta ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
|
|
|
#16 |
|
Registered User
|
Non ci siamo, se campioni a 50 kHz tra i tuoi dati ci saranno segnali al massimo a 25 kHz, ma con due campioni per periodo non ti consiglio di visualizzarli. Se fai delle elaborazioni numeriche interpolando con la funzione sinc() migliori di sicuro la traccia, ma scordati di vedere niente di decente sopra i 10-15 kHz.
I trasferimenti vanno fatti alla frequenza di campionamento, ossia ogni 17,6 us. Hai mai usato un oscilloscopio? Se si ti ricorderai che una delle regolazioni più importanti è la sincronia: in pratica devi fare in modo che ogni volta che disegni una traccia questa parta dalla stessa posizione nello schermo, altrimenti vedi solo porcherie; devi trovare il punto esatto in cui il segnale passa per un livello predeterminato e con una certa pendenza, e iniziare la visualizzazione da lì; va da se che se hai un buffer video di X punti devi salvarne molti di più, in modo che anche il segnale a frequenza minima possa avere X punti campionati dopo il trigger. Comunque se cerchi oscilloscopio dovresti trovare il principio di funzionamento spiegato per bene. |
|
|
|
|
|
#17 |
|
Registered User
|
faccio un esempio di quello che intendo.
mettiamo caso di avere un onda a 50hz con dutycicle 50%. 1/50hz = 0,02 secondi = 20ms 10 ms on-----10ms off. il buffer con il suo contenuto (tensione onda) viene incrementato ogni 2ms. arrivato a 127 comincio a disegnare il contenuto del buffer, ad esempio ogni locazione ogni 100ms.cosi dovrei avere il disegno dell'onda con delle linee che rappresentato l'onda con linee di 5punti (10ms=2ms*5punti) fatto questo potrei aspettare che il valore di tensione sia zero e ricominciare la memorizzazione nel buffer. la funzione sic() ?????? |
|
|
|
|
|
#18 |
|
Registered User
|
Devi comunque partire dallo stesso livello, che deve essere impostabile. A ogni campionamento (meglio a frequenza maggiore della base tempi) vedi se hai incrociato il livello di trigger, ad esempio 127, in salita; se si inizi col tuo algoritmo.
La questione del filtro si pone per lo più ad alta frequenza (vicino a Fs/2): la funzione sinc(x) è l'antitrasformata di un filtro passa basso ideale. |
|
|
|
|
|
#20 |
|
Registered User
|
LCD Oscilloscope for Spectrum Analyzers
A me è stato utilissimo per realizzare un'analizzatore panoramico IF, ovviamente è ridotto all'essenziale e penso potrai convertirlo in oscilloscopio per BF. |
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|