Visualizza messaggio singolo
Vecchio 11 ottobre 11, 13:35   #7 (permalink)  Top
ElNonino
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Thumbs up

Prima l' hw: i fili che provengono dal potenziometro è bene che siano saldati sul c.s. il più vicino possibile ai piedini del PIC, quindi prossimi al pin del GND, Vcc, ed ingresso A/D; ciò per evitare di captare disturbi da (anelli di massa) ground-loop.

ed ecco un campione di codice che ho cercato di commentare al meglio, se non ti è chiaro chiedi:


Codice:

byte Tic    = 0,  // Contatore ciclo
     PunMMA = 0;  // Contatore puntatore tabella media mobile			


word ADrdAcc     = 0, // Buffer ultima lettura A/D converter
     Acc1A       = 0, // Valore media mobile
     Acc2A       = 0, // Accumulatore misura mediata
     VAlAcc      = 0, // Valore filtrato Acceleratore
     TabMMA[8] = {0}; // Tabella per media mobile



void MisAcc()
{
  ADCON0 = 0b00000001;        // Seleziona il canale Acceleratore
  Delay10TCYx(5);             // Ritardo per consentire la commutazione 
			      // ingresso A/D converter e stabilizzazione
  ADCON0bits.GO  = 1;         // Avvia la conversione A/D
  while(ADCON0bits.GO){}      // Attende la fine della conversione A/D
  ADrdAcc = ReadADC();        // Salva nel buffer il valore campionato
  PunMMA = (++PunMMA & 7);    // Incrementa il puntatore della tabella
		              // ciclandolo fra 0 -> 7, per altri valori
		              // sostituire con: ++PunMMA .... if(PunMMA == xx) PunMMA = 0;  
  Acc1A = Acc1A - TabMMA[PunMMA] + ADrdAcc; // Calcola la media mobile fra 8 (o xx) campionamenti
  TabMMA[PunMMA] = ADrdAcc;   // Aggiorna la media mobile con l'ultimo valore campionato
  Acc2A = Acc2A + Acc1A;      // Aggiorna il valore dell'accumulatore con l'ultima media
  ++Tic;                      // Incrementa il contatore ciclo
  if(Tic == 16)               // Media fra 16 valori filtrati
  {
    ValAcc = Acc2A / 16;      // Calcola il valore filtrato   Acceleratore (anche ValAcc = Acc2A >>4)
    Tic   = 0;                // Azzera il contatore ciclo
    Acc2A = 0;                // Azzera accumulatore 							 
  }
}
Ho letto ora 'Romoloman', condivido al 100% il consiglio ad usare un timer per le temporizzazioni precise del PWM in uscita.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando