gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:00 24 4
gpt4 key购买 nike

我正在尝试使用相同的序列器测量一些 ADC channel 。我以 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 读取其他 channel ,而不是 ADC_CTL_TS),其中我的模拟引脚 channel 接地(因此测量读数接近零):

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,不同定序器具有不同的深度。在您的情况 (SS1) 中,FIFO 深度为 4。现在让我们看看如何触发 ADC。您正在主循环中运行 ADCProcessorTrigger,没有任何延迟或与 ADC 读取同步,甚至没有检查之前的转换是否已完成。因此,随着样本的传入,它们不断地从 FIFO 中“推出”先前的样本,并且 FIFO 很容易失去同步(例如,来自 channel i 的样本将被转移到其他一些放在 FIFO 中,甚至推出。)。所以正确的方法是在FIFO中的数据被完全读取后触发转换,并且在中断中完成。所以我建议将 ADCProcessorTrigger 部分放在中断处理程序的末尾附近(并将初始触发器放在 main 中)。

关于c - 具有不同步进源的 Tiva ADC 定序器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com