This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
I'm trying to configure the ADC on a custom board. At present, my code compiles but I dont see that the ADC ISR is being called. This is code ported from a nearly identical application (same processor, maybe minor clock differences). Relevant code snippets below. I'd appreciate any suggestions!
//////////////////Main Program/////////
int main(void)
{
//Initializations
PinoutSet();
sysclock = SysCtlClockFreqSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_25MHZ, 25000000);
adc_configuration();
//Superloop
while(1){
ADCProcessorTrigger(ADC0_BASE, 0); //base, SequenceNumber
SysCtlDelay(LoopDelay * (sysclock / 3 / 1000)); //introduces 100ms delay - 3 b/c SysCtlDelay takes 3 clock cycles - 1000 b/c unit conversion
}
}
void adc_configuration(){
//Onboard ADC Configuration to read 3 external analog inputs on pins 13,14,15 and internal temperature
//read on sequence 0 with highest priority
//TODO - add measurements for heater voltage on pins 127/PD6/AIN5, 128/PD7/AIN4 and 12V rail 12/PE3/AIN0
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); //p.501 of Tivaware manual
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
//ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL,1);
ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_MOSC | ADC_CLOCK_RATE_FULL,1);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0))
{
}
//ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_ALWAYS, 0); //Base, SequenceNum, Trigger, Priority
ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); //Base, SequenceNum, Trigger, Priority
ADCSequenceStepConfigure(ADC0_BASE, 0, 0, (ADC_CTL_CH1)); //Base, SequenceNum, Step, Config
ADCSequenceStepConfigure(ADC0_BASE, 0, 1, (ADC_CTL_CH2)); //Base, SequenceNum, Step, Config
ADCSequenceStepConfigure(ADC0_BASE, 0, 2, (ADC_CTL_CH3)); //Base, SequenceNum, Step, Config
ADCSequenceStepConfigure(ADC0_BASE, 0, 3, (ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END)); //Base, SequenceNum, Step, Config
ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V);
//ADCReferenceSet(ADC0_BASE, ADC_REF_INT);
ADCSequenceEnable(ADC0_BASE, 0); //Base, SequenceNum
ADCIntRegister(ADC0_BASE, 0, adc_int_handler); //Base, SequenceNum, ISR Handler pointer
ADCIntEnable(ADC0_BASE, 0); //Base, SequenceNum
}
void adc_int_handler(void) {
adc_int_counter++;
ADCSequenceDataGet(ADC0_BASE, 0, adc_buffer);
rail_voltage_24v = adc_buffer[0];
rail_voltage_5v = adc_buffer[1];
rail_voltage_3v3 = adc_buffer[2];
rail_voltage_24v_volts = ((float) rail_voltage_24v) / ((float) 0xFFF) * 3 * 9.635; //12-bit ADC, 3V reference, 9.635x divider attenuation
rail_voltage_5v_volts = ((float) rail_voltage_5v) / ((float) 0xFFF) * 3 * 2; //12-bit ADC, 3V reference, 2x divider attenuation
rail_voltage_3v3_volts = ((float) rail_voltage_3v3) / ((float) 0xFFF) * 3 * 1.330; //12-bit ADC, 3V reference, 1.330x divider attenuation
tiva_temperature = adc_buffer[3];
ADCIntClear(ADC0_BASE, 0); //base, SequenceNumber
}
Hi Jack,
Did you mean the only thing compared to the working program was the clock configuration?
If your system clock frequency is meant to be the same frequency as the MOSC, then please still use the PLL instead of the MOSC as the clock source to reach the final system clock frequency. Let me know if that resolves the issue.
Let something like below.
ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 25000000);
This appears to have resolved the issue.
I would appreciate a brief explanation if possible? My ADC configuration included the line below, and my understanding was that it would run just fine off of the MOSC?
//ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL,1);
ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_MOSC | ADC_CLOCK_RATE_FULL,1);
Thanks very much for the help!
Hi Jack,
I think you may be hitting SYSCTL#23 errata. Please also refer to the below post and the solution provided by Bob.
Compiler/TM4C1294NCPDT: SysCtlClockFreqSet() Function. - Arm-based microcontrollers forum - Arm-based...