Vai al contenuto
PLC Forum


Oscilloscopio Con Pic - Banda passante ridicola


aduri

Messaggi consigliati

Salve a tutti,

il mio obbiettivo è ottenere un oscilloscopio che lavori in modalità XY per fare un tracciacurve.

La parte analogica con visualizzazione su oscilloscopio è terminata.

Per l'oscilloscopio digitale ho utilizzato un PIC18F4550 con quarzo da 20MHz e GLCD 128x64 della Wintek mod. W12864A.

Sono riuscito a farlo funzionare ma ha una banda passante ridicola.

Ero partito da uno stralcio di codice trovato in rete per il 16F877A e quarzo da 4MHz ma era come si può immaginare ancora più lento.

Ho provato a mandare un segnale sinusoidale ma dopo pochi Hz, anche modificando (per ora via sw) il 'Sweep rate factor' non ottenevo miglioramenti.

Stavo pensando di bypassare la libreria dell'ADC facendone una dedicata per aumentare la velocità di campionamento ma non sò se basterà.

Credo che occorra lavorare anche sul sincronismo e sulle variabili (word anzichè float).

Qualche consiglio?

Io ho messo un pò di codice funzionante spero che possa essere da stimolo per uno sviluppo in comune.

Ho scelto questo pic perchè ha, da data sheet un campionamento più veloce rispetto all'877a e per l'USB per evoluzioni future.

ciao e grazie per l'aiuto

Antonio

program oscope_4550_20mhz 

'Microprocessor: 18F4550 
'Xtal 20MHz no PLL 
'pbaden=off 
'This program is designed to make a simple oscilloscope. 
'with GLCD W12864A 
'Mikrobasic 7.0.2 
'-------------------------------------------------------------------- 
symbol DDRA=TRISA 
symbol DDRB=TRISB 
symbol DDRC=TRISC 
symbol DDRD=TRISD 
symbol ControlPort=PortB 
symbol DataPort=PortD 
symbol Channel=0 

dim 
X as integer 
Y, K, Sr, Offset as float 
Xmin, Xmax, Ymin, Ymax as float 
XX, YY as short 
GLCD_VSize as byte 
GLCD_HSize as byte 

const   'for GLCD Wintek 128x64 W12864A 
cs1=2 
cs2=3 
rs=4 
rw=5 
rst=7 
en=6 

sub procedure Initialize 
ADCON1=0x0E 'A0 as analog input 
DDRA=0x01 'ADC on A0 
DDRB=0x00 
DDRC=0x00 
DDRD=0x00 
glcd_Init(ControlPort,cs1,cs2,rs,rw,rst,en,DataPort) 
Glcd_Fill(0) 'Clear display 
end sub 

main: 
Initialize 
'User defined 
'---------------------- 
GLCD_VSize=63 
GLCD_HSize=127 
Sr=1 'Sweep rate factor 
Xmin=0.0 
Ymin=0.0 
K=10.0 'ADC bits 
'---------------------- 

Xmax=float(GLCD_HSize)*Sr 
Offset=float (GLCD_VSize)/2.0 'Bottom of GLCD = 0V 
Ymax=pow (2.0, K)-1.0 'Top of GLCD = 5V 

Display: 
for X=integer(Xmin) to integer(Xmax) step 1 

Y=float(Adc_Read(Channel))+ Offset 

YY=short((float (GLCD_VSize)/(Ymax-Ymin))*(Ymin-Y)) 
XX=short((float (GLCD_HSize)/(Xmax-Xmin))*(float(X)-Xmin)) 
Glcd_Dot(XX,YY,1) 
next X 
Glcd_Fill(0) 
Goto Display 

end.

Link al commento
Condividi su altri siti


Memorizzando prima in ram è decisamente migliorato il campionamento ma la visualizzazione è un disastro.

Visualizza bene fino a 3Hz.

Display:
'carico in ram
for X=integer(Xmin) to integer(Xmax) step 1

    Y=float(Adc_Read(Channel))+ Offset

    YY=short((float (GLCD_VSize)/(Ymax-Ymin))*(Ymin-Y))
    YP[x]=YY
    XX=short((float (GLCD_HSize)/(Xmax-Xmin))*(float(X)-Xmin))
    XP[x]=XX

next X
'visualizzo su glcd
for X=integer(Xmin) to integer(Xmax) step 1

Glcd_Dot(XP[x],YP[x],1)

next X

Link al commento
Condividi su altri siti

La banda è delimitata dalla frequenza di campionamento. Il teorema di Shannon detta legge. La massima frequenza riproducibile vale fc/2-e, dove fc è la frequenza di campionamento dell'AD e "e" è un valore tendente a 0.

Per la riproduzione ti conviene memorizzare i dati campionati e presentarli con frequenza più bassa, oppure usare un altro dispositivo per pilotare il display.

Link al commento
Condividi su altri siti

Buongiorno,

Naturalmente come per gli oscilloscopi devi utilizzare un Trigger, ed alla presenza del Trigger si realizza il campionamento ... una volta terminato il campionamento si può visualizzare il tutto. Con questa tecnica si possono visualizzare segnali con frequenze molto maggiori di 3 Hz ...

L'esempio c'è in www.avelectron.com/avoscillo_it.html.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...