Comparateur Analogique UNO ne semble pas marcher

Bonjour,

J’essaie de faire quelque chose de franchement simple mais je galère, ça en devient frustrant et gênant.

Je veux tester le fonctionnement du comparateur analogique pour une application ultérieure.

Pour ce faire, j’ai un pont diviseur de tension branché au 5V, les valeurs des résistances importent peu, elles sont e l’ordre du kilo ohm.

J’ai ma tension de référence prise au milieu du pont, c’est donc la tension de la seconde résistance, qui est donc inférieure à la tension aux bornes du pont complet.

Ma tension négative (celle sur laquelle j’aimerais donc pouvoir faire agir le comparateur), est reliée au 5V. Pour tester le fonctionnement du comparateur, je connecte et déconnecte simplement ce fil, ce qui fait passer la tension au delà de la tension de référence, et en dessous, me permettant de tester une détection de front montant et descendant.

Ma tension de référence est sur le pin D6, et ma tension d’entrée est sur le pin A0.

Voici mon code:

boolean triggered;

void setup ()
  { 
  ACSR = 0x10; // ACI -> 1  clear interrupt flag
  ADCSRA = (0<<ADEN); // ADC disabled
  ADCSRB = (1<<ACME); // enable MUX for negative input 
  ADMUX = 0; //A0 as negative input 

  //comparator interrupt on toggle
  ACSR = (0 << ACISR0);
  ACSR = (0 << ACISR1);

  Serial.begin (9600);
  Serial.println ("Started.");

  triggered = false;
}


ISR (ANALOG_COMP_vect){
  triggered = true;
}

  

void loop (){
  
  if (triggered)
    {
    Serial.println ("Triggered!"); 
    triggered = false;
    }
  
  }

Je n’obtiens aucune réaction dans le moniteur série, mis à part le “Started”. J’ai bien les tensions voulues (mesurées au voltmètre et via l’ADC).
J’ai un peu d’expérience dans l’utilisation de registres et interruptions sur dsPIC, je comprends tout à fait le principe, mais là… c’est la colle!

Bonsoir
Pour décrire un montage rien ne vaut un schéma !
Qu'est-ce, qui prouve le franchissement effectif du seuil ?

Bonjour,

Tu n'as pas autorisé les its comparateur.

  ADMUX = 0; //A0 as negative input

Ceci ne positionne pas l'entrée sur A0

Je pense que l'initialisation doit être:

  ADCSRA= 0;          // dévalide ADC
  ADCSRB= _BV(ACME);    // selection entrée négative sur A0
  ACSR = _BV(ACIE);       // autorise les its, its on toggle

Pour tester le code dans un premier temps, je pense qu'il serait préférable de ne pas utiliser les redirections et d'utiliser les broches par défaut D6 et D7.

Et ensuite mettre les redirections en place, la méthode des petits pas est souvent la meilleure.

cette page a l'air de faire le tour de la question :

ou

Merci pour vos réponses!

J'ai rajouté le schéma comme demandé.

Bien évidemment, le 5V provient de l'Arduino. Le fil relie A0 à 5V lorsque branché, et 0V lorsque débranché.
L'autre fil relie D6 à 5*(R2/(R1+R2)) = 3.33V.
Ainsi, lorsque je branche et débranche le fil de A0, je peux avoir mon franchissement de seuil par valeur supérieure ou inférieure.

ADMUX = 0 ne revient pas à mettre tous les bits du registre ADMUX à 0 et donc les bits MUX0, MUX1, MUX2, MUX3, ( rsepectivement 0, 1, 2 et 3) à 0 ce qui connecte le multiplexeur à ADC0? (Table 23-3 datasheet atmega328p)
J'ai également testé avec la mise à 0 de chaque bit individuellement, sans plus de résultat.

Il me semble également que l'écriture _BV(bit) est équivalente à (1<<bit), mais je ne voudrais pas dire de bêtise.
Et en effet, j'avais complètement oublié de set le bit ACIE, ça risquait pas de marcher, il faudra que je test avec cette modification!

J'ai également testé simplement avec les broches D6 et D7, je n'ai pas réussi à faire fonctionner non plus et suis passé aux broches analogiques... tentative vaine de faire changer le résultat!

Capture.JPG

Capture.JPG

Pour inclure une image tu cliques sur 'REPLY' en dessous du message ou 'Preview' en dessous de la zone de saisie, ensuite tu cliques sur 'Attachments and other options'.
Tu sélectionnes ton fichier image et il est automatiquement affiché.

Lorsque A0 est débranché, il n'est pas à 0, mais il est flottant, ce qui veut dire que sa tension est indéterminée.

Merci pour l'image, j'ai modifié mon message précédent du coup.

Intéressant le coup de la valeur flottante... du coup je n'ai jamais de franchissement de seuil ni par valeur inférieur ni supérieure vu que je ne passe jamais d'un 0V à un 5V et inversement, le 0V n'existant pas, c'est cela?

En rajoutant ACSR = (1 << ACIE) pour autoriser les interruptions du comparateur et en remplaçant mon pont diviseur par un potentiomètre, avec ma valeur de référence sur 3.3V, ça marche!

Je vous remercie à tous de votre aide.

hb_69:
Merci pour l'image, j'ai modifié mon message précédent du coup.

Intéressant le coup de la valeur flottante... du coup je n'ai jamais de franchissement de seuil ni par valeur inférieur ni supérieure vu que je ne passe jamais d'un 0V à un 5V et inversement, le 0V n'existant pas, c'est cela?

Oui, il faudrait mettre une résistance de pulldown sur A0.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.