我试着用同样的排序器测量一些ADC通道。我根据得克萨斯州蒂瓦手臂皮质-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);第三步(我测量的是ADC_CTL_TS)变得疯狂,量程值完全不一致。另外,在调试中,TS的度量看起来就像是“步行”通过其他步骤,因为当其中3个步骤接近于0时,另一个“移动步骤”要大得多。看上去像是时间上的偏差。
为什么,怎么解决呢?谢谢。
发布于 2015-02-17 15:07:54
Tiva C的ADC排序器正在将样本读取到专用FIFO中,它对于不同的排序器具有不同的深度。在你的例子(SS1)中,FIFO的深度是4。现在让我们看看如何触发ADC。您正在主循环中运行ADCProcessorTrigger,没有任何延迟或与ADC读取的同步,即使没有检查之前的转换是否已经完成。因此,由于样本是传入的,它们不断地从FIFO中“推出”以前的样本,并且FIFO很容易失去同步(例如,来自通道i的样本将被移到FIFO中的其他地方,甚至被推开)。因此,正确的方法是在FIFO中的数据被完全读取并在中断中完成后触发转换。因此,我建议将ADCProcessorTrigger部分放在中断处理程序的末尾附近(以及main中的初始触发器)。
https://stackoverflow.com/questions/28563492
复制相似问题