This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 240kHz 的 ADC 采样

Guru**** 2348500 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/609441/adc-sampling-at-240khz

器件型号:EK-TM4C123GXL

编辑:删除了 SLEE(),因为它与问题无关。

编辑:包含相关的预处理器定义并清理了代码表示。

编辑:修复了 SysTick 初始化问题、不影响该问题。

我正在尝试以240kHz 的频率通过 ADC 收集数据、不确定我是否正在正确设置时钟和计时器...  我一直在输入10kHz 正弦波、并获取 看起来频率高得多的数据(大约100kHz)。  有人能否验证下面的配置代码、或者准确解释 SysCtlClockSet()和 TimerLoadSet()的工作原理(如中所示,输入到它们的数字如何转换为时钟和计时器频率)?

当我运行 SysCtlClockGet ()时、我得到80 MHz、最大时钟频率。 为了查看输入、我一直将样本放入全局 uint32_t dataBuffer 并绘制它的图形。

#include 
#include 
#include 
#include 
#include 

#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/SysTick .h"
#include "driverlib/timer.h"





#include "inc/hw_adc.h"#include "hw_map_inc/inc/h
//
//预处理器定义
//在此处调整##个参数!! ##//

//*********

//编程器设计的参数(请勿触摸)
#define SAMPLE_RATE 240000 // Hz

#define ADC_SEQUENCER3

#define debug
//#undef debug

//*********
//
//全局变量
//
//*********

//调试变量
#ifdef debug
int gBufferIndex;
static uint32_t gDataBuffer[400];
#endif

//*********
//
//初始化/配置函数
//
//*********

//初始化全局变量。 //
空 InitGVariables()
{#ifdef
调试
//初始化调试变量。
gBufferIndex = 0;
#endif
}

//初始化时钟和计时器。 //
空 InitTiming()
{
//初始化时钟。
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);

//配置和启用计时器。
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0));
TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
TimerLoadSet (TIMER0_BASE、TIMER_A、SysCtlClockGet ()/SAMPLE_RATE);
TimerEnable (TIMER0_BASE、TIMER_A);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);

#ifdef 调试
//初始化 SysTick。
SysTickPeriodSet (10000000);
SysTickEnable();
#endif
}

//初始化 GPIO 引脚。 //
void InitGPIO()
{
//配置模拟输入引脚。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE));
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//引脚3对应于通道0
。}

//初始化 ADC。 //
void InitADC()
{
//配置 ADC 序列发生器。
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0));
ADCSequenceConfigure (ADC0_BASE、ADC_SEQUENCER, ADC_TRIGGER_TIMER、0);
ADCSequenceStepConfigure (ADC0_BASE、ADC_SEQUENCER、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);

//启用 ADC 中断。
IntEnable (INT_ADC0SS3);
ADCIntEnable (ADC0_BASE、ADC_SEQUENCER]);
IntMasterEnable();

//启用 ADC 序列发生器。
ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCER);
}

//*********
//
//中断处理程序
//
//*********

//处理 ADC 中断。 //
void ADC0Seq3IntHandler()
{#ifdef
debug
uint32_t numCycles = SysTickValueGet ();
#endif

//清除中断并获取样本
ADCIntClear (ADC0_BASE、ADC_SEQUENCER]);
uint32_t 采样;
ADCSequenceDataGet (ADC0_BASE、ADC_SEQUENCER,采样);

//处理数据样本。

#ifdef 调试
gBufferIndex =(gBufferIndex + 1)% 400;
gDataBuffer[gBufferIndex]=采样;

numCycles = SysTickValueGet ()- numCycles;
uint32_t 时钟速率= SysCtlClockGet ();
#endif
}

//*************
//
//主函数。
////
*****************
int main (void)
{
//初始化所有内容。
InitGVariables();
InitTiming();
InitGPIO();
InitADC();

while (1);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Laura Brandt"](1)以240kHz 的频率通过 ADC 收集数据。[/引用]

    [引用 user="Laura Brandt"](3)让处理器在样本之间睡眠(而不是运行连续 while (1)循环)[/quot]

    为什么!?

    即使是假设0处理、睡眠时间仅为几微秒。 睡眠和唤醒也需要时间。

    [报价用户="Laura Brandt]我不确定我是否正确设置了时钟和计时器...  我输入了10kHz 正弦波、并获得 了看起来频率高得多的数据(约为100kHz)。[/引述]

    让它工作而不会先入睡。 然后、您可以测量处理后剩余的实际空闲时间、并查看是否有任何原因在此方向关闭

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这正是问题的关键。 我提高了采样率、从未重新评估过睡眠理念。

    也就是说、我已恢复到 while (1)循环、它不会影响问题。 我的 ADC 仍然有一个奇怪的输出。 我希望这只是一个愚蠢的计时问题,我不能完全理解 SysCtlClockSet()和 TimerLoadSet()。 我主要从示例中复制代码、然后修改代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的代码演示缺少的一件事是 SAMPLE_RATE 的定义。

    BTW (如果使用富格式和代码通过图标) 代码更易于阅读。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经包含了更多的代码、希望所有相关的内容都在这里。
    此外、我发誓我的原始代码有一条终止新行!

    您可以说、我没有太多经验。 很抱歉造成混乱和浪费了太多时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Laura Brandt"] SysTickPeriodSet (16777216);[/quot]

    该值超过"1"- SysTick 的24位(最大值)。    不可能是您问题的原因-但值得提及。

    海报 Robert 倡导您运用"亲吻"、这种亲吻最常用于"加快、简化和增强"您的开发工作。

    您曾质疑(定时器和 SysTick)的操作-"kiss"会让您在每个 GPIO 到期时"切换"一个简单的 GPIO、然后您的示波器会轻松启用"周期测量"。