MECCANICA e DINTORNI
http://meccanicaedintorni.morpel.it/phpbb/

Campionamento ADC canali 0 - 1 - 2 - 3
http://meccanicaedintorni.morpel.it/phpbb/viewtopic.php?f=77&t=4675
Pagina 1 di 1

Autore:  Raban [ mar dic 14, 2010 12:38 ]
Oggetto del messaggio:  Campionamento ADC canali 0 - 1 - 2 - 3

Dunque il problema e' questo , normalmente campiono in continuo il canale 0 e scrivo il risultato nel buffer FIFO dell'ADC .
Al riempimento del buffer ( quarto campione ) l'interrupt di scrittura del quarto campione mi richiama la Routine di retroazione della corrente , tutto questo avviene all'incirca a 44khz di velocita' .

Ogni tanto pero' dovro' andare a leggere anche i canali 1 , 2 e 3 che sono rispettivamente due temperature ed il valore del potenziomentro di un eventuale pedale .

Se ogni tot cicli di retroazione scambio canale per andare a leggere uno di questi valori , in che stato sara' il mio buffer essendo che il campionamento e la conversione avviene in continuo ?

Cerco di spiegarmi meglio , non e' che magari mi trovo con un buffer in cui un valore deriva dal canale 0 e i successivi dal canale 1 ?

Autore:  Bit79 [ mer dic 15, 2010 21:02 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Sottomano non ho gli appunti dell'adc della serie 18, casomai guardo con più calma in laboratorio.
Se abiliti la conversione sequenziale di più canali, con il fifo abilitato, i risultati ti vanno comunque nel fifo. Ovvio che nel fifo ci saranno i risultati di tutti i canali abilitati (1, 2 o 4), quindi devi stare attento alla gestione.
Ti conviene, nel momento in cui vuoi campionare gli altri canali, resettare l'adc (che mentre esegui la routine di interrupt ha già ricominciato a lavorare) e vuotare il fifo, abilitanto nuovamente l'adc con la conversione che ti serve (es, 2 o 4 canali).
Alla successiva interrupt leggi i risultati (li troverai in sequenza nel fifo) e ripeti l'operazione di reset, riabilitando l'adc con un canale singolo.

Io facevo una cosa del genere, poichè campionavo sempre 4 canali (con i risultati inseriti nel fifo) e ogni tanto dovevo campionare gli altri 4.

Casomai ti mando la routine, se mi scordo rimettimelo in mente.

Ciao!

Autore:  Raban [ mer dic 15, 2010 21:40 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

e' abbastanza chiaro , l'unica cosa che mi rimane da capire e' come resettare l'adc e il fifo .
per il fifo credo sia sufficente leggere i 4 valori ... per resettare l'adc invece ?

Autore:  Bit79 [ gio dic 16, 2010 20:54 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Si, per il fifo basta leggerne i valori, ma bisogna fare attenzione che l'adc nel frattempo non ci scriva su. Quindi prima bisogna disattivare l'adc, leggere il fifo, preparare le impostazioni per la nuova lettura e riattivare l'adc.

Però mi sono dimenticato di prendere le routine in laboratorio... spero di ricordarmelo domani. Così posso essere più preciso.

Ciao!

Autore:  Bit79 [ ven dic 17, 2010 10:43 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Ecco un po' di appunti.
Il mio caso è leggermente diverso dal tuo, io infatti campionavo 4 canali in sequenza, e ogni tanto dovevo campionare gli altri 4 canali. Comunque, a parte il cambiare l'impostazione degli ingresso ogni volta, dovrebbe essere lo stesso.

Cominciamo con le impostazioni generiche dell'adc:

;*************************** impostazioni adc **********************************************
;impostazione ingressi analogici
MOVLW b'11111111'
MOVWF ANSEL0 ;ingressi A0 A1 A2 A3 A4 A5 E0 E1 analogici

;conversione single-shot, sequence 4 channel
;abilitazione modulo adc
MOVLW b'00010101'
MOVWF ADCON0

;+Vref=Vdd -Vref=Vss
;buffer fifo abilitato
MOVLW b'00010000'
MOVWF ADCON1

;right justified (qui vedi come ti serve)
;delay 6Tad (qui vedi come ti serve, comunque io lavoravo a 40 MHz)
;clock: Fosc/32 (qui vedi come ti serve, comunque io lavoravo a 40 MHz)
MOVLW b'10011010'
MOVWF ADCON2

;interrupt ogni valore campionato non serve per modalità single shot (io uso questa, vedi se ti va bene, con il continuos mi pare che avevo problemi di accavallamento valori nel fifo)
;trigger disabilitati
MOVLW b'00000000'
MOVWF ADCON3

;interrupt adc
BCF PIR1,ADIF ;reset interrupt adc
BSF PIE1,ADIE ;abilitazione interrupt adc

CALL IMPOSTACANALI ;selezione canali da campionare
BSF ADCON0,GO_DONE ;adc on (avvio conversione)

;**************************************************************************************

E questa è la gestione dell'interrupt:

;**************************** interrupt adc ***********************************************

ADC_INT:
;interrupt gestione risultati adc
BCF PIR1,ADIF ;reset interrupt adc

;ciclo gestione 4 risultati
CIC_LETT_ADC:
;lettura indirizzo FIFO (mi serve per sapere quale canale sto leggendo, perchè io li gestisco a ciclo... se tu li leggi singolarmente 4 volte non ti serve leggere l'indirizzo)
MOVF ADCON1,W ;prelievo indirizzo canale FIFO
SUBLW 0xFF ;complemento indirizzo (11 è il canale 0)
ANDLW b'00000011' ;mascheratura bit ADPNT1 ADPNT0
MOVWF ADC_PNTR ;salvataggio indirizzom FIFO

;lettura valore (va letta prima la parte alta, quando leggo la parte bassa viene incrementato il puntatore del fifo)
MOVF ADRESH,W ;prelievo risultato adc
MOVWF R1 ;salvo il risultato
MOVF ADRESL,W ;prelievo risultato adc
MOVWF R0 ;salvo il risultato

[........] ;routine di utilizzo risultato (testi il bit che ti dice quali canali hai campionato, così sai cosa fare con i valori)

;controllo buffer vuoto (controllo di aver letto tutto il FIFO, e continuo fino a quando non è vuoto)
(se hai fatto 4 letture fisse, non a ciclo come me, puoi controllare di aver vuotato correttamente il FIFO)
BTFSS ADCON1,BFEMT
GOTO CIC_LETT_ADC ;ciclo lettura gruppo di 4 canali

(qui, prima di riattivare l'adc, puoi modificare le impostazioni dei canali da campionare)
(ovviamente imposterai opportunamente il bit che ti dice che canali stai campionando, per la successiva gestione dei risultati)
BSF ADCON0,GO_DONE ;riattivo manualmente l'adc
GOTO FINEINT ;fine routine


;**************************************************************************************

;**************************** routine impostazioni canali **************************************
(qui tu dovrai anche cambiare tra sequenza di 4 canali diversi e sequenza di 4 campionamenti dello stesso canale)

IMPOSTACANALE: (primo gruppo)
BSF rif_sample ;set bit campionamento riferimento (serve per ricordarmi cosa sto campionando)
;assegnazione ingressi - gruppi per lettura ingressi di riferimento:
;gruppo A:an4
;gruppo B:an5
;gruppo C:an6
;gruppo D:an7
MOVLW b'01010101'
MOVWF ADCHS
RETURN

IMPOSTACANALE: (primo gruppo)
BCF rif_sample ;reset bit campionamento riferimento (serve per ricordarmi cosa sto campionando)
;assegnazione ingressi - gruppi per lettura tensioni:
;gruppo A:an0
;gruppo B:an1
;gruppo C:an2
;gruppo D:an3
MOVLW b'00000000'
MOVWF ADCHS
RETURN

;**************************************************************************************

Autore:  McMax [ ven dic 17, 2010 10:56 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Grazie Bit!
Adesso vedi come smadonna il Raban per tradurre dall'assembler ! :rotfl:

Autore:  Raban [ ven dic 17, 2010 20:51 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

ue' guarda che da piccolo giocavo col SoftIce... non vorrai mica che mi perdo su due righe di asm... :cannabis:

Autore:  Bit79 [ ven dic 17, 2010 20:57 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Io parlo solo quello quando si tratta di cose che devono funzionare... e AWL nei plc.

Autore:  Raban [ lun ago 15, 2011 16:59 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Sistemata lettura canali adc , ora leggo il sensore di corrente a 68 khz , faccio la retroazione
a 17 khz 8 bit sulla media di 4 campioni e leggo 2 temperature e un potenziometro a 66 hz circa .

Autore:  McMax [ mar ago 16, 2011 09:32 ]
Oggetto del messaggio:  Re: Campionamento ADC canali 0 - 1 - 2 - 3

Mi sembra ottimo! Bene!

Pagina 1 di 1 Tutti gli orari sono UTC +1 ora
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/