Tool/software: Code Composer Studio
Hi,
I am having difficulties configuring the ADC, Here is my code:
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/tm4c123gh6pm.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include "driverlib/adc.h"
int FsSensor = 125000;
int FsPotA = 40000;
int FsPotB = 20000;
volatile float Pot_A;
volatile float Pot_B;
const float conv = 3.3/4096; //0 - 3.3
volatile uint32_t avgTemp;
volatile uint32_t TempC;
volatile uint32_t TempF;
void ObtMuestra(void);
void TimerTemp(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()/FsSensor - 1); //40MHz / 125KHz
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
TimerEnable(TIMER0_BASE, TIMER_A);
}
void TimerPot(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
TimerPot1();
TimerPot2();
}
void TimerPot1(){
TimerConfigure(TIMER1_BASE, TIMER_CFG_A_PERIODIC);
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/FsPotA - 1); //40MHz / 40KHz
TimerControlTrigger(TIMER1_BASE, TIMER_A, true);
TimerEnable(TIMER1_BASE, TIMER_A);
}
void TimerPot2(){
TimerConfigure(TIMER1_BASE, TIMER_CFG_B_PERIODIC);
TimerLoadSet(TIMER1_BASE, TIMER_B, SysCtlClockGet()/FsPotB - 1); //40MHz / 20KHz
TimerControlTrigger(TIMER1_BASE, TIMER_B, true);
TimerEnable(TIMER1_BASE, TIMER_B);
}
//ADC Config
void ADCconfig(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_1); //CH2
GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_2); //CH1
ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMER,0);
ADCSequenceStepConfigure(ADC0_BASE,0,0,ADC_CTL_CH2); //PotA
ADCSequenceStepConfigure(ADC0_BASE,0,1,ADC_CTL_CH2); //PotA
ADCSequenceStepConfigure(ADC0_BASE,0,2,ADC_CTL_CH1); //PotB
ADCSequenceStepConfigure(ADC0_BASE,0,3,ADC_CTL_CH1); //PotB
ADCSequenceStepConfigure(ADC0_BASE,0,4,ADC_CTL_TS); //Sensor
ADCSequenceStepConfigure(ADC0_BASE,0,5,ADC_CTL_TS); //Sensor
ADCSequenceStepConfigure(ADC0_BASE,0,6,ADC_CTL_TS); //Sensor
ADCSequenceStepConfigure(ADC0_BASE,0,7,ADC_CTL_TS|ADC_CTL_IE|ADC_CTL_END); //Sensor
ADCSequenceEnable(ADC0_BASE,0);
ADCIntEnable(ADC0_BASE,0);
ADCIntRegister(ADC0_BASE,0,ObtMuestra);
IntEnable(INT_ADC0SS0);
IntMasterEnable();
}
int main(void){
SysCtlClockSet(SYSCTL_XTAL_16MHZ|SYSCTL_SYSDIV_5); //40MHz
TimerTemp();
TimerPot();
ADCconfig();
}
void ObtMuestra(){
unsigned long ulADC0Value[8];
ADCIntClear(ADC0_BASE,0);
ADCSequenceDataGet(ADC0_BASE,0,ulADC0Value);
Pot_A = conv*(ulADC0Value[0]+ulADC0Value[1])/2;
Pot_B = conv*(ulADC0Value[2]+ulADC0Value[3])/2;
avgTemp = (ulADC0Value[4] + ulADC0Value[5] + ulADC0Value[6] + ulADC0Value[7])/4;
TempC = (1475 - (2475*avgTemp)/4096)/10;
TempF = (9*TempC)/5 + 32;
}
I need 2 samples for each Potentiometer and 4 samples for temperature sensor, my issue is in the DataGet for the variable ulADC0Value:
The two Pot be in 0v and the samples of the sensor was 2000 (for example), so the array in the first interrupt was: [0,0,0,0,2000,2000,2000,2000], when I resume for the next interrupt I get the values move in the array like: [2000,2000,0,0,0,0,2000,2000], in every interrupt I get the values move in the array, so the convertions for the values of Pot_A, Pot_B, TempC and TempF change radically. What's going on?
I thought the [0] and [1] of the array was assigned to the values in channel 2. [2] and [3] to channel 1, and [4] ... [7] for the sensor.