Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
Problème de lecture d'un ADC - PIC16F1783
Problème de lecture d'un ADC - PIC16F1783
Problème de lecture d'un ADC - PIC16F1783
Dans mon cas, je regarde directement la valeur du registre ADRES via le mode DEBUG (j'utilise un PICKIT 3).
J'ai mis une watch sur le registre ADRES, et à chaque passage dans la boucle, même sans modifier le voltage en entré, j'ai des écarts importants entre les valeurs, sans aucune correspondance visible avec la tension d'entrée.
J'ai mis une watch sur le registre ADRES, et à chaque passage dans la boucle, même sans modifier le voltage en entré, j'ai des écarts importants entre les valeurs, sans aucune correspondance visible avec la tension d'entrée.
Problème de lecture d'un ADC - PIC16F1783
Problème de lecture d'un ADC - PIC16F1783
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
int16 Acqu_avg;Acq_value;
int16 Signe;
la fig 17-6 montre encore une autre representation , en isolant completement le signe
int16 Signe;
la fig 17-6 montre encore une autre representation , en isolant completement le signe
Code : Tout sélectionner
Signe=0;
Acqu_value = 0x0000;
Acqu_value = ADRESH & 0x0F; // partie signe entierment masquée
if((Acq_value & 0x70)>0 ) Signe=1;
Acqu_value = Acqu_value<<8;
Acqu_value += ADRESL;
// on traite le signe
if (Signe==1) Acqu_value =-Acqu_value ;
Acqu_avg += Acqu_value;
Problème de lecture d'un ADC - PIC16F1783
J'ai changé le mode de représentation du résultat en 10 bits et avec ADFM = 0.
J'ai réadapté le traitement des regsitres ADRESH et ADRESL (un peu comme paulfujo me l'a conseillé).
Au niveau hardware, j'ai également branché mon potentiomètre directement sur Vdd et Vss, et non via une source externe.
J'ai enfin un signal stable et juste.
Je vous mets la dernière version du code.
J'ai réadapté le traitement des regsitres ADRESH et ADRESL (un peu comme paulfujo me l'a conseillé).
Au niveau hardware, j'ai également branché mon potentiomètre directement sur Vdd et Vss, et non via une source externe.
J'ai enfin un signal stable et juste.
Je vous mets la dernière version du code.
Code : Tout sélectionner
/*
* File: main.c
* Author: Alexandre
*
* Created on 21 mars 2018, 16:41
*/
#define _XTAL_FREQ 32000000
#pragma config CLKOUTEN = OFF
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF
#pragma config BOREN = ON
#pragma config FCMEN = OFF
#pragma config MCLRE = ON
#pragma config CPD = OFF
#pragma config IESO= OFF
#pragma config FOSC = INTOSC
#pragma config STVREN = ON
#pragma config LPBOR = OFF
#pragma config BORV = HI
//#pragma configLVP = OFF
#pragma config WRT = OFF
#pragma config PLLEN = ON // PLL activée
#include <xc.h>
#include <pic16f1783.h>
#include "types_defines.h"
void chenilliard(void);
void ADCInit(void);
UINT16 ADCRead(void);
void main(void) {
// Configuration du port B
TRISB = 0b00001000; // Setting RB3 as input
ANSELB = 0b00001000; // Setting RB3 as analog input
// Clock configuration
OSCCONbits.IRCF = 0b1101; // Fosc = 4Mhz (à multiplier par 4 car PLL)
OSCCONbits.SCS1 = 1; // Internal osscilator source
// Déclaration de variable
UINT16 value;
ADCInit();
while(1) {
value = ADCRead();
}
return;
}
/*void chenilliard() {
while(1) {
PORTBbits.PORTB = 0x01;
for (int i=0; i<8; i++) {
__delay_ms(3000);
PORTBbits.PORTB= PORTBbits.PORTB*2;
}
}
} */
void ADCInit(){
// ADCON0 Configuration
ADCON0bits.ADRMD = 1; //Précision 10 bits
ADCON0bits.CHS = 0b01001; // Pin selection AN9 (RB3)
// ADCON1 configuration
ADCON1bits.ADFM = 0; // (2's comlimentright justified)
ADCON1bits.ADCS = 0b101; // Clock conversion, à calculer : Fosc/16 : 1µs
ADCON1bits.ADNREF = 0; // Vref- connected to Vss
ADCON1bits.ADPREF = 0b00; // Vref+ connected to Vdd
// ADCON2 Configuration
ADCON2bits.TRIGSEL = 0b1111; // Auto conversion enable
ADCON2bits.CHSN = 0b1111; // ADC Negative reference selected by ADNREF
}
UINT16 ADCRead(void)
{
UINT8 j;
volatile UINT16 Acqu_value;
UINT16 Acqu_avg = 0;
__delay_us(50);
//On moyenne sur 8 mesures consécutives
ADCON0bits.ADON = 1; // ADC ON
for (j=0;j<8;j++) {
__delay_ms(500);
ADRESH = 0x0000;
ADRESL = 0x0000;
ADCON0bits.GO = 1; //Start ADC conversion
NOP();
NOP();
while(ADCON0bits.GO != 0){}; // Wait for conversion to be done
Acqu_value = 0x0000;
Acqu_value = ADRESH;
Acqu_value = Acqu_value<<8;
Acqu_value += ADRESL;
Acqu_value = Acqu_value>>6;
Acqu_avg += Acqu_value;
}
ADCON0bits.ADON = 0; // ADC OFF
//Moyennage sur 8 valeurs
Acqu_avg = Acqu_avg>>3;
return Acqu_avg;
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 55 invités