Visualizza messaggio singolo
Vecchio 23 agosto 12, 20:27   #2 (permalink)  Top
romoloman
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Thumbs up

Citazione:
Originalmente inviato da franz64 Visualizza messaggio
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.
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando