Ciao a tutti,
ho un dubbio su come implementare una conversione analogica-digitale usando un ADC interno al microcontrollore STM32 (non ha importanza quale nello specifico). Vorrei che la conversione avvenisse dopo X tempo dal fronte di salita di un segnale onda quadra periodico fornito esternamente. Per esempio, il segnale esterno si presenta ogni secondo e dopo ogni fronte di salita voglio che passati 200ms sia effettuato un campionamento con l'ADC.
Ho pensato di utilizzare un timer in modalità Input Capture triggerato dal fronte di salita del segnale esterno, in modo che il timer conti X tempo prima di generare un interrupt dove richiamare la conversione ADC, però non so se sia possibile. Qualche idea? Sto usando la libreria HAL.
ADC con trigger esterno in STM32
Moderatore: Paolino
8 messaggi
• Pagina 1 di 1
0
voti
Ciao,
Io per il momento, salvo sviste, lo vedo fattibile.
La cosa migliore è sempre procurarsi una evaluation board (le ST sono proprio economiche) e fare le dovute prove.

Andrea96 ha scritto:però non so se sia possibile
Io per il momento, salvo sviste, lo vedo fattibile.
La cosa migliore è sempre procurarsi una evaluation board (le ST sono proprio economiche) e fare le dovute prove.

0
voti
Io per il momento, salvo sviste, lo vedo fattibile.
Lo pensavo anche io, però mi sono accorto che in modalità Input Capture, dopo aver impostato il periodo, il timer agisce come un qualunque timer. Cioè, non inizia a contare sul fronte del segnale esterno, ma conta ciclicamente. Di conseguenza la callBack che utilizzo per avviare l'ADC viene richiamata ciclicamente ogni X tempo, a prescindere dal segnale esterno.
La cosa migliore è sempre procurarsi una evaluation board (le ST sono proprio economiche) e fare le dovute prove.
Uso una nucleo board con microcontrollore stm32f446
0
voti
Un'altra idea potrebbe essere quella di usare un timer normale azionato da un interrupt da GPIO (porta collegata al segnale esterno), dunque nella routine di interrupt potrei avviare il timer che conta X tempo, dunque nella routine di interrupt del timer (che avviene allo scadere del conteggio) fermo il timer (per evitare che ripeti il conteggio) e avvio l'ADC. Questa potrebbe essere un'altra soluzione, però mi piacerebbe sapere se c'è modo di farlo in Input Capture, senza scomodare gli interrupt da GPIO.
1
voti
Da quel che ricordo, il timer può essere inizializzato con GATE esterno, quindi conta solo in presenza di questo gate, raggiunto il trigger, lo riporti al valore dovuto per il nuovo conteggio
Per controllare ADC, credo so possa fare direttamente da hardware, prova a leggere qua, ma ci sono numerosi link sul web come "adc-timer-tirggering". Se non hai problemi di brevisisiimi ritardi, puoi sempre controllare ADC con interrupt.
Di solito, in fondo al manuale "reference" del tuo micro, ci sono le funzioni di controllo per il gate esterno del timer ed anche quelle di controllo dell'adc.
saluti.
Per controllare ADC, credo so possa fare direttamente da hardware, prova a leggere qua, ma ci sono numerosi link sul web come "adc-timer-tirggering". Se non hai problemi di brevisisiimi ritardi, puoi sempre controllare ADC con interrupt.
Di solito, in fondo al manuale "reference" del tuo micro, ci sono le funzioni di controllo per il gate esterno del timer ed anche quelle di controllo dell'adc.
saluti.
-
lelerelele
4.337 3 7 9 - Master
- Messaggi: 4990
- Iscritto il: 8 giu 2011, 8:57
- Località: Reggio Emilia
0
voti
Penso che ci vogliano due interrupt, il segnale esterno fa partire un timer e poi lo stesso timer fa partire lo ADC. Non otterrai una temporizzazione esattissima, se qualcuno trova un rimedio resto in ascolto.
PostScriptum input capture serve per copiare in un registro il contenuto del timer appena arriva il segnale esterno.
PostScriptum input capture serve per copiare in un registro il contenuto del timer appena arriva il segnale esterno.
0
voti
Andrea96 ha scritto:Un'altra idea potrebbe essere quella di usare un timer normale azionato da un interrupt da GPIO (...)
Se hai bisogno di agire solo su un fronte allora questa è molto probabilmente la soluzione più veloce.
Avrai un piccolo ritardo addizionale dovuto all'esecuzione dell'istruzione per attivare il timer ed avviare l'ADC, che comunque puoi ovviare in qualche giocando con l'intervallo del timer...
Altra possible soluzione è usare il DMA in double buffered mode e giocare con i threshold della FIFO in base al ritardo richiesto. Si tratterebbe solo di contare le interrupt necessarie per poi processare quello che devi dei dati acquisiti con l'ADC. È una idea che mi è venuta adesso mentre scrivevo..

0
voti
Se i dati che hai fornito come esempio sono quelli effettivi puoi risolvere in modo moooooolto semplice
Se i 200ms sono indicativi e non tassativi potrebbero essere 205ms oppure 210ms io farei le cose senza scomodare interrupt
Non voglio aggiungere cose inutili meglio prima sapere come vanno considerati quei tempi
Se i 200ms sono indicativi e non tassativi potrebbero essere 205ms oppure 210ms io farei le cose senza scomodare interrupt
Non voglio aggiungere cose inutili meglio prima sapere come vanno considerati quei tempi
-
luxinterior
4.097 3 4 9 - Master
- Messaggi: 2590
- Iscritto il: 6 gen 2016, 17:48
8 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 25 ospiti