Lỗi ADC

Em dùng ADC để đọc giá trị điện áp từ chân PE1. Không hiểu sai chỗ nào mà không chạy?... Mong các anh chị giúp đỡ..
Code:
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
uint32_t adcValue[1];
void IntADCHandler(void)
{
    ADCIntClear(ADC1_BASE,3);
    ADCSequenceDataGet(ADC1_BASE,3,adcValue);
}
int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
    GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_1);
    ADCSequenceDisable(ADC0_BASE,3);
    ADCSequenceConfigure(ADC1_BASE,3, ADC_TRIGGER_ALWAYS, 0);
    ADCSequenceStepConfigure(ADC1_BASE,3,0,ADC_CTL_CH2|ADC_CTL_IE|ADC_CTL_END);
    ADCSequenceEnable(ADC1_BASE,3);
    ADCReferenceSet(ADC1_BASE,ADC_REF_INT);
    ADCSequenceEnable(ADC1_BASE,3);
    ADCIntClear(ADC1_BASE,3);
    ADCIntEnable(ADC1_BASE,3);
    while(1)
    {
    }
}
 

Nguyen Minh Minh

Trứng gà
Bạn mới chỉ cấu hình ADC thôi mà chưa xử lý dữ liệu nhé. Hơn nữa theo mình đoạn chương trình ngắt sẽ không chạy đâu. Bạn tham khảo code bên dưới nhé.


#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#define TARGET_IS_BLIZZARD_RB1
#include "driverlib/rom.h"
#include "driverlib/gpio.h"


int main(void)
{
uint32_t ui32ADC0Value[4];
/*volatile uint32_t ui32TempAvg;
volatile uint32_t ui32TempValueC;
volatile uint32_t ui32TempValueF;*/

volatile uint32_t ui32PotentAvg;
volatile uint32_t ui32PotentValueOm;


ROM_SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64);

//Config E3 input ADC
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);

//Config F1 LED ouput
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);

ROM_ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE,1,3,ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ROM_ADCSequenceEnable(ADC0_BASE, 1);

while(1)
{
ROM_ADCIntClear(ADC0_BASE, 1);
ROM_ADCProcessorTrigger(ADC0_BASE, 1);

while(!ROM_ADCIntStatus(ADC0_BASE, 1, false))
{
}

ROM_ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);
ui32PotentAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4;
ui32PotentValueOm = (5000 * ui32PotentAvg) / 4096;

}
}
 
Bạn mới chỉ cấu hình ADC thôi mà chưa xử lý dữ liệu nhé. Hơn nữa theo mình đoạn chương trình ngắt sẽ không chạy đâu. Bạn tham khảo code bên dưới nhé.


#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#define TARGET_IS_BLIZZARD_RB1
#include "driverlib/rom.h"
#include "driverlib/gpio.h"


int main(void)
{
uint32_t ui32ADC0Value[4];
/*volatile uint32_t ui32TempAvg;
volatile uint32_t ui32TempValueC;
volatile uint32_t ui32TempValueF;*/

volatile uint32_t ui32PotentAvg;
volatile uint32_t ui32PotentValueOm;


ROM_SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64);

//Config E3 input ADC
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);

//Config F1 LED ouput
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);

ROM_ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE,1,3,ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ROM_ADCSequenceEnable(ADC0_BASE, 1);

while(1)
{
ROM_ADCIntClear(ADC0_BASE, 1);
ROM_ADCProcessorTrigger(ADC0_BASE, 1);

while(!ROM_ADCIntStatus(ADC0_BASE, 1, false))
{
}

ROM_ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);
ui32PotentAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4;
ui32PotentValueOm = (5000 * ui32PotentAvg) / 4096;

}
}
Cho mình hỏi muốn dùng ngắt ADC thì phải khai báo như thế nào?
 
Top