Hi,
I have inherited a project and I need to add two new ADC inputs on Port E, pins 0 (Cartridge) and 2 (door). I thought I had configured correctly but apparently not. I do not see any changes in the ADC reading but I have verified that the voltage to the pin is changing. Code snippets below. I appreciate any help!
typedef enum
{
ADC_CHANNEL_0,
ADC_CHANNEL_WARMER_I = ADC_CHANNEL_0,
ADC_CHANNEL_RTD1,
ADC_CHANNEL_WARMER_ID,
ADC_CHANNEL_MOTOR_I,
ADC_CHANNEL_SUPPLY_V,
ADC_CHANNEL_CARTRIDGE, // BAH new design
ADC_CHANNEL_DOOR, // BAH new design
ADC_CHANNEL_COUNT,
} ADC_CHANNEL_t;
#define WARMER_I_CHANNEL (ADC_CTL_CH0)
#define RTD1_CHANNEL (ADC_CTL_CH17)
#define WARMER_ID_CHANNEL (ADC_CTL_CH18)
#define MTR_I_CHANNEL (ADC_CTL_CH2)
#define SUPPLY_CHANNEL (ADC_CTL_CH19)
#define CARTRIDGE_CHANNEL (ADC_CTL_CH3 )
#define DOOR_CHANNEL (ADC_CTL_CH1)
void adc_Initialize( void )
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
/* Enable the ADC1 Peripheral*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
GPIOPinTypeADC(GPIO_PORTE_BASE,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeADC(GPIO_PORTK_BASE,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
ADCSequenceDisable( ADC1_BASE, MAIN_SEQUENCE );
ADCHardwareOversampleConfigure( ADC1_BASE, SAMPLES_TO_AVERAGE );
ADCReferenceSet( ADC1_BASE, ADC_REF_INT );
ADCSequenceConfigure( ADC1_BASE, MAIN_SEQUENCE, ADC_TRIGGER_PROCESSOR, MAIN_SEQUENCE_PRIORITY );
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_WARMER_I, WARMER_I_CHANNEL);
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_RTD1, RTD1_CHANNEL);
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_WARMER_ID, WARMER_ID_CHANNEL);
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_MOTOR_I, MTR_I_CHANNEL);
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_CARTRIDGE, CARTRIDGE_CHANNEL );
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_DOOR, DOOR_CHANNEL );
ADCSequenceStepConfigure(ADC1_BASE, MAIN_SEQUENCE, ADC_CHANNEL_SUPPLY_V,
SUPPLY_CHANNEL | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable(ADC1_BASE, MAIN_SEQUENCE);
ADCIntClear(ADC1_BASE, MAIN_SEQUENCE);
}
void adc_StartScan( void )
{
/* Trigger the next ADC conversion. */
ADCProcessorTrigger( ADC1_BASE, MAIN_SEQUENCE );
}
void adc_ReadScan( void )
{
int i;
uint32_t *raw;
ADCScale_t *scale;
uint32_t rid;
uint32_t *converted;
int32_t temp;
if ( ADCIntStatus( ADC1_BASE, MAIN_SEQUENCE, false ) )
{
/* Clear Interrupt Flag and Read Data */
ADCIntClear( ADC1_BASE, MAIN_SEQUENCE );
ADCSequenceDataGet( ADC1_BASE, MAIN_SEQUENCE, rawADC );
raw = rawADC;
converted = convertedADC;
scale = ADCScale;
rid = FULL_SCALE - rawADC[ADC_CHANNEL_WARMER_ID];
for ( i = 0 ; i < sizearray(rawADC) ; ++i )
{
// Offset is applied before the shift to get extra precision
// Adding 1 << (shift - 1) rounds the result.
temp = *raw * scale->gain;
if ( temp >= scale->offset )
{
*converted = (temp - scale->offset + (1 << (scale->shift - 1))) >> scale->shift;
}
else
{
*converted = 0;
}
++raw;
++converted;
++scale;
}
// Finish up the warmer RID calculation with rounding.
convertedADC[ADC_CHANNEL_WARMER_ID] =
(((convertedADC[ADC_CHANNEL_WARMER_ID] + rid / 2) / rid) + (1 << (RID_LOG_PRESCALE - 1))) >> RID_LOG_PRESCALE;
}
}