2015-02-17 4 views
0

Я пытаюсь измерить некоторые каналы АЦП с тем же секвенсором. Я взял базу в главе 5 Texas Tiva's ARM Cortex-M4 Workshop. Итак, мой (прерывистая) исходный код работает отлично:Tiva ADC Sequencer с различными источниками шагов

#include <stdint.h> 
#include <stdbool.h> 
#include "inc/hw_memmap.h" 
#include "inc/hw_types.h" 
#include "inc/hw_ints.h" 
#include "driverlib/sysctl.h" 
#include "driverlib/adc.h" 
#include "driverlib/interrupt.h" 
#include "driverlib/gpio.h" 
#include "driverlib/pin_map.h" 

uint32_t ui32ADC0Value[4]; 

volatile uint32_t ui32TempAvg; 
volatile uint32_t ui32TempValueC; 

int main(void) { 

    SysCtlClockSet(
    SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_SYSDIV_5); 

    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); 
    SysCtlPeripheralReset(SYSCTL_PERIPH_ADC0); 

    ADCSequenceDisable(ADC0_BASE, 1); 
    ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); 

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); 
    GPIOPinTypeADC(GPIO_PORTD_BASE, 
    GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); 

    ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS); 
    ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS); 
    ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS); 
    ADCSequenceStepConfigure(ADC0_BASE, 1, 3, 
    ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); 

    IntEnable(INT_ADC0SS1); 
    ADCIntEnable(ADC0_BASE, 1); 
    ADCSequenceEnable(ADC0_BASE, 1); 

    IntMasterEnable(); 

    while (1) { 
     ADCProcessorTrigger(ADC0_BASE, 1); 
    } 

} 

void ISRHandler(void) { 

    while (!ADCIntStatus(ADC0_BASE, 1, false)){}; 

    ADCIntClear(ADC0_BASE, 1); 
    ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value); 

    ui32TempAvg = ui32ADC0Value[3]; 

    ui32TempValueC = (1475 - ((2475 * ui32TempAvg))/4096)/10; 

} 

Однако, если я изменю эту часть

ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 3, 
     ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); 

этой части (так шаги от 0 до 2 читать другие каналы, вместо ADC_CTL_TS) , где мои аналоговые каналы контактный заземлен (поэтому измерение будет читать вблизи нуля):

ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH7); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH6); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH5); 
ADCSequenceStepConfigure(ADC0_BASE, 1, 3, 
     ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); 

шаг 3 (где я измерить ADC_CTL_TS) сходит с ума, г угловые значения совершенно некогерентные. Кроме того, при поиске в отладке измерение TS выглядит как «ходьба» по другим шагам, потому что, когда 3 из них близки к 0, другая «движущаяся» намного больше. Это похоже на временное несоосность.

Почему и как его исправить? Благодарю.

ответ

2

АЦП-секвенсор Tiva C считывает образцы в выделенный FIFO, который имеет разную глубину для разных секвенсоров. В вашем случае (SS1) глубина FIFO равна 4. Теперь давайте посмотрим, как вы запускаете АЦП. Вы запускаете ADCProcessorTrigger в своем основном цикле без каких-либо задержек или синхронизации с чтением АЦП, даже без проверки предыдущего преобразования. Таким образом, по мере поступления образцов они постоянно «выталкивают» предыдущие образцы из FIFO, и FIFO легко выходит из синхронизации (например, образец с канала i будет смещен в другое место в FIFO или даже выталкивается.). Таким образом, правильным способом было бы инициировать преобразование ПОСЛЕ того, как данные из FIFO считываются полностью, и это делается в прерывании. Поэтому я рекомендую положить часть ADCProcessorTrigger рядом с концом обработчика прерываний (и начальный триггер в main).

+0

Фантастический. Это сработало. – Rego

+0

И в том случае, когда я использую ADC_TRIGGER_ALWAYS, без триггера процессора, где его исправить? – Rego

+0

Я никогда не работал с этим режимом и считаю, что это не очень полезно для этого способа работы. IMO это может быть достаточно для одноканальной выборки или операции DMA (или если вы действительно уверены в ваших таймингах). На самом деле, я считаю, что это будет работать в вашем случае. –