Mode burst analogique

Bonjour, Quelqu'un aurait il un exemple à me passer pour utiliser le mode burst sur les entrées analogiques. Je suis sur une arduino Due. Cordialement

Quelle signification donnes tu au mot "burst" ?

Pour moi le mode "burst" c'est un mode "rafale". C'est à dire que l'information arrive par paquets et qu'entre deux paquets il ne se passe rien. L'application que je connais concerne la transmission de données numériques où il faut récupérer une horloge à partir du seul train de données. Deux techniques existent : le mode "burst" qui est très délicat et le mode classique où quand aucune information n'est à transmettre on injecte des bits dits de bourrage, ce qui évite de désynchroniser les récepteurs : c'est le mode télécom.

Je ne vois pas en quoi consiste l'application en analogique.

En fait on m'a dit qu'il existait un mode qui lançait l'acquisition analogique sur une fréquence configurable et qui tournerait en parallèle du programme (indépendamment). Il suffirait ensuite de lire un registre où se trouverait la dernière valeur lue analogique. Ceci pour optimiser le temps de traitement d'une interruption.

Ok. L'information dont tu as besoin se trouve dans la datasheet du micro-controleur. Saches qu'une conversion Analogique/Digitale peut être déclenchée par plusieurs moyens dont par les "Timers" qui sont des blocs de logiques numériques câblés en dur dans la puce et indépendants des zones mémoires.

Ces "Timers" sont configurables et commandables par programmation. Tant qu'ils ne reçoivent pas l'ordre de s’arrêter ils vivent leur vie indépendamment du programme et ne le ralentisse en rien.

Toutes les informations détaillées se trouve dans la datasheet. A ma connaissance, mais je ne sais pas tout, il n'existe pas de bibliothèque toute faite pour cet usage particulier. Mais peut-être d'autres t'en indiqueront.

Comme 68tjs, autant je vois à peu près bien à quoi correspond le « mode burst » dans le cas du numérique, autant en analogique j'ai un peu de mal à saisir le concept.

Peut-être est-ce juste un problème de vocabulaire, ne serait-ce pas le mode « free running » du convertisseur analogique-numérique qui t'intéresse ? Autrement dit, le mode dans lequel l'ADC fait des conversions les unes à la suite des autres en permanence et te préviens via une interruption que tu peux aller lire un résultat dans le registre idoine ?

free run

Voila le mot que je cherchais et que je ne retrouvais pas.

Oui c'est bien ça que je cherchais. Donc pas de librairies. Je vais donc chercher dans la datasheet maintenant que j'ai le vrai nom. Sinon si quelqu'un a un exemple entre temps je suis preneur. Merci

Touf2638: Oui c'est bien ça que je cherchais. Donc pas de librairies. Je vais donc chercher dans la datasheet maintenant que j'ai le vrai nom. Sinon si quelqu'un a un exemple entre temps je suis preneur. Merci

bonjour un exemple d'application ici http://oscilloscopeexpress.blogspot.fr/ et un peu plus lumineux ici http://fftarduino.blogspot.fr/2011/02/color-organ-spectrum-analyzer-on.html

Lorsque je tente de configurer les registres du genre "ADCMR=", il ne reconnait pas le registre (sketch_jun26a:4: error: 'ADC_MR' was not declared in this scope). Faut-il un include special ?

Oups post trop rapide j'ai trouvé il faut mettre "ADC->ADC_MR =". Par contre je sais pas pourquoi ...

En lisant la datasheet et en regardant les registres page 1345, j'en comprends qu'une fois en mode FREERUN la convertisseur échantillonne à sa fréquence maximale. Dès qu'il a fini une conversion, il recommence soit environ 1Mhz à ce que j'ai vu dans d'autres forums. Je ne vois pas de registre pour mettre un PRESCALE. Existe t-il ? C'est juste pour info car de toute façon même s'il tourne à 1Mhz je récupère les valeurs sur une interruption.

Touf2638: En lisant la datasheet et en regardant les registres page 1345, j'en comprends qu'une fois en mode FREERUN la convertisseur échantillonne à sa fréquence maximale. Dès qu'il a fini une conversion, il recommence soit environ 1Mhz à ce que j'ai vu dans d'autres forums. Je ne vois pas de registre pour mettre un PRESCALE. Existe t-il ? C'est juste pour info car de toute façon même s'il tourne à 1Mhz je récupère les valeurs sur une interruption.

pour le prog oscillo c'est là

ADCSRA = 0x87; //default
  if ( fast == 1 ) ADCSRA = 0x87;   // turn on adc, freq  = 1/128,  125 kHz. 
  if ( fast == 2 ) ADCSRA = 0x87;   // turn on adc, freq  = 1/128,  125 kHz. 
  if ( fast == 3 ) ADCSRA = 0x86;   // turn on adc, freq  = 1/64,   250 kHz. 
  if ( fast == 4 ) ADCSRA = 0x85;   // turn on adc, freq  = 1/32,   500 kHz. 
  if ( fast == 5 ) ADCSRA = 0x84;   // turn on adc, freq  = 1/16 ,    1 MHz. 
  if ( fast == 6 ) ADCSRA = 0x83;   // turn on adc, freq  = 1/8,      2 MHz. 
  if ( fast == 7 ) ADCSRA = 0x82;   // turn on adc, freq  = 1/4,      4 MHz. 
  //  if ( fast == 8 ) ADCSRA = 0x81;   // turn on adc, freq  = 1/2,      8 MHz.

mais lire ça sur les perfs selon F° ech http://www.openmusiclabs.com/learning/digital/atmega-adc/

Oui j'ai vu mais ce registre ADCSRA ca doit être pas être sur une Due. Je le trouve pas en tout cas sur la datasheet. Ou alors ce serait le PRESCALE du ADC_MR mais je pense pas qu'il soit pris en compte en FREERUN

En lisant la datasheet et en regardant les registres page 1345, j'en comprends qu'une fois en mode FREERUN la convertisseur échantillonne à sa fréquence maximale. Dès qu'il a fini une conversion, il recommence soit environ 1Mhz à ce que j'ai vu dans d'autres forums. Je ne vois pas de registre pour mettre un PRESCALE. Existe t-il ?.

Euh, en regardant à nouveau cette page 1345 tu verra qu'il y a dans le registre ADC_MR un champ qui porte le doux nom de PRESCAL... je te laisse deviner à quoi il sert :)

Note que la fiche technique préconise de régler la fréquence d'horloge de l'ADC entre 1MHz et 20MHz (page 1414).

Touf2638: Oui j'ai vu mais ce registre ADCSRA ca doit être pas être sur une Due. Je le trouve pas en tout cas sur la datasheet. Ou alors ce serait le PRESCALE du ADC_MR mais je pense pas qu'il soit pris en compte en FREERUN

désolé , je n'avais pas tilté sur le fait que ce soit un DUE

Haifger, Es tu sûr que ce PRESCALE agit sur le FREERUN MODE. N'agit-il pas que lorsque l'on met le trigger sur timer ?

Touf2638:

Haifger, Es tu sûr que ce PRESCALE agit sur le FREERUN MODE. N’agit-il pas que lorsque l’on met le trigger sur timer ?

Ouaip, chuis sûr :slight_smile:

En fait, en relisant tes message j’ai l’impression que tu n’as pas bien compris le rôle de cette fréquence de l’ADC (et toutes mes excuses par avance s’il s’avère que c’est moi qui en fait n’a pas compris tes messages :slight_smile:

Donc : le convertisseur analogique-numérique utilise pour fonctionner une horloge (disons ADCclock) qui est synchronisée sur l’horloge principale (Mclock), mais le première est plus lente que la seconde, d’un facteur au minimum égal à 2 (p. 1332). C’est PRESCAL qui règle le facteur entre ces deux horloges.

Là ou je pense tu n’a pas compris, c’est que la fréquence que tu règle via PRESCAL n’est pas directement la fréquence des conversions, mais seulement celle de l’horloge. Or il faut plusieurs cycles de l’horloge ADCclock pour effectuer une conversion. Je n’ai pas encore suffisamment pratiqué le SAM3X pour être beaucoup plus précis, mais si on dit (au pif) qu’il faut 13 cycles pour effectuer une seule conversion (c’est le cas des AVR), alors la fréquence des conversions proprement dites est ADCclock/13, que tu sois en mode « free running » ou pas.

D’ailleurs, sur ce µc, et contrairement aux AVR, on peut modifier le nombre de cycles nécessaires à une conversion, notamment grâce aux champs TRANSFER, TRACKTIME, STARTUP (et j’en passe) de ADC_MR, voir notamment les graphes de la page 1333. Bien sûr tout ceci a (ou doit avoir) une influence sur la précision de la mesure.

Voilà, et toutes mes excuses si j’ai ré-expliquer des choses que tu connaissais déjà :slight_smile:

Autre question, normalement pour ecrire dans les registres cités, il faut retomber le WPEN du registre ADC_WPMR (datasheet p1345: This register can only be written if the WPEN bit is cleared in “ADC Write Protect Mode Register” on page 1365.) Je ne l'avais pas fait dans mon code et pourtant ça marchait. Quel est l'explication, environnement arduino ? Idem pour l'affectation des pins aux voies. Cela marche comme indiqué p1331 soit AD7 sur PA16(A0 de l'arduino) et AD6 sur PA24(A1 de l'arduino) Pourtant aucune modif de ma part sur le PIO CONTROLLER qui est sensé faire cette affectation (j'ai loupé un truc ?! :disappointed_relieved:).

void setup() 
{

//  int t=analogRead(0);

// Configuration free running adc 7 (pin A0)
  ADC->ADC_MR |= 0x80; // Mode FREERUN
  ADC->ADC_CR=2; // Demarrage convertisseur
  ADC->ADC_CHER=0xC0; // Activation voies 6 et 7 (A1 et A0)
  Serial.begin(115200);
}

void loop() 
{


  Serial.println(ADC->ADC_CDR[6]); 
  Serial.println(ADC->ADC_CDR[7]); 
  Serial.println("____"); 
  delay(1000);
}

Non, Non c'est très bien expliqué Haifger, c'est moi qui n'avait pas compris (je galère un peu avec la datasheet XD). Et pour ma deuxieme question t'as une explication ?

Non désolé, comme je le disais plus haut je n'ai pas suffisamment pratiqué la Due pour répondre à ces questions. Mais de toute façon si ça fonctionne « tout seul » c'est soit que l'environnement Arduino l'a fait à l'insu de ton plein gré, soit qu'il s'agit des valeurs par défaut du micro (ce qui à mon avis est certainement le cas pour le mode de protection d'écriture des registres).