- Codice: Seleziona tutto
const int analogPin = A0; // Usa il pin A0 per la lettura analogica
// Variabili per memorizzare il valore massimo e minimo
int minValue = 4095; // Inizialmente impostato al massimo possibile per un ADC a 12 bit
int maxValue = 0; // Inizialmente impostato al minimo possibile
void setup() {
// Inizializza la comunicazione seriale per il monitoraggio
Serial.begin(115200);
// Configura l'ADC
configureADC();
}
void loop() {
// Leggi il valore analogico direttamente dall'ADC in modalità Free-Running
int analogValue = ADC->ADC_CDR[7]; // Leggi il valore dall'ADC Channel Data Register
// Controlla se il valore letto è valido
if (analogValue != 0) { // Assicurati che la lettura non sia 0
// Aggiorna il valore minimo se il valore corrente è più basso
if (analogValue < minValue) {
minValue = analogValue;
}
// Aggiorna il valore massimo se il valore corrente è più alto
if (analogValue > maxValue) {
maxValue = analogValue;
}
}
// Stampa i valori minimo e massimo
Serial.print("Min: ");
Serial.print(minValue);
Serial.print(" Max: ");
Serial.println(maxValue);
}
void configureADC() {
// Abilita l'ADC
pmc_enable_periph_clk(ID_ADC);
ADC->ADC_CR = ADC_CR_SWRST; // Reset dell'ADC
// Configura l'orologio per l'ADC
ADC->ADC_MR = ADC_MR_PRESCAL(1) | // Configura il prescaler per l'ADC
ADC_MR_STARTUP_SUT64 | // Tempo di startup
ADC_MR_FREERUN_ON | // Abilita la modalità Free-Running
ADC_MR_SETTLING_AST3; // Settling time
// Configura la risoluzione a 12 bit
ADC->ADC_MR &= ~ADC_MR_LOWRES;
// Abilita il canale 7 (A0) dell'ADC
ADC->ADC_CHER = ADC_CHER_CH7;
// Riabilita l'ADC
ADC->ADC_CR = ADC_CR_START;
}
i valori ottenuti sono:
Min: 468 Max: 3914
quindi sarebbe:
Gamma effettiva utilizzata: 3914 - 468 = 3446
Percentuale di utilizzo: (3446 / 4095) ∗ 100% = circa 84%
il foglio di calcolo che mi ha gentilmente fornito boiler, mi dava una percentuale teorica del 69%.
**Edit: pensandoci forse la mia percentuale non ha niente a che vedere con quella fornita dal foglio di calcolo, semplicemente non non riesco a sfruttare tutti i 3.3v, giusto ?
Quindi quell'errore si sommerebbe a quello del foglio di calcolo ?
Altra cosa che ho notato: il sensore è veramente sensibile, devo implementare un filtro bassa basso via codice per eliminare le vibrazioni che non mi interessano per i calcolo che devo fare, ma questo non è un problema, ho già fatto qualche prova e si aggira facilmente, con il senno di poi forse era meglio la versione dell'accelerometro a 5g, ma questa è una teoria tutta da verificare.