2017-05-17 15 views
0

Mes étapes sont les suivantes: activation horloge pour ADC et port de AIN10 (PB4). Désactivation des bits respectifs dans le registre DEN et DIR correspondant à la broche B4. Activation des broches correspondantes dans le registre AFSEL et le registre PCTL *. Réglage des registres pour: taux d'échantillonnage, priorité (SS3) etc. comme indiqué dans le code.Comment faire fonctionner mon ADC dans le microcontrôleur tm4c123gxl?

Puis je le déclenche dans une autre fonction mais d'une manière ou d'une autre mon ADC ne lit aucune autre valeur de tension appliquée.

Ma première question concerne PCTL et quelle est la valeur dont nous avons besoin pour activer ADC?

J'ai essayé de le résoudre pendant environ un jour maintenant mais je ne l'ai pas encore compris. Toute aide est très appréciée.

// Register definitions for clock enable 
#define SYSCTL_RCGCGPIO_R (* ((volatile unsigned long *) 0x400FE608)) 
#define SYSCTL_RCGCADC_R (* ((volatile unsigned long *) 0x400FE638)) 
#define GPIO_PORTB_AFSEL_R (* ((volatile unsigned long *) 0x40058420)) 
#define GPIO_PORTB_PCTL_R (*((volatile unsigned long *)0x4005952C)) 


// Register definitions for GPIO port B  ;;;;;   AIN10 = PB4 
#define GPIO_PORTB_DATA_R (* ((volatile unsigned long *) 0x400053FC)) 
#define GPIO_PORTB_DIR_R (* ((volatile unsigned long *) 0x40005400)) 
#define GPIO_PORTB_DEN_R ( *((volatile unsigned long *) 0x4000551C)) 


// Register definitions for ADC0 and Sample Sequencer 3 
#define ADC0_PC_R (* ((volatile unsigned long *) 0x40038FC4)) 
#define ADC0_SSPRI_R (* ((volatile unsigned long *) 0x40038020)) 
#define ADC0_ACTSS_R (* ((volatile unsigned long *) 0x40038000)) 
#define ADC0_IM_R (* ((volatile unsigned long *) 0x40038008)) 
#define ADC0_RIS_R (* ((volatile unsigned long *) 0x40038004)) 
#define ADC0_ISC_R (* ((volatile unsigned long *) 0x4003800C)) 
#define ADC0_SAC_R (* ((volatile unsigned long *) 0x40038030)) 
#define ADC0_PSSI_R (* ((volatile unsigned long *) 0x40038028)) 
#define ADC0_SSCTL3_R (* ((volatile unsigned long *) 0x400380A4)) 
#define ADC0_SSFIFO3_R (* ((volatile unsigned long *) 0x400380A8)) 

unsigned char Lookup_7Seg_Disp [ 12 ] = {0xC0 , 0xF9 , 0xA4 , 0xB0 , 0x99 , 
    0x92 , 0x82 , 0xF8 , 0x80 , 0x90 , 0xC6}; 
unsigned char Temperature_Value [ 3 ] = {0 , 0 , 0xA} ; 
unsigned char i , value=0; 
unsigned int ADC_value = 0 , voltage = 0 ; 
int maxVoltage=0; 


void ADC_Init() { 
    volatile unsigned long delay; 
    SYSCTL_RCGCGPIO_R |= 0x01; //Enable Clock for Port A 
    SYSCTL_RCGCADC_R |= 0x1;  //Enable ADC0 


    delay = SYSCTL_RCGCGPIO_R; //Delay for clock to settle down 

    GPIO_PORTB_DIR_R &= ~(0x10);//PB4 as input 
    GPIO_PORTB_DEN_R &= ~(0x10);//PB4 as analog type 
    GPIO_PORTB_AFSEL_R |= 0x10; 
    GPIO_PORTB_PCTL_R |= 0x10; 


    //Clear sampling rate 
    ADC0_PC_R &= 0x00; 
    //Set sampling rate to 125ksps 
    ADC0_PC_R &= 0x01; 
    //Set priority to SSFI3 
    ADC0_SSPRI_R |= 0x3210; 
    //Disable sample sequence 3 befor configuration 
    ADC0_ACTSS_R &= ~0x8; 
    //Enable TS0, IE0 and END0 bits 
    ADC0_SSCTL3_R |= 0xE; 
    //Enable 16x hardware oversampling 
    ADC0_SAC_R |= 0x4; 
    //Disable Interrupt by writing 0 to corresponding bit 
    ADC0_IM_R &= ~(0x8); 
    //Activate sample sequencer 
    ADC0_ACTSS_R |= 0x8; 
} 

void SystemInit() { 

} 

void ADC_Voltage(void) { 
    ADC0_PSSI_R |= 0x8; 
    while ((ADC0_RIS_R & 0x8)==0); 
    ADC_value = (ADC0_SSFIFO3_R & 0xFFF); 
    voltage = (ADC_value)*44; 
    if(voltage>maxVoltage){ 
     maxVoltage=voltage; 
    } 
    ADC0_ISC_R |= 0x08; 
} 

void delay(unsigned long counter) { 
    int i; 
    for(i=0;i<counter;i++) 
    {} 
} 

int main(void) { 
    ADC_Init(); 
    delay(1000); 
    ADC_Voltage(); 
    maxVoltage=maxVoltage*0.707; 

} 

Répondre

0

Je ne sais pas si vous avez déjà résolu cela. J'utilise généralement driverlib fourni par TI que vous pouvez trouver dans TivaWARE, donc je ne connais pas tous les registres pour faire ce DRM du haut de ma tête. Vérifiez que vous utilisez correctement la broche. L'autre chose à regarder est le séquenceur d'échantillons. Les ADC sont sur des séquenceurs d'échantillons et vous devez les configurer aussi, pour le nombre d'échantillons, la source des échantillons, etc. Vous pouvez tester votre configuration ADC en configurant le séquenceur pour lire à partir du capteur de température interne au lieu de une broche externe pour au moins obtenir cette section du code débogué. Si cela fonctionne, et que vous passez ensuite à une broche externe et que cela ne fonctionne plus, alors vous saurez que le problème est le multiplexage de broche.

Y at-il une raison impérieuse pour laquelle vous n'utilisez pas la bibliothèque de pilotes fournie par TI? Il aurait fallu quelques minutes pour mettre en place en utilisant cela au lieu d'effectuer DRM. Si la taille du code est un problème, le tm4c a aussi driverlib sur ROM

Même si vous ne pouvez pas utiliser driverlib pour une raison quelconque, jetez un oeil à la source driverlib, au guide de l'utilisateur de la bibliothèque du pilote de périphérique tivaware et à l'exemple de code. Vous verrez les appels de driverlib qui sont nécessaires pour configurer ceci, et vous pourrez les retrouver dans les registres qui ont besoin d'être configurés.