您好! 我想知道采样输入是否可配置为单个引脚、或者我们是否必须使用8个引脚(GPIO7-GPIO15)才能使用该功能? 我想用它来读取超声波传感器输入、它会在一段时间内读取数字输入、并根据采样周期的决定采取措施。 我正在使用多个超声波传感器、但它们收集的数据用于不同的功能。 我可能会对参考指南产生误解、但我想在整个过程中使用一个引脚对单个超声波传感器进行采样。 这是可行的吗?
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.
您好! 我想知道采样输入是否可配置为单个引脚、或者我们是否必须使用8个引脚(GPIO7-GPIO15)才能使用该功能? 我想用它来读取超声波传感器输入、它会在一段时间内读取数字输入、并根据采样周期的决定采取措施。 我正在使用多个超声波传感器、但它们收集的数据用于不同的功能。 我可能会对参考指南产生误解、但我想在整个过程中使用一个引脚对单个超声波传感器进行采样。 这是可行的吗?
Andrew、
为清楚起见、这是一种 GPIO 功能、有助于抑制信号抖动/噪声。 解释这一句的方法是、您可以配置应用于 GPIO 信号的限定条件窗口。 但是、每组8个 GPIO 信号将共享相同的鉴定窗口设置(因为它需要不实际的寄存器字段数来实现每引脚配置)。 否则、八个 GPIO 信号将独立运行。
如果您对测量脉冲持续时间或占空比感兴趣、我建议您查看 eCAP 模块。 它是为此目的而设计的。
Tommy
嗨、Tommy!
我讨厌更多地给你虫子、但我很难理解它的工作原理。 这是我的第二个微控制器、就像我第二年的学生一样、但我对此有一些问题、希望您能帮我! 如果不是、请告诉我、我将发布一个新的线程!
我们尝试按如下方式进行设置:
我们只需要测量 t_pw。
我们已将 ECCTL1设置为:
ECap1Regs.ECCTL1.bit.FREE_SOFT = 1; 中断后//停止以进行调试
ECap1Regs.ECCTL1.bit.prescale = 0; //无校验器
ECap1Regs.ECCTL1.bit.CAPLDN = 1 //启用捕捉单元
ECap1Regs.ECCTL1.bit.CAP1POL = 1;//在下降边沿上开始计时
ECap1Regs.ECCTL1.bit.CAP2POL = 0;//上升沿返回值
ECap1Regs.ECCTL1.bit.CAP3POL = 1;//在下降边沿上开始计时
ECap1Regs.ECCTL1.bit.CAP4POL = 0;//在上升边沿上开始计时
ECap1Regs.ECCTL1.bit.CTRRST1 = 1;// 在检测到一个上升边沿后、复位定时器
ECap1Regs.ECCTL1.bit.CTRRST2 = 1;// 检测到下降沿后、返回值
ECap1Regs.ECCTL1.bit.CTRST3 = 1;// 这只是对 eCAP1的阴影,所以当我们复位 CTRRST1时不应该复位它?
ECap1Regs.ECCTL1.bit.CTRRST4 = 1;// 这只是对 eCAP2的阴影, 所以当我们复位 CTRRST2时不应该复位它?
//控制寄存器2
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;//连续、因为我们要使定时器在第一个边沿(事件)之后保持运行?
ECap1Regs.ECCTL2.bit.STOP_Wrap = 3;//我们只想知道上升事件和下降事件之间的差异,所以这无关紧要?
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//起始计数器
ECap1Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器已停止
ECap1Regs.ECEINT.BIT.CEVT4 = 1; // 2个事件(上升然后下降)=中断,然后我们得到值
_________________________________
这有道理吗?
Andrew、
下一次、最好启动新帖子、但没有问题。
在纯英文版本中、您尝试使用 eCAP 执行什么操作? 比如:我正在尝试捕获每个脉冲的导通时间。 或者、我正在尝试测量事件"X"之后的第一个脉冲的占空比。
仔细阅读您的评论、似乎您对 eCAP 的功能有点困惑。 让我们来谈谈其中的几个问题。
[引用 user="Andrew Wenaus"]ECap1Regs.ECCTL1.bit.CAP1POL=1;//在下降沿开始计时
ECap1Regs.ECCTL1.bit.CAP2POL = 0;//上升沿返回值
ECap1Regs.ECCTL1.bit.CAP3POL = 1;//在下降边沿上开始计时
ECap1Regs.ECCTL1.bit.CAP4POL = 0;//在上升沿开始计时[/quot]
极性位只设置哪个事件将触发 CAPx 来捕获时间戳计数器(TSCTR)。 它不会对"开始时间"或"返回值"产生任何影响。
[引用 USER="Andrew Wenaus">ECap1Regs.ECCTL1.bit.CTRRST3 = 1;// 这只是将 eCAP1阴影,所以我们复位 CTRRST1时不应该复位它?
ECap1Regs.ECCTL1.bit.CTRRST4 = 1;// 这只是对 eCAP2的阴影, 所以当我们复位 CTRRST2时不应该复位它?[/quot]
它们不会影子 CAP1或 CAP2。 该功能仅在 eCAP 处于 APWM 模式时使用。 这条注释还使您听起来好像将每个 CAPx 寄存器都视为自己的计时器。 在这种情况下、整个模块只有一次、而 CAPx 寄存器只是在 TSCTR 的偶数发生时存储其值。
[引用 user="Andrew Wenaus"] ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;//持续,因为我们要使计时器在第一个边沿(事件)之后继续运行?[/quot]
您有2个选项1。 单次触发模式:eCAP 模块将在模数计数器达到 STOP_Wrap 中的值后停止。 在连续模式下、eCAP 模块将在模数计数器达到 STOP_Wrap 值后继续运行、"打包"返回 CAP1并开始覆盖值。
[引用 USER="Andrew Wenaus"] ECap1Regs.ECCTL2.bit.STOP_Wrap = 3;// iwe 只想知道上升事件和下降事件之间的差异,所以这无关紧要?
这决定了 eCAP 是否将停止并等待无限时间来读取这些值、或者如果检测到新的上升/下降边沿、它是否会覆盖 CAPx 寄存器。
我建议从示例开始、然后阅读本章、以便您了解每行代码的作用。 幸运的是、eCAP 是一个非常简单的模块、该章内容非常详细、足以解释更详细的细节。
此致、
Cody
Andrew、
您需要做的第一件事是选择连续模式或单次触发模式。
[引用 user="Andrew Wenaus"]我们如何在检测到第二个事件后"重新设置"事件检测?[/quot]如果修改 STOP_Wrap 值,则可以禁用 CAP3和 CAP4。
eCAP 不会自动返回差异。 当读取该位时、它返回事件发生时 TSCTR 的值。 如果您想节省时间并避免在代码中预形成"CAP2-CAP1":您可以设置 eCAP 来在 CAP1事件时清除 TSCTR、然后 CAP2中存储的值将是这些事件之间的差异。Andrew Wenaus 说:存储在哪个寄存器中的差异?
我知道 eCAP 看起来令人生畏、但它实际上是一个简单的模块!! 我估计、您可以在使用示例和阅读手册的~4小时内了解95%的 eCAP 功能... 这可能比在论坛上提问要快。
查看我上面提到的寄存器、如果您有更多问题、请继续回答!
此致、
Cody