Citazione:
Originalmente inviato da franz64 Salve a tutti,
stò interfacciando una bussola elettronica compensata modello CMPS10 ad un micro Arduino e non riesco a risolvere un problema. Premetto che il micro e il sensore dialogano perfettamente e riesco a vedere a monitor i gradi inviati dalla bussola.
La mia necessità è di poter contare il numero di giri che il velivolo dove è installata la bussola può fare. La bussola invia un dato che va da 0 a 359 gradi; quando però viene completato un giro no so come memorizzare questo dato stessa cosa quando da un giro compiutosi passa ad uno parziale. In parole povere io vorrei avere un contatore che si incrementa ogni volta che da 359 si passa a 0 e si decrementa quando da 0 si passa a 359. Ringrazio anticipatamente tutti.
Francesco |
Il discorso è semplice e complesso allo stesso tempo...
suppongo tu abbia una funzione "leggibussola" chiamata da qualche interrupt
Codice:
int16_t giri=0;
void leggibussola() {
static int16_t oldheading=-1;
int16_t actualheading=gpsheading(); //gpsheading la funzione che legge l'heading
if (oldheading!=-1) {
if ((oldheading-actualheading)>350) {
giri++;
} else if ((actualheading-oldheading)>350) {
giri--;
}
} else {
// inizializziamo la direzione iniziale
oldheading=actualheading;
}
oldheading=actualheading;
}
Tuttavia il codice sopra ha problemi di possibili rimbalzi attorno allo 0
allora è possibile aggirare il problema vedendo se si è passati almeno per i 180.
Codice:
#define false=0
#define true=1
int16_t giri=0;
void leggibussola() {
static int16_t oldheading=-1;
static bool thru180=false;
int16_t actualheading=gpsheading(); //gpsheading la funzione che legge l'heading
if (actualheading>120 && actualheading<<240) {
thru180=true;
}
if (oldheading!=-1) {
if (((oldheading-actualheading)>350) & thru180) {
giri++;
thru180=false;
} else if (((actualheading-oldheading)>350) && thru180) {
giri--;
thru180=false;
}
} else {
// inizializziamo la direzione iniziale
oldheading=actualheading;
}
// aggiorniamo la posizione precedente
oldheading=actualheading;
}
E' scritto in pseudo C ma non dovrebbe essere difficile adattarlo ad arduino.