如何使用 8 位 PIC 测量 IR 信号的脉冲宽度?

电器工程 微控制器 图片 频率测量
2022-01-14 10:45:02

我和我的朋友想设计一个通用的学习遥控器,比如这个,用于学习目的。我们要做的基本上是存储和重放红外脉冲。

我们想要检测 36kHz、38kHz 和 40kHz 信号。40kHz 信号的周期为 25\$\mu\$s。

我们想使用 8 位 PIC 单片机,目前我们选择了 PIC16F616,它将运行在 20MHz 高速晶体振荡器上。我们有两种选择:

  1. 使用Interrupt On Change模块。
  2. 使用 CCP 模块的捕获模式。

第一个选项如下:

假设寄存器设置为:unsigned char _10_us = 0;该寄存器将保存时间。带有周期寄存器的 TMR2 模块设置为每 10\$\mu\$sec 产生一个中断。当中断发生时,它将增加_10_us寄存器并退出。这将给出 2.55 毫秒的最大时间。如果需要更多时间测量,_1_ms可以根据需要定义和增加额外的寄存器。

现在,每次任何一种变化(从高到低或从低到高)产生中断时,程序都会记录当前时间,即_10_us寄存器的值。过了一会儿,当下一个中断产生时,程序会从_10_us寄存器中减去保存的值,从而得到此时所用的时间,单位为 10\$\mu\$seconds。

这个选项让我摸不着头脑;TMR2 中断大约每 50 条指令发生一次。中断处理大约需要 20 条指令。我剩下 30 条指令来计算周期并将其保存到数组中。这种方法会奏效吗?

第二个选项如下:

设置 CCP 模块的捕捉模式,以便在 CCP1 引脚上发生事件(从高到低)时产生中断。在中断程序中,它会设置一个标志,以便程序中的任务可以计算(如果需要)并保存 CCPR1H(可能不需要)和 CCPR1L 的值。然后我们将更改捕获模式的配置,使其在发生低到高沿时触发中断。然后它将等待下一个事件。我无法估计这种方法的性能,因为我从未使用过它。

另外一个选择?

我们可以使用TSOP17xx系列等红外解调器 IC。这将彻底解决我们的问题。然而,一些问题浮现在脑海。

我们的阅读距离要求并不高;1 米(约 3 英尺)。如果我们选择一个工作在 38kHz 的 TSOP1738,那么它对36kHz和 40kHz 信号的工作情况如何?

TSOP17xx 系列数据表的第 4 页显示了“响应频率依赖性”图。据我们了解;

  • 40kHz,即 38kHz 的约 1.053,将给出约 0.6 的相对响应度。
  • 36kHz,即 38kHz 的约 0.95,将给出约 0.65 的相对响应度。

这些值是什么意思?我们可以使用 TSOP1738 并且没问题吗?

1个回答

是的,TSOP1738 可以在这么短的距离内完成。0.65 相对响应度意味着在 36 kHz 时,由于平方反比定律,您的 IR LED 需要接近 \$\sqrt{0.65}\$ = 0.8 倍才能看到相同的信号强度因此,如果您的 TSOP1738 在 1 m 处看到 38 kHz 的某个电平,您必须将发射器保持在 80 cm 处才能在 36 kHz 处获得相同的信号强度。顺便说一句,我用带新电池的遥控器测量了超过 15 m 距离的完美接收,所以完全没有问题。

不用担心 PIC 的性能。TSOP1738 不会输出 38 kHz 信号。这就是载波频率,它被 TSOP1738 去除以返回基带信号,该信号具有低得多的频率,脉冲持续时间约为 1 ms,因此有足够的时间来准确测量边沿之间的时间。

以下范围图像说明了这一点:

在此处输入图像描述

这是一个 RC5 代码。顶部信号是 36 kHz 调制信号,底部是带有实际代码的基带信号。

在此处输入图像描述

这是放大基带信号的一个脉冲。您可以看到 36 kHz 载波的各个脉冲。

关于载波频率的更多信息。您可能正在使用您不知道该频率的遥控器。TSOP1738 没有在其输出上给出它,所以如果你想读取它,你必须将一个 IR 光电二极管或晶体管连接到 PIC 的输入之一,并读取两个相同边沿之间的时间。这是可行的。不同载波频率的周期时间:

40 kHz:25 µs
38 kHz:26.3 µs
36 kHz:27.8 µs

20 MHz PIC16F616 的指令周期为 200 ns(它将时钟除以 4!)。所以三个频率的读数应该是大约 125、131 和 139。这应该足以区分它们。但是如果你愿意,你可以让一些边沿通过,只在第 10 个中断之后读取定时器,例如:1250、1316、1389。不要太长,因为你必须保持时间短于基带信号的一个脉冲.

成功!