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.