Salve,sono uno studente di ingegneria e assolutamente un esordiente del mondo Arduino, quindi approfittando della vostra esperienza e gentilezza vorrei porre una domanda:
Ma la funzione loop in arduino una volta terminata al suo primo ciclo si mette in pausa fino a quando non si inizia un nuovo campionamento?
Cioè mi spiego, parte il primo loop e termina dopo 5ms (cioè il tempo di ciclo ipotizzato impiegato per compiere le mie istruzioni), dopo di chè va' in pausa e riparte un nuovo loop dopo ad esempio 15ms (se indico con 15ms un tempo arbitrario di campionamento)??
Grazie
No, la funzione loop viene eseguita in modo continuo.
Grazie per la risposta!
Quindi se nel loop ho poche istruzioni, in pratica succede che tale loop viene ripetuto diverse volte tra un campionamento e il successivo giusto?
Il mio scopo è implementare un anello di retroazione generico usando un PID e quindi volevo capire un po' come organizzarmi per sincronizzare acquisizioni, aggiornamenti delle uscite e via di scorrendo.
Non nascondo che sono un po' in difficoltà, perchè non saprei come effettuare un novo campionamento e simultaneamente aggiornare l'uscita all'attuatore ad ogni istante di campionamento!
Dovrei usare un deley?
Iociprovo:
Il mio scopo è implementare un anello di retroazione generico usando un PID
Se usi un PID è molto importante che venga eseguito con la corretta temporizzazione, un modo semplice è scriverlo sotto forma di funzione che viene richiamata dalla loop a intervalli regolari, questo si può fare tramite la millis(), però solo se è un ciclo lento, molti ms, altrimenti tocca ricorrere a tecniche più complesse come l'uso di un timer con il relativo interrupt.
Cioè la millis(), dovrei usarla ad inizio del loop per calcolarmi il tempo tra un ciclo e il precedente in modo da avere il Tempo intercorso tra una chiamata Pid e la precedente?
Una curiosita':
Se alla prima istruzione del loop ci metto un'acquisizione da sensore e null'altro, il loop successivo non puo' ripartire fino a quando trascorre Tc e quindi l'A/D rende disponibile una nuova acquisizione giusto?
Mentre se nel loop ci sono solo istruzioni banali senza acquisizioni da A/D allora il tempo di ciclo del loop è molto piu' rapido del Tc (sempre che nel loop ci siano poche istruzioni) è giusta come considerazione??
Lo so' che per il 90% di voi è banale, ma se non capisco questi meccanismi fare progetti senza capire cio' che è alla base! Grazie ancora
semplificando setup() e loop() vengono chiamate cosi:
int main()
{
setup();
while(1)
{
loop();
}
}
@
vbextreme grazie per la risposta, comunque si questo mi è chiaro, ma la mia ultima domanda era un po' differente, probabilmente la tua risposta si riferisce alle mie domande precedenti giusto? comunque grazie
Iociprovo:
Cioè la millis(), dovrei usarla ad inizio del loop per calcolarmi il tempo tra un ciclo e il precedente in modo da avere il Tempo intercorso tra una chiamata Pid e la precedente?
Esatto.
Se alla prima istruzione del loop ci metto un'acquisizione da sensore e null'altro, il loop successivo non puo' ripartire fino a quando trascorre Tc e quindi l'A/D rende disponibile una nuova acquisizione giusto?
La temporizzazione del ADC è gestita da Arduino in modo trasparente all'utente, lavora in modo one shot, semplicemente quando vai a leggere l'ADC il programma avvia la lettura, aspetta il completamento, circa 120 us, dopo di che continua con l'operazione seguente.
astrobeed sei davvero gentilissimo!
Quel 8,3KHz è la frequenza di campionamento quindi? No perchè sembrava fosse impossibile ottenerla 
Vediamo se ho definitivamente compreso:
Volendo ad ogni ciclo aggiornare l'uscita su uno dei pin Pwm con il risultato del PID e contemporaneamente fare una nuova acquisizione, quindi calcolo dell'errore attuale una struttura potrebbe essere questa?
Loop:
Lettura da ADC
Invio risultato PID del ciclo precedente sul pin PWM
Calcolo errore attuale
Calcolo PID
Memorizzazione del risultato PID
Aggiornamento dei dati in memoria
Chiaramente ora l'ho scritto in questo modo (senza usare la funzione come mi hai detto tu) solo per capire se scritte in questa sequenza le istruzioni, mi portano a raggiungere l'obiettivo di fare un nuovo campionamento e aggiornamento delle uscite in modo sinrono!
Iociprovo:
astrobeed sei davvero gentilissimo!
Quel 8,3KHz è la frequenza di campionamento quindi? No perchè sembrava fosse impossibile ottenerla 
Attenzione a non confondere la velocità di conversione del ADC con quella reale di campionamento, sono due cose distinte.
L'ADC di Arduino viene fatto lavorare con un tempo di acquisizione di poco meno 100us, se la memoria non mi inganna dovrebbero essere 96us, poi c'è il tempo per il setup del pin analogico e i tempi intermedi per richiamare la funzione che gestisce l'ADC e il ritorno dalla stessa, tutto questo ci porta ad un tempo complessivo di circa 120us.
Le cose vanno un pochino meglio se fai l'acquisizione sempre sullo stesso pin, risparmi svariati us per il cambio dell'ingresso, però oltre al tempo reale per gestire l'acquisizione del ADC c'è anche quello del ciclo dove fai le cose, ovvero quanto tempo ci mette la loop per eseguire tutte le operazioni presenti.
Se all'interno della loop() non fai nulla di pesante da gestire, non inserisci delle delay, ti puoi ritenere fortunato se riesci ad eseguire 2000-3000 cicli al secondo, ovvero nella migliore delle ipotesi la reale frequenza di campionamento con l'ADC sarà di 2-3 kHz, se non molto di meno.
astrobeed sei stato chiarissimo!!
Riguardo la sequenza delle operazioni va è giusto porre l'aggiornamento dell'uscita dopo la nuova acquisizione invece di porla alla fine del loop?