Hi,
I am using the TM4C1294NCPDT with IAR.
I did port LM3S9B96 to TM4C1294NCPDT , specially about the ADC. Looks like that I did everything ok, but I have a different conversion between the microcontrollers.
The only difference that I applied was a resistor on the adc input (TM4C1294NCPDT) as the doc says http://www.ti.com/lit/an/spma049a/spma049a.pdf
re
Below I put the source codes and the reads tables, by the way I know that LM3S9B96 works in 10bits and TM4C1294NCPDT works in 12bits, so I did the conversion just dividing by 4 the TM4C1294NCPDT results.
Please take a look, and comment will be well come.
Best Regards.
adc |
adc |
|
Volts |
TM4C1294NCPDT |
LM3S9B96 |
3,3 |
1010 |
694 |
3,2 |
959 |
672 |
3,1 |
948 |
662 |
3 |
902 |
648 |
2,9 |
864 |
629 |
2,8 |
847 |
623 |
2,7 |
822 |
612 |
2,6 |
794 |
599 |
2,5 |
750 |
586 |
2,4 |
716 |
573 |
2,3 |
686 |
553 |
2,2 |
661 |
545 |
2,1 |
615 |
533 |
2 |
598 |
517 |
1,9 |
569 |
501 |
1,8 |
531 |
486 |
1,7 |
509 |
478 |
1,6 |
466 |
460 |
1,5 |
435 |
451 |
1,4 |
408 |
432 |
1,3 |
361 |
426 |
1,2 |
345 |
413 |
1,1 |
300 |
400 |
1 |
275 |
378 |
0,9 |
231 |
370 |
0,8 |
214 |
357 |
0,7 |
184 |
348 |
0,6 |
146 |
337 |
//LM3S9B96
///----------------------------------------------------------------------------------
void main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A,SysCtlClockGet()/4000); // 250µSec
TimerEnable(TIMER0_BASE, TIMER_A);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeADC(GPIO_PORTD_BASE, AIN9 | AIN10 |AIN11 | AIN12 |AIN1 | AIN2 | AIN3 | AIN4);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, AIN8 | AIN7 |AIN6 | AIN5);
// Configure the ADC to
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1); // ADC1
ADCSequenceDisable(ADC1_BASE,2);
ADCSequenceDisable(ADC0_BASE,0);
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);
ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 1); // sequencer 0 Priority 0
ADCSequenceStepConfigure(ADC0_BASE, 0, 0,ADC_CTL_CH0);
ADCSequenceStepConfigure(ADC0_BASE, 0, 1,ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC0_BASE, 0, 2,ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 0, 3,ADC_CTL_CH3);
ADCSequenceStepConfigure(ADC0_BASE, 0, 4,ADC_CTL_CH4);
ADCSequenceStepConfigure(ADC0_BASE, 0, 5,ADC_CTL_CH5);
ADCSequenceStepConfigure(ADC0_BASE, 0, 6,ADC_CTL_CH6);
ADCSequenceStepConfigure(ADC0_BASE, 0, 7,ADC_CTL_CH7| ADC_CTL_IE | ADC_CTL_END);
//Set the second ADC
ADCSequenceConfigure(ADC1_BASE, 2, ADC_TRIGGER_PROCESSOR, 0); // sequencer 1 Priority 1
ADCSequenceStepConfigure(ADC1_BASE, 2, 0,ADC_CTL_CH12);
ADCSequenceStepConfigure(ADC1_BASE, 2, 1,ADC_CTL_CH13);
ADCSequenceStepConfigure(ADC1_BASE, 2, 2,ADC_CTL_CH14);
ADCSequenceStepConfigure(ADC1_BASE, 2, 3,ADC_CTL_CH15 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable(ADC0_BASE, 0); // Enable sequence 0
ADCIntEnable(ADC0_BASE, 0); // Enable Interrupt sequence 0
IntEnable(INT_ADC0); //
ADCSequenceEnable(ADC1_BASE, 2); // Enable sequence 1
ADCIntEnable(ADC1_BASE, 2); // Enable Interrupt sequence 1
IntEnable(INT_ADC1SS2);
while(1);
}
void ADC0IntHandler(void)
{
ADCIntClear(ADC0_BASE, 0);
unsigned long ulData[8]; //
// Read the data from the ADC.
//
ADCSequenceDataGet(ADC0_BASE, 0, ulData);
ADCC++;
}
void ADC1IntHandler(void)
{
ADCIntClear(ADC1_BASE, 2);
unsigned long ulData[8]; //
// Read the data from the ADC.
//
ADCSequenceDataGet(ADC1_BASE, 2,ulData);
ADCC1++;
}
void Timer0IntHandler(void)
{
//
// Clear the timer interrupt.
//
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
ADCProcessorTrigger(ADC1_BASE, 2);
ADCProcessorTrigger(ADC0_BASE, 0);
}
//TM4C1294NCPDT
//-------------------------------------------------------------------------------------
void main(void)
{
g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 120000000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A,SysCtlClockGet()/4000); // 250µSec
TimerEnable(TIMER0_BASE, TIMER_A);
//
// Configure GPIO Pins PORT_B used for the Analog feedback INPUTS.
ROM_GPIOPinTypeADC(GPIO_PORTB_BASE, AIN10 | AIN11);
// Configure GPIO Pins PORT_D used for the Analog feedback INPUTS.
ROM_GPIOPinTypeADC(GPIO_PORTD_BASE, AIN12 | AIN7 | AIN6 | AIN5 | AIN4);
// Configure GPIO Pins PORT_E used for the Analog feedback INPUTS.
ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, AIN3 | AIN2 | AIN1 | AIN9 | AIN8);
///////////////
/ Configure the ADC to
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1); // ADC1
ADCSequenceDisable(ADC1_BASE,2);
ADCSequenceDisable(ADC0_BASE,0);
ADCClockConfigSet(ADC0_BASE, ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL,240); //120000000/500000 = 240
ADCClockConfigSet(ADC1_BASE, ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL,240);
//SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);//LM3S9B96
ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 1); // sequencer 0 Priority 0
ADCSequenceStepConfigure(ADC0_BASE, 0, 0,ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC0_BASE, 0, 1,ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 0, 2,ADC_CTL_CH3);
ADCSequenceStepConfigure(ADC0_BASE, 0, 3,ADC_CTL_CH4);
ADCSequenceStepConfigure(ADC0_BASE, 0, 4,ADC_CTL_CH5);
ADCSequenceStepConfigure(ADC0_BASE, 0, 5,ADC_CTL_CH6);
ADCSequenceStepConfigure(ADC0_BASE, 0, 6,ADC_CTL_CH7);
ADCSequenceStepConfigure(ADC0_BASE, 0, 7,ADC_CTL_CH8| ADC_CTL_IE | ADC_CTL_END);
//Set the second ADC
ADCSequenceConfigure(ADC1_BASE, 2, ADC_TRIGGER_PROCESSOR, 0); // sequencer 1 Priority 1
ADCSequenceStepConfigure(ADC1_BASE, 2, 0,ADC_CTL_CH9);
ADCSequenceStepConfigure(ADC1_BASE, 2, 1,ADC_CTL_CH10);
ADCSequenceStepConfigure(ADC1_BASE, 2, 2,ADC_CTL_CH11);
ADCSequenceStepConfigure(ADC1_BASE, 2, 3,ADC_CTL_CH12 | ADC_CTL_IE | ADC_CTL_END);
IntMasterEnable();
ADCSequenceEnable(ADC0_BASE, 0); // Enable sequence 0
ADCIntEnable(ADC0_BASE, 0); // Enable Interrupt sequence 0
//ROM_IntEnable(INT_ADC0SS0);
IntEnable(INT_ADC0SS0);
//IntEnable(INT_ADC0); //
IntMasterEnable();
ADCSequenceEnable(ADC1_BASE, 2); // Enable sequence 1
ADCIntEnable(ADC1_BASE, 2); // Enable Interrupt sequence 1
IntEnable(INT_ADC1SS2);
while(1);
}
void ADC0IntHandler(void)
{
ADCIntClear(ADC0_BASE, 0);
uint32_t ulData[8]; //
// Read the data from the ADC.
//
ADCSequenceDataGet(ADC0_BASE, 0, ulData);
for(int i=8; i < 8; i++) // convert 12bits to 10bits
ulData[i]= ulData[i]/4;
ADCC++;
}
void ADC1IntHandler(void)
{
ADCIntClear(ADC1_BASE, 2);
uint32_t ulData[8]; //
// Read the data from the ADC.
//
ADCSequenceDataGet(ADC1_BASE, 2,ulData);
for(int i=8; i < 8; i++) // convert 12bits to 10bits
ulData[i]= ulData[i]/4;
ADCC1++;
}
void Timer0IntHandler(void)
{
//
// Clear the timer interrupt.
//
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
ADCProcessorTrigger(ADC1_BASE, 2);
ADCProcessorTrigger(ADC0_BASE, 0);
}
///----------------------------------------------------------------------------------