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.

[参考译文] TMS320F28377D:28377d ADC 采样率

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/662204/tms320f28377d-28377d-adc-sampling-rate

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITE

是否有人可以告诉我如何设置采样率?  我想更改它。 我不知道我 应该设置哪一部分代码。

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

    如果这会触发 ADC、您只需更改 ePWM TBPRD 值。 请分享您尝试实现的示例代码/代码片段。

    此致、
    Gautam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢,代码是 controlSUITE 中的原始代码
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是 controlSUITE 中的原始代码,它是 C:\ti\controlSUITE\device_support\f2837xd\V210\F2837xD_examples_cpu1\adc_soc_continuous,它看起来像是由软件触发的。

    后面是代码

    //######################################################################################################################
    //
    //文件:adc_soc _continuous_cpu01.c
    //
    //标题:F2837xD 的 ADC 连续自触发。
    //
    //! addtogroup cpu01_example_list
    //!

    ADC 持续触发(ADC_SoC_Continuous)


    //!
    //! 此示例设置 ADC 以连续转换、从而达到最大值
    //! 采样率。\n
    //!
    //! 程序运行后、存储器将包含:
    //!
    //! -\b 结果:一个模数转换采样序列
    //! 从引脚 A0开始。 根据、样本之间的时间是可能的最小值
    //! ADC 速度。
    //
    //######################################################################################################################
    //$TI 版本:F2837xD 支持库 V210 $
    //$Release Date:Tue Nov1 14:46:15 CDT 2016 $
    //版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
    // http://www.ti.com/ 保留所有权利$
    //######################################################################################################################

    //
    //包含的文件
    //
    #include "F28x_Project.h"

    //
    //函数原型
    //
    void ConfigureADC (void);
    void SetupADCContinu模糊(uint16通道);

    //
    //定义
    //
    #define Results_buffer_size 256 //缓冲区、用于存储转换结果
    //(大小必须是16的倍数)

    //
    //全局
    //
    uint16 AdcaResults[results_buffer_size];
    uint16结果索引;

    void main (void)

    //
    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    //
    InitSysCtrl();

    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    InitGpio();//针对此示例跳过

    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;

    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();

    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();

    //
    //配置 ADC 并为其加电
    //
    ConfigureADC();

    //
    //在通道0上设置用于连续转换的 ADC
    //
    SetupADCContinu模糊(0);

    //
    //启用全局中断和更高优先级的实时调试事件:
    //
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    //
    //初始化结果缓冲区
    //
    for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

    AdcaResults[resultsIndex]=0;

    resultsIndex = 0;

    //
    //循环无限地进行转换
    //
    操作

    //
    //启用 ADCINT 标志
    //
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;
    AdcaRegs.ADCINTSEL3N4.bit.INT3E = 1;
    AdcaRegs.ADCINTSEL3N4.bit.INT4E = 1;
    AdcaRegs.ADCINTFLGCLR.ALL = 0x000F;

    //
    //初始化结果索引
    //
    resultsIndex = 0;

    //
    //软件强制启动 SOC0到 SOC7
    //
    AdcaRegs.ADCSOCFRC1.ALL = 0x00FF;

    //
    //继续采样,直到结果缓冲区已满
    //
    while (resultsIndex < results_buffer_size)

    //
    //等待第一组8个转换完成
    //
    while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT3);

    //
    //清除前8个转换生成的两个 INT 标志
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT3 = 1;

    //
    //保存前8次转换的结果
    //
    //请注意,在此期间,第二个8次转换具有
    //已被 EOC6->ADCIN1触发,将处于活动状态
    //在保存前8个结果时转换
    //
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT1;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT2;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT3;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT4;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT5;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT6;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT7;

    //
    //等待第二组8个转换完成
    //
    while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT4);

    //
    //清除第二8次转换生成的两个 INT 标志
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT4 = 1;

    //
    //保存第二个8次转换的结果
    //
    //请注意,在这段时间内,前8次转换具有
    //已由 EOC14->ADCIN2触发,并且将处于活动状态
    //在保存第二个8个结果时转换
    //
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT8;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT9;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT10;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT11;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT12;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT13;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT14;
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT15;


    //
    //禁用所有 ADCINT 标志以停止采样
    //
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0;

    //
    //此时,AdcaResults[]包含一系列转换
    //从所选通道
    //

    //
    //软件断点,再次点击运行以获取更新的转换
    //
    asm (" ESTOP0");
    } while (1);


    //
    // ConfigureADC -写入 ADC 配置并为两者加电
    // ADC A 和 ADC B
    //
    空配置 ADC (空)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为晚期
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

    //
    //为 ADC 加电
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1ms 以允许 ADC 加电时间
    //
    DELAY_US (1000);

    EDIS;


    //
    // SetupADCContinuously -设置 ADC 在一个通道上持续转换
    //
    空设置 ADCContinuid (uint16通道)

    uint16 acqps;

    //
    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns


    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC1CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC2CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC3CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC4CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC5CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC6CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC7CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC8CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC9CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC10CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC11CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC12CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC13CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC14CTL.bit.CHSEL =通道;//SOC 将在通道上转换
    AdcaRegs.ADCSOC15CTL.bit.CHSEL =通道;//SOC 将在通道上转换

    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC6CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC7CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC9CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC10CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC11CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC12CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC13CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC14CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期
    AdcaRegs.ADCSOC15CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
    //1个 SYSCLK 周期

    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;//禁用 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0;//禁用 INT2标志
    AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0;//禁用 INT3标志
    AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0;//禁用 INT4标志

    AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;
    AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT3CONT = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT4CONT = 0;

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 6;// SOC6的末尾将设置 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 14;// SOC14结束将设置 INT2标志
    AdcaRegs.ADCINTSEL3N4.bit.INT3SEL = 7;// SOC7结束将设置 INT3标志
    AdcaRegs.ADCINTSEL3N4.bit.INT4SEL = 15;// SOC15结束将设置 INT4标志

    //
    //ADCINT2将触发前8个 SOC
    //
    AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC4 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC6 = 2;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC7 = 2;

    //
    //ADCINT1将触发第二个8个 SOC
    //
    AdcaRegs.ADCINTSOCSEL2.bit.SOC8 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC10 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC12 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC14 = 1;
    AdcaRegs.ADCINTSOCSEL2.bit.SOC15 = 1;
    EDIS;


    //
    //文件结束
    //


    非常感谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您浏览:C:\ti\controlSUITE\device_support\F2837xD\V210\F2837xD_examples_CPU1\ADC_SoC_ePWM
    非常容易更改采样率。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你能抽出时间。 建议非常有用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需稍微增加一点 Gautam 的响应:
    我同意、如果您想精细控制采样率、ePWM 驱动采样是最佳/最简单的选择
    -在您之前使用的连续转换示例中,您可以通过增加 ACQPS 设置以增加 S+H 持续时间(这将降低 ADC 的速度)或通过增加 ADC 预分频设置来降低 ADCCLK 速率来控制采样率。 然后、您必须使用数据表中的"ADC 时序"表和图来计算 ADC 时序 :www.ti.com/.../specifications
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这很有帮助。 非常感谢