ADC đọc giá trị không chính xác.

Phạm Thành Danh

Thành Viên PIF
Chào anh chị!
Em viết code ngắt ADC để đọc giá trị nhiệt độ của LM35 nhưng giá trị mỗi lần đọc về là một giá trị khác nhau :gach. Em cắm xuống GND giá trị ADC vẫn thay đổi vù vù, a chị xem thử code giúp em với ạ :-s. Em tìm cách viết ADC bằng ngắt mà không thấy :gach
Code:
volatile uint32_t Temval;
volatile int ctemval;
uint32_t adcval[1];
void ADC_Config(void);
void ADCIRS(void);
 
void ADC_Config(void) {
    SysCtlPeripheralEnable (SYSCTL_PERIPH_ADC0);
    SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD);
    GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_7);
    ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH4);
    ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH4);
    ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH4);
    ADCSequenceStepConfigure(ADC0_BASE, 1,3,ADC_CTL_CH4|ADC_CTL_IE|ADC_CTL_END);
    ADCSequenceEnable(ADC0_BASE, 1);
    ADCProcessorTrigger(ADC0_BASE, 1);
    ADCIntEnable(ADC0_BASE, 1);
    ADCIntRegister(ADC0_BASE, 1, &ADCIRS);
    IntEnable (INT_ADC0SS1);
    IntMasterEnable();
    ADCIntClear(ADC0_BASE, 1);
}
void ADCIRS(void) {
  ADCIntClear(ADC0_BASE, 1);
    ADCProcessorTrigger(ADC0_BASE, 1);
    ADCSequenceDataGet(ADC0_BASE, 1, adcval);
    Temval = (adcval[0] + adcval[1] + adcval[2] + adcval[3]) / 4;
    ctemval = (int) ((100 * Temval) / 4095);
    if (ctemval > 30) {
        UARTwrite("f1",2);
    } else
        UARTwrite("f0",2);
 
    SysCtlDelay(SysCtlClockGet()/3/100);
}
 
Top