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/UCD3138:AD04模拟比较器如何继续进入快速中断

Guru**** 2595770 points
Other Parts Discussed in Thread: UCD3138

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/763008/ccs-ucd3138-ad04-analog-comparator-how-to-continue-entry-fast-interrupt

器件型号:UCD3138

工具/软件:Code Composer Studio

您好;

我想使用 UCD3138 引脚 AD04 模拟比较器进入快速中断。我设置 ACOMP_D_POL=1、 输入电压始终高于 ACOMP_D_THRESH。  

但程序不能在 快速中断中停止。lt 只能一次进入快速中断、则永远不会发生。

I shuold 使输入电压低于 ACOMP_D_THRESH、然后再次升高、进入一次快速中断。

如何进行 当输入电压始终高于 ACOMP_D_THRESH 时,始终 关闭  快速中断。

下面是我的一些代码:

void init_AD04_F (void)

FaultMuxRegs.ACOMPCTRL0.bit.ACOMP_EN=1;  
FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_SEL=0;  
FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_INT_EN=1;  
FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_POL=1;  
FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_THRESH=127;  
WRITE_FIRQpr (CIMINT_All_FAULT_MUX);
WRITE_REQMASK (CIMINT_All_FAULT_MUX);
enable_interrupt ();
enable_fast_interrupt ();

void fast_interrupt (void)

K = FaultMuxRegs.FAULTMUXINTSTAT.bit.ACOMP_D;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道为什么要这样做。 通常、快速中断用于检测故障情况、然后快速停止。 通常情况下、您使用 ADC 监视条件、并且在低于限制时才重新启动。 这就是我建议你做的事。 否则、该程序只会卡在快速中断函数中、并继续返回到该函数。 程序将被有效锁定。

    正如您所发现的、快速中断是边沿敏感的。 但我假设边沿敏感逻辑位于初始逻辑之后。 当然、它位于比较器之后。 因此、如果您希望继续重触发它、即使它保持高电平、您可能只需将阈值设置为最大值。 假设您的引脚电压低于最大阈值、这将提供一个下降沿来重置逻辑、然后您可以将阈值设置回所需的值。 当然、如果您在快速中断中执行此操作、您将获得我在上面描述的锁定。

    如果引脚电压高于最大比较器阈值、则可以使用 ACOMP_D_POL 位反转比较器中断的极性、然后清除可能会生成的中断、然后将极性恢复到所需的值。 同样、如果在引脚电压仍然为高电平的快速中断中执行该操作、则会卡在中断中。

    我没有测试过这些建议中的任何一个、但它们应该起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议。
    我根据您的建议编写了一些文本代码。
    下面是我的一些代码,

    for (;;)

    L++;
    FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_POL=1;
    PMBus_handler ();


    void fast_interrupt (void)

    J++;
    FaultMuxRegs.ACOMPCTRL1.bit.ACOMP_D_POL=0;
    K = FaultMuxRegs.FAULTMUXINTSTAT.bit.ACOMP_D;


    可以重复触发快速中断、但程序也会进入后台循环。
    我不确定、我没有误解您的观点。 如果我做了,请纠正我的问题。

    在清除中断标志之前、我尝试添加一个"倒角"条件。 正常工作。 但是,正如您所说的,程序将锁定在快速中断中。 但是、当判断条件为真时、清除标志、程序将从中断中跳出。

    以下是我的代码:
    void fast_interrupt (void)

    if (FaultMuxRegs.FAULTMUXRAWSTAT.bit.ACOMP_D = 0)

    K = FaultMuxRegs.FAULTMUXINTSTAT.bit.ACOMP_D;



    我发现,当程序进入快速中断时,PMBus 无法工作。是否应该在中断中添加 PMBus_handler()函数?
    我从未发现 TI 演示代码在快速中断中添加了此函数。

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

    如果 PMBus 不起作用、则表明快速中断占用了大部分后台时间。  您肯定不想将 PMBus 处理程序调用置于快速中断中。  相反、请确保快速中断不会锁定。  执行我之前建议的操作-使用快速中断对 AD04上的任何内容进行快速响应、然后使用 ADC 监测引脚、直到其再次下降。  

    为了准确地在发生快速中断时进行调试、请在中断启动时将 I/O 线路设为高电平、然后在中断退出时再次设为低电平。

    硬件和软件需要一段时间才能进入和退出快速中断、因此 I/O 线边沿不会显示中断的全时。