Tiva ADC定序器具有不同的步进源

时间:2015-02-17 14:18:50

标签: c arm embedded cortex-m

我尝试使用相同的音序器测量某些ADC通道。我在Texas Tiva's ARM Cortex-M4 Workshop的第5章中找到了基础。所以,我(中断的)原始代码完美运行:

#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的测量看起来像&#34; walking&#34;通过其他步骤,因为当其中3个接近0时,另一个&#34;移动一个&#34;更大。它看起来像是一个暂时的错位。

为什么以及如何解决?感谢。

1 个答案:

答案 0 :(得分:3)

Tiva C的ADC序列发生器正在将样本读入专用FIFO,该FIFO具有不同深度,适用于不同的序列发生器。在您的情况下(SS1),FIFO深度为4.现在让我们看看如何触发ADC。您正在主循环中运行ADCProcessorTrigger,即使没有检查先前的转换,也没有任何延迟或与ADC读取同步。因此,当样本进入时,它们不断地从FIFO中“推出”先前的样本,并且FIFO很容易失去同步(例如,来自频道i的样本将被移位到其中的某个其他位置。 FIFO,甚至推出。)因此,正确的方法是在完全读取FIFO的数据后触发转换,并在中断中完成。所以我建议将ADCProcessorTrigger部分放在中断处理程序的末尾(以及main中的初始触发器)。