19 avril 2025

ADC Atmega328p

L’ADC ou Analog-to-Digital Converter, est un convertisseur qui permet de convertir un signal analogique en un signal numérique exploitable par le microcontrôleur.

Dans le cas de notre Atmega328, il s’agit d’un convertisseur 10bits, donc la valeur retournée par le convertisseur sera située entre 0 et 1023 (2^10 = 1024).

Nous pouvons remarquer sur l’image ci-dessus que notre ADC peut fonctionner sur 8 broches différentes du microcontrôleur (/6 + /2), celui-ci utilise d’ailleurs une alimentation propre, d’où la présence d’AVCC et GND. Nous avons plusieurs tensions de référence, 1.1v et AVCC sont des références internes, mais nous pouvons aussi utiliser une tension externe AREF.

Le convertisseur va prendre comme référence le GND et la tension de référence choisie, nous aurons alors une valeur minimale et maximale pour la conversion.

Il est conseillé de placer un condensateur de découplage proche d’AVCC et AGND pour améliorer la qualité de l’alimentation du convertisseur et ainsi supprimer le bruit.

Choix de la référence

Pour savoir qu’elle est la tension maximale pour faire la comparaison et que notre convertisseur peut correctement fonctionner, nous devons avoir une tension de référence. Pour la choisir, nous avons un tableau qui renseigne sur les tensions de références disponibles.

Si nous souhaitions utiliser 5v comme tension de référence, nous devrions alors mettre REFS0 à 1 pour avoir AVCC comme tension de référence.

En regardant un peu plus en haut, nous trouvons le registre à éditer.

Nous devons alors pour faire cela, mettre le bit 6 du registre ADMUX à 1.

Prédiviseur/Prescaler

L’ADC fonctionner avec l’horloge du processeur, comme on le voit sur l’image au-dessus, nous avons aussi un Prescaler. Dans la datasheet de l’Atmega328p, on nous apprend que la fréquence de l’ADC peut fonctionner à une fréquence comprise entre 50 et 200kHz pour obtenir une bonne résolution. Et que si l’on a une résolution plus faible (8 bits par exemple), nous aurons alors un taux d’échantillonnage plus élevé.

On nous dit aussi qu’une conversion normale prend environ 13 coups d’horloge ADC (après le prescaler) et 25 pour initialiser l’ADC.

Comme pour les Timers, nous avons un tableau et le registre concerné.

Si je souhaite mettre un Prescaler de 128, je mets alors les bits ADPS2 ADPS1 et ADPS0 à 1 dans le registre ADCSRA.

Broche mesurer

ATMega328P Microcontroller Pinout, Pin Configuration, Features & Datasheet

Pour choisir la broche que nous souhaitons mesurés, nous devons branche une broche possédant « ADC« . Une fois que nous savons quelle broche nous intéresse, nous devons voir dans le tableau de correspondance quelle est la configuration du registre à faire.

Si nous souhaitons mesurer sur ADC5, nous devons avoir MUX3..0 à 0101.
Ce qui signifie que :
MUX3 = 0
MUX2 = 1
MUX1 = 0
MUX0 = 1

Dans la description des registres de l’ADC, nous avons ce tableau qui renseigne du registre à modifier.

Nous voyons alors que pour faire cela, nous devons mettre le bit 2 et 0 à la valeur 1 dans le registre ADMUX.

Activation de l’interruption

Pour exploiter au mieux notre ADC, le mieux est de l’utiliser dans une interruption. Pour activer l’interruption, il suffit de mettre à 1 le bit ADIE (Interrupt Enable) du registre ADCSRA (tableau dans la section du dessous).

Ne pas oublier de faire un sei() après l’activation pour autoriser les interruptions.

Démarrer une mesure et l’ADC

Après avoir configuré correctement notre ADC, il faut le démarrer, ainsi qu’une mesure ! Pour cela, la datasheet de notre Atmega328p l’explique plutôt bien, nous devons mettre à 1 le bit ADEN (7ème bit du registre ADCSRA), et pour lancer une mesure, nous devons placer le bit ADSC (Start Conversion) à 1, celui-ci repassera à 0 une fois la conversion terminée, il faudra alors le replacé à nouveau à 1 pour relancer une conversion.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *