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.

Problem with ADC triggered by PWM in TM4C1294

Other Parts Discussed in Thread: EK-TM4C1294XL

Hello people.

I search a lot in the forum and in the internet, but I don't a solution to my problem. I need to trigger the ADC with the PWM, but the code that I developed to do this, don't work! Get stuck in the function while(!ROM_ADCIntStatus(ADC0_BASE, 0, false)). Could you guys help me? I'm using the Connected LaunchPad EK-TM4C1294XL.

#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/pwm.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_adc.h"
#include "driverlib/debug.h"
#include "driverlib/adc.h"
#include "driverlib/fpu.h"
uint32_t ui32PWM_Wi=0;
uint32_t g_ui32SysClock = 0;
uint32_t pui32ADC0Value[1];

#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
//*****************************************************************************
//
// The interrupt handler for the for PWM0 interrupts.
//
//*****************************************************************************
void
PWM0IntHandler(void)
{
    //
    // Clear the PWM0 LOAD interrupt flag.  This flag gets set when the PWM
    // counter gets reloaded.
    //
    PWMGenIntClear(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);

    //set the value that the ADC convert
    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, ui32PWM_Wi);
}

//*****************************************************************************
//
// Configure PWM0 for a load interrupt.  This interrupt will trigger everytime
// the PWM0 counter gets reloaded.
//
//*****************************************************************************
void
ConfigureADC0(void)
{
    //
    // Enable clock to ADC0.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

    ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);

    ROM_IntDisable(INT_ADC0SS0);
	ROM_ADCIntDisable(ADC0_BASE,0);
	ROM_ADCSequenceDisable(ADC0_BASE,0);
    //
    // Configure ADC0 Sample Sequencer 0 for processor trigger operation.
    //
    ROM_ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PWM0, 0);

    //
    // Configure ADC0 sequencer 0 for a single sample of the temperature
    // sensor.
    //
    ROM_ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_IE |
                                 ADC_CTL_END);

    //
    // Enable the sequencer.
    //
    ROM_ADCSequenceEnable(ADC0_BASE, 0);

    ROM_ADCHardwareOversampleConfigure(ADC0_BASE,64);

    //
    // Clear the interrupt bit for sequencer 0 to make sure it is not set
    // before the first sample is taken.
    //
    ROM_ADCIntClear(ADC0_BASE, 0);

    ROM_ADCIntEnable(ADC0_BASE,0);//ativa interrupção do ADC

    ROM_IntEnable(INT_ADC0SS0);
}

void IntADC0Handler(void)
{
	//
	// Read the analog voltage measurement.
	//
	ROM_ADCIntClear(ADC0_BASE, 0);
	ROM_ADCSequenceDataGet(ADC0_BASE, 0, pui32ADC0Value);
}
void Configure_PWM0(void)
{
	//
	// Set the PWM clock to the system clock.
	//
	SysCtlPWMClockSet(SYSCTL_PWMDIV_1);

	//
	// The PWM peripheral must be enabled for use.
	//
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

	//
	// For this example PWM0 is used with PortF Pin1.  The actual port and pins
	// used may be different on your part, consult the data sheet for more
	// information.  GPIO port F needs to be enabled so these pins can be used.
	//
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

	//
	// Configure the GPIO pin muxing to select PWM00 functions for these pins.
	// This step selects which alternate function is available for these pins.
	// This is necessary if your part supports GPIO pin function muxing.
	// Consult the data sheet to see which functions are allocated per pin.
	//
	ROM_GPIOPinConfigure(GPIO_PF1_M0PWM1);

	//
	// Configure the PWM function for this pin.
	// Consult the data sheet to see which functions are allocated per pin.
	//
	ROM_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);

	//
	// Configure the PWM0 to count down without synchronization.
	//
	ROM_PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

	//
	// Set the PWM period to 6kHz.  To calculate the appropriate parameter
	// use the following equation: N = (1 / f) * SysClk.  Where N is the
	// function parameter, f is the desired frequency, and SysClk is the
	// system clock frequency.
	// In this case you get: (1 / 6kHz) * 120MHz = 20000 cycles.  Note that
	// the maximum period you can set is 2^16.
	//
	ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 20000);

	//
	// For this example the PWM0 duty cycle will be variable.  The duty cycle
	// will start at 0 (0 * 64000 cycles = 0 cycles) and will increase
	// with the value converted with the ADC (ADC_VALUE * 64000 cycles = X cycles).
	// The duty cycle varies with the converted value of the ADC.  This dynamic adjustment of the pulse
	// width is done in the PWM0 load interrupt, which increases the duty
	// cycle everytime the reload interrupt is received.
	//
	ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, 20);

	//
	// Enable processor interrupts.
	//
	ROM_IntMasterEnable();

	//
	// Allow PWM0 generated interrupts.  This configuration is done to
	// differentiate fault interrupts from other PWM0 related interrupts.
	//
	ROM_PWMIntEnable(PWM0_BASE, PWM_INT_GEN_0);

	//
	// Enable the PWM0 LOAD interrupt on PWM0.
	//
	ROM_PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);

	//
	// Enable the PWM0 interrupts on the processor (NVIC).
	//
	ROM_IntEnable(INT_PWM0_0);

	//
	// Enable the PWM0 output signal (PF1).
	//
	ROM_PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, true);

	//
	// Enables the PWM generator block.
	//
	ROM_PWMGenEnable(PWM0_BASE, PWM_GEN_0);
}
int
main(void)
{
	//Set clock to 120MHz
	g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
		                                             SYSCTL_OSC_MAIN |
		                                             SYSCTL_USE_PLL |
		                                             SYSCTL_CFG_VCO_480), 120000000);
	ROM_FPUEnable();    //Enable Hardware Floating Point Unit
	ROM_FPUStackingEnable();    //Enable floating point operation ins ISRs
	ConfigureADC0();
	Configure_PWM0();

    //
    // Loop forever while the PWM signals are generated and PWM0 interrupts
    // get received.
    //
    while(1)
    {
		//
		// Wait for the ADC to finish taking the sample
		//
		while(!ROM_ADCIntStatus(ADC0_BASE, 0, false))
		{
		}
		//
		// Clear the interrupt
		//
		ROM_ADCIntClear(ADC0_BASE, 0);


		//
		// Set the new value cycle of the PWM - The value 4.884005 is because the max adc value
		//is 4095 by 20000 that is the value max cycles value of the PWM
		//
    	ui32PWM_Wi = (int)pui32ADC0Value[0]*4.884005;
    }
}

Thanks a Lot!!!