首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同阶跃源的Tiva ADC序列器

不同阶跃源的Tiva ADC序列器
EN

Stack Overflow用户
提问于 2015-02-17 14:18:50
回答 1查看 4.6K关注 0票数 1

我试着用同样的排序器测量一些ADC通道。我根据得克萨斯州蒂瓦手臂皮质-M4车间的第5章做了一个基础。因此,我的(中断的)原始代码工作得很好:

代码语言:javascript
复制
#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;

}

但是如果我改变了这个部分

代码语言:javascript
复制
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),我的模拟引脚通道被接地(因此测量值将读到接近于零):

代码语言:javascript
复制
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);

第三步(我测量的是ADC_CTL_TS)变得疯狂,量程值完全不一致。另外,在调试中,TS的度量看起来就像是“步行”通过其他步骤,因为当其中3个步骤接近于0时,另一个“移动步骤”要大得多。看上去像是时间上的偏差。

为什么,怎么解决呢?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 15:07:54

Tiva C的ADC排序器正在将样本读取到专用FIFO中,它对于不同的排序器具有不同的深度。在你的例子(SS1)中,FIFO的深度是4。现在让我们看看如何触发ADC。您正在主循环中运行ADCProcessorTrigger,没有任何延迟或与ADC读取的同步,即使没有检查之前的转换是否已经完成。因此,由于样本是传入的,它们不断地从FIFO中“推出”以前的样本,并且FIFO很容易失去同步(例如,来自通道i的样本将被移到FIFO中的其他地方,甚至被推开)。因此,正确的方法是在FIFO中的数据被完全读取并在中断中完成后触发转换。因此,我建议将ADCProcessorTrigger部分放在中断处理程序的末尾附近(以及main中的初始触发器)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28563492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档