Go Down

Topic: [Reglé] Acceder au registre ADC_CWR (Read 146 times) previous topic - next topic

jeremy83270

Apr 18, 2020, 02:24 pm Last Edit: Apr 19, 2020, 01:43 pm by jeremy83270
Bonjour
Débutant avec Arduino mais maitrisant C
Nous fabriquons un Chronomètre pour moto avec un détecteur de champ électromagnétique

Chaque circuit possède des "bandes" sous l'asphalte qui génère un champ électromagnétique qui permet de chronométrer nos tours de piste avec un maximum de précision

Nous travaillons sur Arduino Due (grosse carte car nous n'allons pas faire que le chrono). Nous aurons aussi un inclinomètre pourra voir l'angle directe de la moto ainsi que les angles max de chaque coté et un enregistrement de l'angle en permanence pour le transcrire ensuite sur une courbe, un accéléromètre pour mesurer la force d'accélération et de freinage qui s'enregistre aussi pour être retranscrit sur une courbe, et un GPS pour la vitesse réelle avec enregistrement pour avoir une courbe.

Nous avons donc programmé notre chronomètre et avons notre détecteur de champ (Ref : SS41A chez RS)
Apres de longues recherches, nous avons finalement trouvé que nous devons travailler avec le registre ADC_CWR mais nous ne parvenons pas à y accéder et ne trouvons aucune information pour le faire.
Voici le lien vers la doc de l'Atmel ATSAM3X8E qui est sur la DUE, page 1348 pour ce que nous pensons être bon :
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf
Pourriez vous nous aider svp ?

Nous restons à l'affut pour vous répondre au plus vite et vous donner le plus d'infos possible si nécessaire
En vous remerciant GRANDEMENT d'avance

Jeremy et Remi

al1fch

#1
Apr 18, 2020, 03:08 pm Last Edit: Apr 18, 2020, 03:17 pm by al1fch
Bonjour et Bienvenue !

..... à l'affut... au mauvais endroit

Utilisez le lien 'Report to Moderator' por demander le déplacement du message à l'endroit défini dans les Règles du Forum , règles qu'il est important de lire en arrivant içi


lisez attentivement le titre de ce sous-forum


Observez les fils de discussion qui s'y trouvent et vous constaterez  qu'on y expose les réalisations terminées.


jeremy83270

#2
Apr 18, 2020, 03:36 pm Last Edit: Apr 18, 2020, 03:38 pm by jeremy83270
Excusez moi de cette erreur
Je vais le déplacer
Merci de votre amabilité !

BrUnO14200

Salut ! Beau projet .

Comment vas tu gérer le fait que certains circuits ont plus de bandes que d'autres ?

Tu roules avec quoi comme moto ?

Je piste en cbr pc40 !
Projet aquaponique  :https://forum.arduino.cc/index.php?topic=677286.msg4584918#new

jeremy83270

Salut
Je le gère en rajoutant une question
Je demande combien de passage sur bande pour compter 1 tour
Si par exemple il y a 2 intermédiaires, alors je compte 3 détections pour faire 1 tour
Idéalement il faudrait avoir une banque de données avec tous les circuits. mais pour mon niveau et mon niveau d'utilisation, ca suffira largement ! lol

Je suis sur CBR600RR PC37 2003 uniquement piste
Vive Honda haha

jfs

Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jeremy83270

Merci JFS
j'ai eu ma réponse sur la partie anglophone du forum
je vous la post dans le commentaire suivant, pour que l'on puisse retrouver la réponse pour les prochains qui chercheraient comme nous

jeremy83270

Code: [Select]
volatile boolean Flag;

void setup() {
  adc_setup();
}

void loop() {
if (Flag == true)
  {
    Flag = false;
  //Do something
  }
}
void adc_setup ()
{
  PMC->PMC_PCER1 |= PMC_PCER1_PID37;                    // ADC power ON
  ADC->ADC_CR = ADC_CR_SWRST;                           // Reset ADC
  ADC->ADC_MR |=  ADC_MR_FREERUN_ON                     // ADC in free running
                  | ADC_MR_LOWRES_BITS_12               // 12 bits resolution
                  | ADC_MR_PRESCAL(1)
                  | ADC_MR_SETTLING_AST3
                  | ADC_MR_TRACKTIM(10)
                  | ADC_MR_TRANSFER(2);

  ADC->ADC_EMR = ADC_EMR_CMPMODE_HIGH                   // Compare with high threshold
                 | ADC_EMR_CMPSEL(7)                    // Compare channel 7 = A0
                 | ADC_EMR_CMPFILTER(10);               // Number of consecutive compare events necessary
                                                        // to raise the flag = CMPFILTER+1                                                     
  ADC->ADC_ACR = ADC_ACR_IBCTL(0b01);                   // For frequencies > 500 KHz                                                     

  ADC->ADC_CWR = ADC_CWR_HIGHTHRES(4000);               // Compare with a high threshold of conversion

  ADC->ADC_CHER = ADC_CHER_CH7;                         // Enable Channel 7 = A0

  ADC->ADC_IER = ADC_IER_COMPE;                         // Interrupt on Compare match enable
  NVIC_EnableIRQ(ADC_IRQn);                             // Enable ADC interrupt
}

void ADC_Handler() { // One Comparison Event has occurred since the last read of ADC_ISR.

  ADC->ADC_ISR;      // Read ADC_ISR;
  ADC->ADC_CDR[7];   // Maybe should be read to allow next interrupt
  // Do some stuff (keep this as short as possible, e.g. set a flag to be proceed in loop())
  Flag = true;                         
}

al1fch


Go Up