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
    bobby4078

    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 !

    -----
    Dernière modification par bobby4078 ; 03/03/2014 à 21h59.

  2. #2
    zibuth27

    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
    bobby4078

    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
    zibuth27

    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
    bobby4078

    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 orinym dans le forum Électronique
    Réponses: 2
    Dernier message: 10/05/2013, 00h55
  2. faire fonctionner mon poêle
    Par invitedadd353e dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 7
    Dernier message: 26/11/2011, 16h57
  3. Faire fonctionner un écran LCD.
    Par Canaillou2k5 dans le forum Électronique
    Réponses: 2
    Dernier message: 24/02/2011, 18h06
  4. Faire fonctionner un PIC18F252
    Par Platipu$ dans le forum Électronique
    Réponses: 12
    Dernier message: 22/05/2007, 18h36
  5. comment faire fonctionner un PID???
    Par invite253d7dda dans le forum Électronique
    Réponses: 8
    Dernier message: 20/04/2007, 08h10
Découvrez nos comparatifs produits sur l'informatique et les technologies.