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.

[参考译文] CCS/LAUNCHXL-F28377S:2837x_rfft_adc_RT

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/593143/ccs-launchxl-f28377s-2837x_rfft_adc_rt

器件型号:LAUNCHXL-F28377S

工具/软件:Code Composer Studio

您好!

我对“2837x_rfft_adc_RT”有一些疑问:

1-I 未找到 ADC_SAMPLING_FREQ 变量初始化、它的值是多少?

#define F_PER_SAMPLE  (ADC_SAMPLING_FREQ/(float) RFFT_SIZE)

2- main.c:

(笑声)

//! 外部连接:

//! 将 A0 (引脚9)连接到 F2837x controlCARD 上的 EPWM2A (引脚53)。 请参阅

//! 用于引脚定位的电路板原理图。

//! 请注意 、ADC 将以100KHz 对占空比为50%的1KHz 波形(EPWM2A)进行采样

//! 并在其上运行 FFT。 由于输入是方波、您将会看到

//! 请参见第5个单元处的基频1KHz  

//! (5*FS/N = 5*100K/512 = 976.5)及其所有奇次谐波。

(笑声)

EPWM2A 的频率为500Hz、当我将 EPWM2A 连接到 ADC 引脚 A0时、

FREQ = F_PER_SAMPLE *(float) j;

输入信号的频率为500Hz、但 CCS 中的最终值为、freq = 976.5  

为什么?

3-此示例的最大输入频率是多少? (考虑2*f 奈奎斯特速率)

  f_input_maximum=? kHz

谢谢、此致、

Amin

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

    您好!

    [引用 user="Amin"]

    1-I 未找到 ADC_SAMPLING_FREQ 变量初始化、它的值是多少?

    #define F_PER_SAMPLE  (ADC_SAMPLING_FREQ/(float) RFFT_SIZE)

    2- main.c:

    [/报价]

    examples_setup.h 中定义了 ADC_SAMPLING_FREQ

    [引用 user="Amin"]

    EPWM2A 的频率为500Hz、当我将 EPWM2A 连接到 ADC 引脚 A0时、

    FREQ = F_PER_SAMPLE *(float) j;

    输入信号的频率为500Hz、但 CCS 中的最终值为、freq = 976.5  

    为什么?

    [/报价]

    我认为 EPWM2A 的设置存在问题。 它应该输出1KHz 信号-它将在库的下一个修订版上进行修复。  EPWM2A 生成1KHz 信号后、您应该会在频谱的第5个数据单元中看到峰值、以及周围数据单元中的一些泄漏。

    [引用 user="Amin"]

    3-此示例的最大输入频率是多少? (考虑2*f 奈奎斯特速率)

      f_input_maximum=? kHz

    [/报价]

    采样频率为100KHz、因此您应该能够根据奈奎斯特理论输入50kHz 信号。 但限制在于该特定器件上的 ADC 采样速度、您可能需要查看数据表。

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

    您好、Vishal、

    感谢你的帮助。
    我已经测试过使用外部信号测量频率:
    用于连接到-->引脚 A0的外部正弦或方形信号
    f_input = 500Hz  freq = 976.5625  j = 10
    f_input = 1KHz   freq = 2050.781  j = 21
    f_input = 5kHz  freq = 10058.59  j = 103

    f_input = 25KHz  freq = 49902.34 j = 511

    f_input = 30kHz  freq = 39843.75 j = 408
    f_input = 40KHz freq = 19824.22  j = 203

    FFT 点数= 1024
    我不明白、"freq"必须处于最大峰值信号。

    谢谢、致以最诚挚的问候
    Amin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vishal、
    为什么频率测量不正确(对于30kHz 及更高频率...)?
    谢谢、此致、
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想知道创建采样率的 ePWM 是否恰好为100KHz。 它看起来小于100KHz -您会看到大于30kHz 的混叠。

    尝试将采样 ePWM 转储到外部引脚、并通过示波器查看实际频率。

    "freq"尝试在您的输入中找到主信号。  

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

    我还想知道、因为根据奈奎斯特速率、在最高级别、我应该能够测量40kHz 信号(100KHz / 2.5 = 40KHz)、但结果不正确。

    信号发生器生成的 ADC PIN_A0输入信号。

    此致、

    Amin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vishal、
    如何解决此问题?
    感谢你的帮助。
    此致、
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以通过在计算 FFT 之前观察输入缓冲器来判断采样频率是否关闭。 因此、如果我在调用 FFT 时设置断点、

    while (1){
    while (flagInputReady = 0){};//等待 ADC ISR 设置该标志
    //然后再继续
    RFFT_ADC_F32 (HND_rfft_ADC);//计算实数 FFT (12位 ADC 输入)<--- 在此处设置断点
    flagInputReady = 0; //重置标志 

    您可以在图形中观察采样的波形。 在 CCS 的调试视图中,转到 Tools->Graph->Single Time,将采集缓冲器和数据大小设置为512,将数据类型设置为无符号16 int,并将起始地址设置为 RFFTin1Buff。 现在、如果您以30kHz 正弦波馈送、并且采样率正好为100KHz、您应该会看到输入的大约3.3 (100/30)个周期。 否则、这意味着采样率关闭。 我们需要查看 EPWM1A 的频率吗? 我想它的设置是在 GPIO0上输出-它是100KHz 吗?

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

    我使用了默认程序(2837x_rfft_adc_RT)、但 FFT 点之外的数字为1024pt (默认值:512pt)。

    examples_setup.h
    //*********
    #define CPU_FRQ_200MHz 1
    #define ADC_SAMPLING_FREQ 100000.0L
    #define ePWM_HSPCLKDIV 1 //ePWM_CLOCK 是 SYSCLK/(2*2)
    #define EPWM1_PERIOD 500
    #define EPWM1_DUTY 周期 250
    #define EPWM2_PERIOD 50000
    #define EPWM2_Duty_cycle 25000
    
    //*************
    
    
    main.c
    /*********
    #define RFFT_STACages 10
    #define RFFT_SIZE (1 << RFFT_STages)
    #define F_PER_SAMPLE (ADC_SAMPLING_FREQ/(float) RFFT_SIZE
    )#define USE_TEST_INPUT 1 //如果不在测试模式中、请务必排除 SIGNAL。asm
    //从构建
    #define Epsilon 0.1
    //********* 

    结果:

    输入信号:5kHz


    输入信号:10kHz

    输入信号:15kHz


     

    输入信号:25kHz


     

    输入信号:26KHz


     

    输入信号:30kHz

    感谢你的帮助。

    此致、

    Amin

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

    我在之前的帖子中犯了一个错误。 要计算在给定采样率下、您将在输入缓冲器中捕获多少个周期的输入、

    n_周期= N*(fi/fs)、其中 N 为 FFT 大小、fi 为输入频率、fs 为采样频率。

    因此、对于您的情况、N = 1024、FS = 100KHz (至少应该是这样)、让我们获取第一个输入 fi = 5kHz

      n_句 点 = 1024*(5e3/100e3)= 51.2个周期。

    现在、从您的第一幅图像开始、我在缓冲区的前196个点计算大约20个周期、因此、如果我将该周期扩展到整个缓冲区中大约(20 *(1024/196))~ 104.49个周期。 看起来我们没有以100KHz 采样

     Fs = N*(fi/n_句 点)= 1024*(5e3/104.49)= 49KHZ。

    我将假定我们以50kHz 的频率进行采样、这说明了超过25KHz 的所有输入都是错误的原因。

    EPWM1A 的设置存在问题。 让我稍微回顾一下示例、并弄清正确的配置是什么。

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

    好的、我认为我修正了它

    在 examples_setup.h 中、更改以下行

    #define CPU_FRQ_200MHz 1
    #define ADC_SAMPLING_FREQ 100000.0L
    #define ePWM_CLK 100000000UL // EPWM_CLK 从 SYSCLK/2
    #define ePWM_CLKDIV 启动 1 // TBCLK = SYSCLK/(2*2)
    #define ePWM_HSPCLKDIV 4. // = SYSCLK/(2*2*8)或 ePWM_CLK/(2*8)
    //所需频率100KHz
    #define EPWM1_PERIOD ePWM_CLK/(2*8*100000UL)
    #define EPWM1_DUTY EPWM1_PERIOD/2UL
    //所需频率10kHz
    #define EPWM2_PERIOD (ePWM_CLK)/(2*8*10000UL)
    #define EPWM2_Duty_cycle EPWM2_PERIODE/2UL 

    然后在 examples_setup.c 中添加这些行

    void FPU_initEPWM (void)
    {
    CpuSysRegs.PCLKCR2.bit.EPWM1 =1;//启用 EPWM1时钟
    CpuSysRegs.PCLKCR2.bit.EPWM2 =1;//启用 EPWM1时钟
    
    //启用 ePWM GPIO
    InitEPwm1Gpio();
    InitEPwm2Gpio();
    
    EALLOW;
    // ePWM 时钟分频器设置为/2
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;
    //关闭 ePWM 时钟
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    //禁用组上的 SOC
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;
    //在向上计数时选择 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;
    //在发生第一个事件时生成脉冲
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;
    //将比较 A 值设置为2000次计数
    EPwm1Regs.CMPA.bit.CMPA = EPWM1_DUTY;
    //将周期设置为4000个计数
    EPwm1Regs.TBPRD = EPWM1_PERIOD;
    //冻结计数器
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;
    //启用 SOCA
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1Regs.TBCTL.bit.CLKDIV = ePWM_CLKDIV;//<--- 添加行
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = ePWM_HSPCLKDIV;
    //禁用组上的 SOC
    EPwm2Regs.ETSEL.bit.SOCAEN = 0;
    //将比较 A 值设置为10000次计数
    EPwm2Regs.CMPA.bit.CMPA = EPWM2_Duty_cycle;
    //将周期设置为20000个计数
    EPwm2Regs.TBPRD = EPWM2_PERIOD;
    //冻结计数器
    EPwm2Regs.TBCTL.bit.CTRMODE = 3;
    EPwm2Regs.TBCTL.bit.CLKDIV = ePWM_CLKDIV;//<--- 添加行
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = ePWM_HSPCLKDIV;
    //清零 PWM1A
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
    //清零 PWM2A
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;
    
    EDIS;
    } 

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

    感谢您的最佳帮助。
    对于"examples_setup.h"中的建议更改、结果很好、例如:
    对于 ADC 引脚 A0的最大50kHz 输入信号,FREQ=49609.38 --- >大约"freq =输入信号的频率"(可接受)

    但是、当我更改"examples_setup.c"(添加两行)时、结果如下
    对于低于25KHz 的输入信号、如以前:
    "Freq = 2*输入信号频率"、结果是可以接受的。
    对于超过25KHz 的输入信号、
    与以前一样、结果不可接受(ADC 采样率= 50kHz)。

    ‌谢谢、致以最诚挚的谢意、
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vishal:

    如何解决此问题?

    ‌谢谢、致以最诚挚的谢意、
    Amin