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.

[参考译文] TMS320F28335:用于计算通过 GPIO 输入的方波平均值的数字低通滤波器

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/686759/tms320f28335-digital-low-pass-filter-for-calculating-mean-value-of-square-wave-input-through-gpio

器件型号:TMS320F28335

您好!

我想计算八 个 不同占空比的方波(30kHz)的平均值。 我想从8个 GPIO 引脚读取8个信号、我必须计算这些方波的平均值以进行比较。 我将 GPIO 引脚设置为输入、但您能告诉我如何通过数字滤波器或其他方法找到30kHz 和3.3v 幅度方波信号的平均值吗?  

注意:我在计时器中断函数中使用平均值进行比较。

谢谢、

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

    您如何定义'main'?

    此致、

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

    平均值是一个周期内方波的平均值。 如果您有任何疑问、请告诉我。

    谢谢、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、对于固定频率下的数字输入、它不仅仅是测量占空比的情况吗? 您可以使用任何 eCAP 外设执行此操作、但您正在使用的器件上只有六个此类单元。 请告诉我这是否不是您的意思。

    此致、

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

    尊敬的 Richard:

    是的、您已经完全理解了、但有两个问题。

    在我使用 eCAP 模块时、计算的占空比值发生了突然变化、如下所示。 它在所有 eCAP 计算的占空比值中周期性发生。 所有捕获的占空比都应接近675、但您可以观察到它在某些时候变得非常高、如下图所示。 否则、它会提供大致相同的值。

    2.如果我确实找到了上述问题的解决方案,那么到目前为止,eCAP 将会做得非常完美,但将来我至少需要8 个 eCAP 模块,所以我想找到永久解决方案。 因此、我应该使用数字滤波器来计算要比较的平均值或占空比。 我觉得通过 GPIO 引脚为输入实施数字滤波器是更好的选择。

    谢谢、

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

    Yedida、您好!

    我看到您的问题。  我可以尝试帮助解决 eCAP 问题、但即使成功、您仍需要测量另外两个输入。  eQEP 中有一个边沿捕获单元、F28335有两个、因此您可能仍然能够使用硬件来测量事件时序、尽管这需要一些工作。

    如果您使用数字滤波器、则必须采样远高于30kHz、并且对于八个通道、我怀疑您将消耗大量的 CPU 带宽。  是否可以在硬件中进行滤波并使用 ADC 测量每个通道?  每个 ADC 输入端都有一个 R-C 滤波器。  此处提供了相关的应用手册:

    http://www.ti.com/lit/an/spraa88a/spraa88a.pdf

    此致、

    Richard

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

    尊敬的 Richard:

    谢谢你。 请告诉我 eCAP 模块的问题是什么。 我已经在硬件中实现了低通滤波器、但我唯一的问题是它的时间常数可能会影响系统性能、电容和电阻值的容差可能会影响输出。 我设计的滤波器为2.2k 和0.1uF (时间常数= 220uS)。 我希望至少每100us 采样一次、 这样可能会减慢我的系统速度。 如果我增大电阻值、则会出现 ADC 存储器串扰问题。

    请告诉我上面提到的 eCAP 问题是否有任何解决方案。

    谢谢、

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

    您能否向我发送您的 eCAP 初始化、以及您用于获取占空比的代码? 谢谢。

    此致、

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

    尊敬的 Richard、用于使用 eCAP 模块设置和计算占空比。

    下面是代码  

    void SetupECapture(){
    ///----------------------------------------------------------
    //--为捕捉配置 eCAP1单元
    ///----------------------------------------------------------
    ECap1Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
    ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器

    ECap1Regs.TSCTR = 0;//清除计数器
    ECap1Regs.CTRPHS = 0;//清除计数器相位寄存器

    ECap1Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
    //位15-11 00000:保留
    //位10 0:APWMPOL、无关
    //位9 0:CAP/APWM、0 =捕捉模式、1 = APWM 模式
    //位8 0:SWSYNC、0 =无操作(无 s/w 同步)
    //位7-6 10:SYNCO_SEL、10 =禁用 SYNC OUT 信号
    //位5 0:SYNCI_EN、0 =禁用同步输入
    //位4 1:TSCTRSTOP、1 =使能计数器
    //位3 0:重新 ARM、0 =不重新 ARM、1 =重新 ARM
    //位2-1 11:STOP_Wrap、11 = 4次捕捉后换行
    //位0 0:CONT/ONESHT、0 =连续模式

    ECap1Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
    //位15-14 11:自由/软、11 =忽略仿真挂起
    //位13-9 00000:预分频、00000 = 1分频
    //位8 1:CAPLDEN、1 =使能捕捉结果加载
    //位7 0:CTRRST4、0 =在 CAP4事件发生时不复位计数器
    //位6 1:CAP4POL、0 =上升沿、1 =下降沿
    //位5 0:CTRRTST3、0 =在 CAP3事件发生时不复位计数器
    //位4 0:CAP3POL、0 =上升沿、1 =下降沿
    //位3 0:CTRRST2、0 =不在 CAP2事件上复位计数器
    //位2 1:CAP2POL、0 =上升沿、1 =下降沿
    //位1 0:CTRRST1、0 =不在 CAP1事件上复位计数器
    //位0 0:CAP1POL、0 =上升沿、1 =下降沿

    ECap1Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP 中断
    //位15-8 0:保留
    //位7 0:CTR=CMP、0 =禁用比较中断
    //位6 0:CTR=PRD、0 =禁用周期中断
    //位5 0:CTROVF、0 =溢出中断被禁用
    //位4 0:CEVT4、0 =事件4中断被禁用
    //位3 1:CEVT3、1 =事件3中断被使能
    //位2 0:CEVT2、0 =事件2中断被禁用
    //位1 0:CEVT1、0 =事件1中断被禁用
    //位0 0:保留

    ECap2Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
    ECap2Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
    ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
    ECap2Regs.TSCTR = 0;//清除计数器
    ECap2Regs.CTRPHS = 0;//清除计数器相位
    ECap2Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
    ECap2Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
    ECap2Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP

    ECap3Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
    ECap3Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
    ECap3Regs.TSCTR = 0;//清除计数器
    ECap3Regs.CTRPHS = 0;//清除计数器阶段
    ECap3Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
    ECap3Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
    ECap3Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP

    ECap4Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
    ECap4Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
    ECap4Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
    ECap4Regs.TSCTR = 0;//清除计数器
    ECap4Regs.CTRPHS = 0;//清除计数器阶段
    ECap4Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
    ECap4Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
    ECap4Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP

    PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//在 PIE 组4中启用 ECAP1_INT
    IER |= 0x0008;//在 IER 中启用 INT4以启用 PIE 组4


    中断空 eCAP1_ISR(){

    // PwmPeriod =(int32) ECap1Regs.CAP3 -(int32) ECap1Regs.CAP1;

    PwmDuty1 =(Int32) ECap1Regs.CAP2 -(Int32) ECap1Regs.CAP1;
    PwmDuty2 =(int32) ECap2Regs.CAP2 -(int32) ECap2Regs.CAP1;
    PwmDuty3 =(Int32) ECap3Regs.CAP2 -(Int32) ECap3Regs.CAP1;
    PwmDuty4 =(int32) ECap4Regs.CAP2 -(int32) ECap4Regs.CAP1;

    PieCtrlRegs.PIEACK.all = PIEACK_group4;//必须确认 PIE 组
    ECap1Regs.ECCLR.bit.INT = 1;//清除 ECAP1中断标志
    ECap1Regs.ECCLR.bit.CEVT3 = 1;//清除 CEVT3标志

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

    您能否尝试以增量时间模式而不是绝对时间模式运行 CAP 单元? 我想毛刺脉冲可能是由计数器溢出引起的。 您的 ECCTL1寄存器将变为0xC1ED。

    如果您仍然看到问题、我尝试通过将 ECCTL2.bit0设置为1并在 ISR 中复位以单次模式运行。

    F28335的 eCAP 用户指南的第7.4节中有一个使用增量时间模式进行占空比测量的代码示例。

    此致、

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

    尊敬的 Richard:

    通过对 ECCTL1寄存器进行上述修改、问题得到解决。 非常感谢您的快速响应。

     ECap1Regs.CAP2和 ECap1Regs.CAP4之间的区别是什么; 因为 CAP4提供了不同的占空比、但下面未显示 CAP2。

    2、delta 模式如何解决这个问题?

    3.一次性模式与以上模式有何区别?

    谢谢、

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

    我无法说明电容2和4之间的差异。 二者的配置是否相同-即下降沿-并且 CAP1是否配置了计数器复位? 如果是、两者都应报告占空比。

    我最初以为计数器可能已经溢出。 我仍然不清楚、因为它是一个32位计数器、您的"干扰"大小仅为55k 左右、这就是我要求 ISR 代码的原因。 另一种可能是当 ISR 相对于更新时读取 CAP 寄存器时发生的事情-这就是我提到一次性模式的原因。

    在单次触发模式下、仅进行一次捕获(您必须重新布设 CAP 模块以进行另一次测量)、而现在所做的操作会在每次有边沿时持续捕获计时器计数器。 如果您将来看到任何干扰、那么接下来要尝试。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、您可能仍然需要尝试单次触发模式、以查看它是否修复了 CAP2问题。

    此致、

    Richard