Bonjour,
Je souhaite échantillonner un signal audio à partir d'un microphone MAX9814 sur l'arduino DUE. Je souhaite configurer mon ADC manuellement pour pouvoir échantillonner le signal à 32kHz.
A partir de certain code trouver sur github j'ai conçu ce code:
volatile bool readyToSample = false;
volatile uint32_t adc_value;
void setup() {
Serial.begin(9600); // Initialiser le port série
// Configuration de l'ADC
pmc_enable_periph_clk(ID_ADC); // Activer l'horloge de l'ADC
ADC->ADC_CR = ADC_CR_SWRST; // Réinitialiser l'ADC
ADC->ADC_MR = 0x10300080; // Mode de l'ADC configuré pour utilisation normale
ADC->ADC_CHER = 0x80; // Activer le canal 7 (A0)
// Configuration du Timer pour générer une interruption à 32 kHz
pmc_set_writeprotect(false);
pmc_enable_periph_clk(TC3_IRQn);
TcChannel * t = &(TC1->TC_CHANNEL[0]);
t->TC_CCR = TC_CCR_CLKDIS;
t->TC_IDR = 0xFFFFFFFF;
t->TC_SR;
t->TC_CMR = TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1;
t->TC_RC = 42;
t->TC_IER = TC_IER_CPCS;
t->TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
NVIC_EnableIRQ(TC3_IRQn);
}
unsigned long lastPrintTime = 0;
void loop() {
if (readyToSample && millis() - lastPrintTime > 100) { // Imprimer toutes les 100 ms
Serial.println(adc_value); // Envoyer la valeur ADC au port série
readyToSample = false;
lastPrintTime = millis();
}
}
void TC3_Handler() {
TC1->TC_CHANNEL[0].TC_SR; // Nettoyer le statut register
adc_value = ADC->ADC_CDR[7]; // Lire directement le registre CDR pour le canal 7
readyToSample = true;
}
Je ne comprends pas pourquoi le TC_RC = 42. De ce que j'ai compris TC_RC = Fr horloge / Fr échantillonnage. TC_RC devrait être égal à 84MHZ / 32kHz = 1312.
Si vous avez d'autres corrections à apporter je suis preneur.
Je souhaiterai vérifier mon résultat à l'oscilloscope, est ce que vous avez des pistes pour configurer le DAC?
Merci d'avance