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/TMS320F28377S:TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/587054/ccs-tms320f28377s-tms320f28377s

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

工具/软件:Code Composer Studio

你(们)好

如何配置缓冲 DAC 时钟? TRM 第1343页的 DAC 图显示 SYSCLK 为 DAC 的输入时钟。 在第99页的时钟树中、SYSCLK 取自 CPU、没有任何分频或分频。 因此、我假设 F28377S LaunchPad 的 DAC 时钟是 SYSCLK、看起来是200MHz。 并且无法更改。 另一方面、DAC 时钟应允许 DAC 的稳定时间为2us、并且速度不能太快。 缓冲 DAC 的正确时钟是什么?

谢谢 Vadim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可能误认为 SYSCLK 为200MHz、因为当我将 SYSCLK 连接到 GPIO73时、我只测量25MHz。
    谢谢 Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不会出现200MHz。 在复位时、连接到 GPIO73的 XCLKOUT 被偏离8。 当 XCLKOUTDIVSEL 被设定为1时、它显示200MHz
    谢谢 Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vadim、

    请查看对此帖子 https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/587244/2157011#2157011的回复

    此外、缓冲 DAC 在写入 DACVALS 寄存器的两次写入之间需要大于2us 的稳定时间才能正常运行。 基本上、这意味着 、如果您向缓冲 DAC 写入一个值、 那么输出电压只有在2us 后才能保证良好。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Frank、
    我是寻找答案并绘制该图的客户。 对于 ME、如果稳定时间为2us、DAC 将不能与200MHz SYSCLK 配合使用。 我必须对 DAC 进行分频。 DAC 手册指出“能够与 PWMSYNC 同步”。 我在 ePWM 块中搜索 PWMSYNC 信号、但找不到它、最匹配的是 EPWMxSYNCO。 我应该使用来自 ePWM 模块的哪个信号? 我尝试从 DAC 输出正弦波。 我有一个查找表。 每个 LUT 元素似乎都写入 DACVALS、SYSCLK 时序为200MHz。 我需要使用采样频率200kHz 进行更新。 假设我可以对 ePWM 进行编程、以提供 PWMSYNC 200k 信号来将 DACVALS 加载到 DACVALA 中、但我还需要确保在 DACVALS 中不会多次更改 LUT 元素、因为 SYSCLK 要快得多。 请提供建议。
    谢谢 Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vadim、

    DS 中的2us 稳定时间用于 DAC 从0.3V 转换到3.0V 时的满量程稳定时间。 较小阶跃的稳定时间将比2us 短得多、但我们没有描述较小的转换稳定时间、因此我无法为您提供一个数字。 对于所有转换、2us 稳定时间将是绝对最差的情况。

    要使用 DAC 生成正弦信号、最简单的解决方案是设置计时器中断、在该计时器中断范围内、您可以更新 DACVALS 寄存器。 这需要最少的硬件资源(计时器) 、但由于需要为中断提供服务、因此 CPU 会占用大量资源、因此可以从 DAC 获得的最大输出频率将会更低。 那么、它的工作方式是、假设您已经创建了360数组正弦表、并将 计时器设置为每1us 中断一次。 扫描一个正弦扫描床周期需要360us、从而有效地为您提供1/360us = 2.7KHz 的正弦波。 我们有一个使用此方法的 controlSUITE 示例 buffdac_sine。 您应该看看这个。

    使用 DAC 生成正弦信号的另一种方法是让 DMA 更新 DAC。 CPU 将不参与此过程。 您将需要 DMA 和中断源。 其工作方式是、创建正弦表、例如360数组正弦表。 您可以将 DMA 源指针和目的指针分别映射到正弦表和 DACVAL、并将 DMA 源指针配置为在到达正弦表末尾时绕回。 您为 DMA 设置了一个中断源、每当中断发生时、DMA 都会将正弦表中的下一个字传输到 DACVAL、并在到达数组末尾时回绕。 要使用这种方法增加正弦的输出频率、您可以增加 DMA 源指针的步长、增加中断频率或减少正弦表的长度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Frank 的帮助! 我尝试 CPUTIME0更新 DACVALS。 我已经查看 buff DAC 示例一段时间了。 我需要100-200kHz 的高频率、但无法从使用 sgen 库且通常采用 CPUTIMER 方法的示例中获得该频率。 我发现了几件事。 无论外部3.3V 或内部基准电压如何、正弦波的振幅都为300mV。 当我在 sgen 中将增益设置为1时、为什么它不接近0-3.3? 在 sgen 库中描述的数学方法不起作用。
    “标准 THD 正弦发生器是使用直接扫描床查找技术和实现的
    它使用16位模计数器。 尽管使用了16位计数器、但高字节(8位)为
    用于对256点查找表进行索引、从而获取 SIN 值。 因此、通过
    更改值从较低字节溢出的速度(即、操作步进值)
    可以更改正弦波的频率。 模数计数器忽略溢出或执行
    并仅保留余数"
    f =步进/2^16*Tisr
    我测量的 ISR 为.25us
    STEP = Fmax* 2^16/定时器时钟
    我设置 Fmax 40000
    计时器800000
    频率40000
    我测量的频率仅为20kHz。 如果我将 Fmax 和 Freq 增加到60kHz、则测得的频率会降低。
    谢谢 Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vadim、

    看起来 DAC 没有基准电压、因此您不能依赖其输出的任何频率测量。 buffdac_sine 示例默认使用 VDAC 作为 DAC 基准。 您可以通过 ADC 通道 B0提供基准电压、也可以轻松地将代码中的 DAC 基准从"refreference_VDAC"更改为"reference_VREF"。 为了验证 DAC 是否正常工作、您可以运行 buffdac_enable 示例、默认情况下、您应该会看到输出电压为1.65v 且基准电压为3.3V。

    正如我在前面强调过的、buffdac_sine 示例有很多开销、不一定是针对速度编写的、而是演示了使用 DAC 生成信号的一种方法。 我运行该示例已经有一段时间了、但如果内存为我提供了正确的服务、您应该能够达到200 KHz。 您需要将采样频率设置为大于输出频率的两倍。 这可能会消耗几乎所有 CPU 带宽。

    如果您的目标是高频、那么在您开始工作后、我认为您应该考虑采用 DMA 路由。 请告诉我 、如果切换基准为您提供良好的电压。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Frank、
    我想、我以为 Vmax 接近于3.3V 的 VDAC 基准是错误的。 第1343页说 Vdac=DACVALA*DACREF/4096。 DACVALA 只能为4096的一半或更少。 因此最大值为3.3V/2、我将得到该值。 我仍然无法确定频率。 我听从了您的建议、设置了一个360步长的缓冲区。
    当时钟设置为50k 时、正弦频率为70Hz、应降低50000/360 =138两倍。 中断例程花费.26us、在这个采样率下不应产生太大的影响;500k 700Hz;1MHz 1.4kHz;1.5MHz 2.1MHz;2MHz 2.38;5MHz 2.38kHz;50MHz 2.38kHz。 持续50个周期的中断例程似乎限制了最大频率。 这是我的代码。 我在评估频率时错过了什么?
    谢谢 Vadim
    //######################################################################################################################

    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #include "sgen.h" //信号生成头文件
    #include "math.h"

    //
    //定义
    //

    define 引用 1
    define cpufreq_MHz 200
    #define DAC_NUM 1

    //
    //全局
    //
    uint32 samplingFreq_Hz = 5000;
    uint32 MAX = 2048;
    uint32长度= 359;
    uint16 buff [360];
    uint16 sgen_out = 0;
    uint16 ndx=0;
    float cpuPeriod_us = 0;
    uint32 interruptCycles = 0;
    float interruptDuration_us = 0;
    浮点采样 Period_us = 0;
    void configureDAC (uint16 DAC_num);

    中断空 CPU_timer0_ISR (空);

    //
    //主函
    //
    void main (void)

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

    //
    //禁用 CPU 中断
    //
    Dint;

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

    //
    //清除所有中断并初始化 PIE 矢量表:
    //
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    //
    //将 CPU Timer0中断函数映射到 PIE 矢量表
    //
    EALLOW;
    PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
    EDIS;

    //
    //初始化变量
    //
    cpuPeriod_us =(1.0/cpufreq_MHz);
    samplingPeriod_us =(1000000.0/samplingFreq_Hz);


    //
    //配置 DAC
    //
    configureDAC (DAC_NUM);


    //计算缓冲区
    for (ndx=0;ndx <length+1; ndx++)

    buff [ndx]=(round (MAX+(MAX-1)* sin (6.28*ndx/length)));

    NDX = 0;

    //初始化 CPU 计时器
    //
    InitCpuTimer();

    //
    //将 CPU Timer0配置为以指定的采样频率中断
    //
    ConfigCpuTimer (&CpuTimer0、cpufreq_MHz、samplingPeriod_us);

    //
    //启动 CPU 定时器0
    //
    CpuTimer0Regs.TCR.ALL = 0x4000;

    //
    //启用中断
    //
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    EINT;
    ERTM;


    while (1)







    //
    // configureDAC -启用并配置请求的 DAC 模块
    //
    void configureDAC (uint16 DAC_num)

    EALLOW;

    DacaRegs.DACCTL.bit.DACREFSEL =基准;
    DacaRegs.DACOUTEN.bit.DACOUTEN = 1;
    DacaRegs.DACVALS.ALL = 0;

    DELAY_US (10);//缓冲 DAC 加电延迟

    EDIS;



    //
    // cpu_timer0_isr -将正弦值写入 DAC 的计时器 ISR
    //
    中断空 CPU_timer0_ISR (空)

    //
    //启动 CPU 定时器1以指示中断开始
    //
    CpuTimer1Regs.TCR.ALL = 0x0000;

    //
    //将当前正弦值写入缓冲 DAC
    //

    NDX++;

    sgen_out = buff [ndx];
    DacaRegs.DACVALs.all = sgen_out;
    NDX = ndx %长度;
    //
    //确认此中断以从组1接收更多中断
    //
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    //
    //停止 CPU 定时器1以指示中断结束
    //
    CpuTimer1Regs.TCR.ALL = 0x0010;

    //
    //计算以周期为单位的中断持续时间
    //
    interruptCycles = 0xFFFFFFUL - CpuTimer1Regs.TIM.ALL;

    //
    //计算以微秒为单位的中断持续时间
    //
    interruptDuration_us = cpuPeriod_us * interruptCycles;

    //
    //重新加载 CPU 定时器1
    //
    CpuTimer1Regs.TCR.ALL = 0x0030;


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

    您好 Vadim、

    DAC 可以输出轨到轨电压、但由于输出上的缓冲器、电压将与轨非线性。 使用您提供的代码(采样频率= 5kHz)、您应该会看到大约为0v 至3.3V、13.8Hz 的正弦波。 你没看到这个吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Frank、
    不、我看不到。 如果我尝试使用 buffed_adc_enable 文件、我将具有以下用于 dacval 的文件
    0000 120mV
    500 280 mV
    1000 480 mV
    1500680mV
    2000 920 mV
    2500 1080 mV
    3000 1280 mV
    3500 1480mV
    4000 1680mV
    谢谢 Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vadim、

    看起来不正确。 出于调试目的、您能否将 buffdac_enable 代码中的基准更改为"VDAC"并为引脚 B0提供3.3V 电压? 此外、是否以任何方式修改了 Launchpad?