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.

[参考译文] TM4C1294NCPDT:ADC 采样频率和时钟

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/782733/tm4c1294ncpdt-adc-sampling-frequency-and-clock

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C123

您好!  

这是名称。  

我想将 ADC 采样频率增加到超过1MHz。 但高于600kHz 的频率不会增加。

我同时使用 ADC0和 ADC1两个模块、我使用 timer0作为触发器、我正在处理轮询。

这里有一些问题。

 1、为什么采样频率增加不超过1MHz?

2. 我想使用外部振荡器以32MHz 的频率运行 ADC 时钟。 我能否按如下所示使用 API?

 'ADC_CLOCK _SRC_PLL'是什么意思?  

ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为在480MHz 除以15时使用 PLL 以获得32MHz 的 ADC 时钟
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15以获得32MHz 的 ADC 时钟。

3、 'ADC_REF_EXT_3V'在下面的代码中是什么意思?

ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V)

以下是我的代码。

---------------------------------------- 函数-------------------------------------------------------

空 ADCInit()

uint32_t SamplePeriod = 0;
//初始化 ADC
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC0外设
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);//ADC1外设
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);// ADC 触发器
SysCtlDelay (10);

ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15即可获得 ADC
// 32MHz 时钟。
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15即可获得 ADC
// 32MHz 时钟。
SysCtlDelay (10);//设置时钟配置的时间

用于 ADC 通道的//引脚
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
ADCSequenceConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC1_base、ADC_SEQUENTER_NUMBER、ADC_TRIGGER_TIMER、0);

ADCSequenceStepConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);//差分模式、Timer0触发器
ADCSequenceStepConfigure (ADC1_BASE、ADC_SEQUENSE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);//差分模式、Timer0触发器
ADCHardwareOversampleConfigure (ADC0_BASE、g_ui32AdcOverSamplingNumber);
ADCHardwareOversampleConfigure (ADC1_base、g_ui32AdcOverSamplingNumber);

ADCIntClear (ADC0_BASE、ADC_SEQUENCE_NUMBER);// ADC0中断标志清零
ADCIntClear (ADC1_base、ADC_SEQUENCE_NUMBER);// ADC1中断标志清零

TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);
SamplePeriod = g_ui32SysClock / 800000;//计算500kHz 的时间周期

TimerLoadSet (TIMER0_BASE、TIMER_A、SamplePeriod - 1);//采样频率
TimerEnable (TIMER0_BASE、TIMER_A);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
TimerControlStall (TIMER0_BASE、TIMER_A、TRUE);//通过在断点停止计时器来帮助调试

ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);// ADC0外部基准电压设置
ADCReferenceSet (ADC1_base、ADC_REF_EXT_3V);// ADC0外部基准电压设置
ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCSequenceEnable (ADC1_base、ADC_SEQUENSE_NUMBER);

void ADCAcquire_Org (uint32_t ADCDataLength)

uint32_t ui32ADCCurrentIndex = 0;

ADCEnable();// ADC 启动
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、GPIO_PIN_0);
for (ui32ADCCurrentIndex=0;ui32ADCCurrentIndex < ADCDDataLength /2;ui32ADCCurrentIndex++)

ADCIntClear (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntClear (ADC1_base、ADC_SEQUENCE_NUMBER);
while (!ADCIntStatus (ADC0_BASE、ADC_SEQUENCE_NUMBER、0));
while (!ADCIntStatus (ADC1_base、ADC_SEQUENCE_NUMBER、0));

G_ui16AdcRawData[2*ui32ADCCurrentIndex + 0]=(Q15_t) HWREG (ADC0_BASE + ADC_O_SSFIFO3);
G_ui16AdcRawData[2*ui32ADCCurrentIndex + 1]=(Q15_t) HWREG (ADC1_BASE + ADC_O_SSFIFO3);

//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、0);
ADCDisable();// ADC 停止

void ADCEnable()


ADCIntEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntEnable (ADC1_base、ADC_SEQUENCE_NUMBER);

void ADCDisable()

ADCIntDisable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntDisable (ADC1_base、ADC_SEQUENCE_NUMBER);

---------------------------------------- 主----------------------------------------------------

int main (空)

 G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、TM4C129_MAIN_CLK);

FPUEnable();
FPULazyStackingEnable();

 IntMasterEnable();// 20190312_LNH,全局中断使能

while (1)

ADCAcquire_Org (FFT_Points);// 20190312_LNH

ARM_Q15_TO_float (g_ui16AdcRawData、g_ui32AdcRawData、FFT_Points);// 20190312_Lnh、整数到浮点变化。
对于(i = 0;i < FFT_points;i++) g_ui32AdcRawData[i]= g_ui32AdcRawData[i]* FloatScale;// 20190312_Lnh、缩放整数到浮点
DELAY_ms (1);// 20190312_LNH

   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉。 我忘记了一件事。 ADCInit ()位于 main()中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Namha、

    这个主题是在一段时间前提出的、我们的一位工程师找到了使 ADC 运行速度高达2MSPS 的解决方案、请参阅此主题、其中他提供了使 ADC 运行速度高于1MSPS 所需的完整代码: e2e.ti.com/.../2545036
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、  

    在发布我的问题之前、我查看并应用了您推荐的问题。但没有变化。

    还有其他解决方案吗?

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

    您能否使用 Bob 建议的修复程序发布您的最新代码以便我查看?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void ADCInit()
    {
    uint32_t SamplePeriod = 0;
    //初始化 ADC
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC0外设
    PeripheralEnable (SYSCTL_Periph_ADC1);//ADC1外设
    SysCtlSysCtlSysCtlSysCtl(SYSCBLE_ADC0);// ADC10_TRUSC0 (SYSCTOL
    
    
    ) PeripheralEnable (SYSCTRK);ADC10_CL_ADC0 (SYSCTRIP_CL_CL_CL_CLK);ADC10_CL_CL_CL_ADC0 (ADCLOCK (Δ t)
    //时钟配置设置
    
    IntDisable (INT_ADC0SS3)、
    IntDisable (INT_ADC1SS3)、
    ADCIntDisable (ADC0_BASE、0U)、
    ADCIntDisable (ADC1_BASE、 0U);
    ADCSequenceDisable (ADC0_BASE、0U);
    ADCSequenceDisable (ADC1_BASE、0U);
    //禁用序列后、现在可以安全地加载新的配置参数
    
    //用于 ADC 通道
    的引脚 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | ADC0_QUEST_QUESD_)
    ;GPIO_PIN_ADC0_TRIGGER (GPIO_SERILE_AD0_AD0_ADC0_CAST_CAL_ADC0_QUEST_QUEST_PROTrigger) //优先级0
    ADCSequenceConfigure (ADC1_base、ADC_Sequence_Number、ADC_TRIGGER_TIMER、1);//优先级1
    ADCequenceStepConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_BASE、ADC1_TRIGGER NUMBER / ADCK_END
    、ADC1_END、ADC1_DETHRESHOLD (ADC0) ADC_CTL_D | ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);//差动模式、Timer0触发
    
    器 TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD);//差动模式、Timer0触发
    
    器时钟800000 (TIMER0_BASE
    、TIMER0)、TIMER0 (TRIM_TIMER0)、TIMER0 (TRIM_TIMER
    
    0)、TIMER0 (TRIBASE);Timer0 (TRIMTimer0) Timer0 (TRIMTimer0) Timer0 (TRIMTimer0 (TRIMTimerA)、TRIMTimer0 (TRIBAL)、TIMER1 (TRIMTimer0)、
    TimerControlStall (TIMER0_BASE、TIMER_A、TRUE);//通过在断点处停止计时器来辅助调试
    
    ADCequenceSet (ADC0_BASE、ADC_REF_EXT_3V);// ADC0外部基准电压设置
    ADC1_base、ADCREF_EXT_External);// ADC0外部基
    准电压设置 ADC0 (ADCK_QUESCASE、ADC0);ADC0 (ADCK_QUESCK_CONTRACASE (ADC0);// ADC0
    (ADCCP_QUESD_BASE);ADC0 (ADCK_REQUESD_BASE (ADC3V);ADCASE (ADCK_ADCK_
    adc_seque_number);// ADC0中断标志清除
    ADCIntClear (adc1_base、adc_seque_number);// ADC1中断标志清除
    IntEnable (INT_ADC0SS3);
    IntEnable (INT_ADC1SS3);
    }
    
    void ADCEnable ()
    {
    ADCIntEnable (ADC0_BASE、adc = ENCE=
    
    
    
    
    (INT_SEQUENCE==);=== ENABLE_ADCNumber=
    
    
    
    ====(ADC=END== ADC=END=)=== ADC=ENABLE=(END==== ADC=END= ADC=END=(END=);= ADC=END== ADC=END=== ADC=END=== ADC=END=(END= ADC=END=(END=)==== ADC=END= ADC=END=(END=)== ADC=END====
    
    Main ================================================================================================================================
    
    int main (void)
    {
    int i;
    g_ui32SysClock = map_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_320)、TM4C129_MAIN_CLK);// TM4C129_UST_P48k (=
    
    
    使能引脚);//使能引脚120000 (PuF (= PuF)。
    
    
    
    
    。
    
    。
    
    ADCInit ();
    
    ADCEnable ();//用于测试 ADC 函数
    
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
    
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_1、 0);
    IntMasterEnable ();// 20190312_LNH、Global Interrupt Enable
    
    while (1)
    {
    
    }
    
    
    void ADC0SS3IntHandler (void)
    {
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、GPIO_PIN_0);// LED
    Cleg_u16AdcData[2 uRUSC32+
    ADC0_BASE
    (GPIO_0)+ ADC32+ ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC2000_CLUS_CLUS_CLUS_CLIST+ AD0+ AD0+ ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC0 + ADC0
    
    if (ui32ADCCurrentIndex_0 >=2048)
    {
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);// LED 切换
    //HWREG (GPIO_PORTD_BASE + GPIO_PIN_0)= 0x00;
    ui32ADCCurrentIndex_0 = 0;
    }u32CC1+
    
    
    ADCC1 + UCC1 + ADCC1 + UCC1 = 0 = 0 = 0 + ADCC1 + ADCC1 + ADCC1 void
    
    + ADC1 + AD1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + AD1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1 + ADCC1
    
    // ADC 中断状态并清除
    if (ui32ADCCurrentIndex_1 >=2048)
    {
    ui32ADCCurrentIndex_1 = 0;
    }
    

    您好, Ralph,  

    上面的代码是使用 Bob 代码的代码。  

    几个月前使用 tm4c123测试了使用 samplesquence 的中断方法。 当时、只有 ADC0SS3IntHandler 工作、ADC1SS3IntHandlers 不工作。 我这次测试的 tm4c1294的结果也相同。

    ADC0和1采样序列中断不能同时运行?

    我想确保 ADC0和 ADC1两个模块同时具有高于1MHz 的采样频率。

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

    我需要向 Bob 咨询有关能够使两个模块以1MHz 运行的部分。 理论上、由于一个模块可以达到2MSPS、我认为两个模块能够以1MSPS 运行、但可能存在一些我不知道的限制因素。 此外、我不确定您是否可以使用同一个计时器触发两个模块。

    对于您看到的速度、请发表以下几点意见:

    1) TimerEnable (TIMER0_BASE、TIMER_A);应用于触发 ADC、因此我建议在设置结束时调用该函数。

    2) 2)您拥有的 ISR 相当不错、ADC0运行得非常快、这会降低处理速度。 Bob 专门使用了一个极细的 ISR 来维持高采样率(在他的案例中为2MSPS)、如果您想以1MSPS 运行两个模块、我担心您会为此花费太多时间。 鉴于您正在尝试在此处执行非常高速的读数、我认为您需要将 ISR 降至最低。

    通过修整 ISR (也许开始时会移除 LED 切换?)、看看是否至少可以将 ADC0速率提高到1MSPS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Namha、

    我和 Bob 交谈、他认为没有任何原因使两个 ADC 无法同时以您所需的速度运行。 让我们首先尝试简化一下、如前所述、我希望您看看是否可以使 ADC0加速到您的水平。 您可以尝试更改并使 ADC0以1MSPS 运行吗?

    然后、在完成后、还要测试您是否仅运行 ADC1而不运行 ADC0、您还可以获得1MSPS 的 ADC1。 如果这两个模块都以您所需的速率运行、请再次尝试并一起使用、如果这两个模块最终仍然存在问题、那么我们至少可以从此处进行调查、了解各个 ADC 模块的工作是否符合预期。