簡體   English   中英

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

[英]Tiva ADC Sequencer with different step sources

我正在嘗試用相同的音序器測量一些ADC通道。 我在Texas Tiva的ARM Cortex-M4研討會的第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的測量看起來像是“走”通過其他步驟,因為當其中3個接近0時,另一個“移動的”要大得多。 它看起來像是一個暫時的錯位。

為什么,以及如何解決它? 謝謝。

Tiva C的ADC序列發生器正在將樣本讀入專用FIFO,該FIFO具有不同深度,適用於不同的序列發生器。 在您的情況下(SS1),FIFO深度為4.現在讓我們看看如何觸發ADC。 您正在主循環中運行ADCProcessorTrigger ,即使沒有檢查先前的轉換也沒有任何延遲或與ADC讀取同步。 因此,當樣本進入時,它們不斷地從FIFO中“推出”先前的樣本,並且FIFO很容易失去同步(例如,來自通道i的樣本將被移位到FIFO中的其他位置,甚至推出。)。 因此,正確的方法是在完全讀取FIFO的數據后觸發轉換,並在中斷中完成。 所以我建議將ADCProcessorTrigger部分放在中斷處理程序的末尾附近(以及main的初始觸發器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM