Faire fonctionner l'ADC de l'Atmel ATMega328p
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Faire fonctionner l'ADC de l'Atmel ATMega328p



  1. #1
    invite119e9b4a

    Faire fonctionner l'ADC de l'Atmel ATMega328p


    ------

    Bonjour,

    J'essaye de faire fonctionner les ADC sur mon ATMega 328p mais je n'y arrive pas... Je ne vois pas ce que je rate, voici mon code :

    Code:
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    //*********************************************//
    //********* Prototypes de fonctions ***********//
    //*********************************************//
    
    //Initialise l'ADC et démarre une première conversion
    void initAdc();
    
    
    //*********************************************//
    //********* Variables globales ***********//
    //*********************************************//
    
    //ADC variables
    volatile uint16_t adc = 0;
    
    
    //*********************************************//
    //********* Programme principal ***********//
    //*********************************************//
    int main(void){
    	
    	initAdc();
    	
    	DDRB |= 1<<DDB0;
    	
    	sei(); //Activer les interruptions
    	
    	while(1){
    		
    		if(adc > 0){
    			PORTB |= 1<<PORTB0;
    		}
    		else{
    			PORTB &= ~(1<<PORTB0);
    		}
    	}
    	
    	return 0;
    
    }
    
    //*********************************************//
    //********* Interruptions ***********//
    //*********************************************//
    
    //Interruption lorsqu'une conversion de l'ADC se termine
    //Conversion en boucle
    ISR(ADC_vect){
    
    	//Lire le resultat
    	adc = ADC;
    	
    	//Démarrer une nouvelle conversion
    	ADCSRA |= 1<<ADSC;
    	
    }
    
    //*********************************************//
    //********* Fonctions ***********//
    //*********************************************//
    
    //Initialise l'ADC et démarre une première conversion
    void initAdc(){
    
    	//Activer l'ADC via ADEN dans ADCSRA
    	ADCSRA |= 1<ADEN;
    
    	//Selectionner la référence de voltage via REFSn dans ADMUX
    		//Rien à faire car utilisation de AREF, donc REFS0 et RES1 = 0
    	
    	//Sélectionner le premier convertisseur via MUX dans ADMUX
    		//Rien à faire car l'on souhaite commencer par ADC0, donc MUX3...0 = 0
    	
    	//Activer l'interruption sur conversion terminée via ADIE dans ADCSRA
    	ADCSRA |= 1<<ADIE;
    	
    	//Paramétrer le prescaler de l'ADC à 64 :horloge 8Mhz -> horloge ADC de 125kHz
    	ADCSRA |= 1<<ADPS1 | 1<<ADPS2;
    	
    	//Démarrer une première conversion
    	ADCSRA |= 1<<ADSC;
    
    }
    J'ai changé les Fuses pour obtenir une horloge de 8Mhz, donc mon prescaler doit être correct... Si vous voyez une erreur je suis preneur...

    D'après moi mon port PB0 devrait passer à l'état haut, mais mon voltmètre m'indique 0...

    Merci !

    -----

  2. #2
    invite2c278084

    Re : Faire fonctionner l'ADC de l'Atmel ATMega328p

    hello,

    A première vue pas d'oubli critique dans la programmation du micro
    Je pense que tu es un peu exigeant : demander à un ADC 10 bits de lire 0 !
    la valeur zéro peut être affectée de défauts (offset, non linéarité, DNL) qui font qu'un zéro n'est pas lu comme un zéro

    Il faudrait être sûr que la tension apporté par le câblage à l'entrée analogique est réellement inférieure à 1,074 mV (valeur d'un bit avec une référence à 1,1V )

    petite remarque: la référence interne est affectée d'une grande dispersion 1,0 à 1,2V, sensible de plus à la température de la puce, qui s'échauffe selon le travail demandé au micro. Utilises-donc une référence externe

    Selon l'utilisation envisagée, tu as peut-être intérêt à n'utiliser le convertisseur qu'en mode 8 bits : passer à 1 le bit ADLAR dans ADMUX avant de lire cette valeur

    autre suggestion : faire la comparaison à une valeur nettement supérieure à zéro


    En fait, je m'attendrais à avoir la sortie toujours à 1.
    quel est ton compilateur?
    peut-être attend-il une syntaxe de mise à un de bit (il y en a plusieurs dans ton code) un peu différente
    PORTB |= 1<<PORTB0;
    essayes PORTB |= (1<<PORTB0);

    tu as montré la totalité du code ?


    saluts

  3. #3
    invite119e9b4a

    Re : Faire fonctionner l'ADC de l'Atmel ATMega328p

    Merci pour ta réponse.

    petite remarque: la référence interne est affectée d'une grande dispersion 1,0 à 1,2V, sensible de plus à la température de la puce, qui s'échauffe selon le travail demandé au micro. Utilises-donc une référence externe
    J'utilise déjà une référence externe de 3.3V (REFS0 et RES1 = 0), à moins que je me trompe ?

    Par contre je me sens bête, j'ai regardé une nouvelle fois le schéma des broches du micro, et je me rend compte que j'envoie mon signal sur ADC5 et non ADC0... j'ai inversé l'ordre des convertisseurs... Je test ce soir.

  4. #4
    invite2c278084

    Re : Faire fonctionner l'ADC de l'Atmel ATMega328p

    donc le bout de code montré n'est pas celui que tu utilises
    y'a d'autres surprises ?

  5. A voir en vidéo sur Futura
  6. #5
    invite119e9b4a

    Re : Faire fonctionner l'ADC de l'Atmel ATMega328p

    Bien sûr que si que j'utilise ce code, pourquoi j'en utiliserais un autre ? J'ai juste remarqué que la broche en haut à droite du micro correspondait à ADC5 alors que je pensais qu'il s'agissait de ADC0. Donc je pense qu'il me suffit d'ajouter une ligne ADMUX |= 1<<MUX0 | 1<<MUX2; afin de lire le 5 plutôt que le 0.

Discussions similaires

  1. faire fonctionner un moteur pas à pas
    Par invite59910c8c dans le forum Électronique
    Réponses: 2
    Dernier message: 10/05/2013, 01h55
  2. faire fonctionner mon poêle
    Par invitedadd353e dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 7
    Dernier message: 26/11/2011, 17h57
  3. Faire fonctionner un écran LCD.
    Par invite85a93e3d dans le forum Électronique
    Réponses: 2
    Dernier message: 24/02/2011, 19h06
  4. Faire fonctionner un PIC18F252
    Par inviteee2ce2b6 dans le forum Électronique
    Réponses: 12
    Dernier message: 22/05/2007, 19h36
  5. comment faire fonctionner un PID???
    Par invite253d7dda dans le forum Électronique
    Réponses: 8
    Dernier message: 20/04/2007, 09h10
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...