我和我的朋友想设计一个通用的学习遥控器,比如这个,用于学习目的。我们要做的基本上是存储和重放红外脉冲。
我们想要检测 36kHz、38kHz 和 40kHz 信号。40kHz 信号的周期为 25\$\mu\$s。
我们想使用 8 位 PIC 单片机,目前我们选择了 PIC16F616,它将运行在 20MHz 高速晶体振荡器上。我们有两种选择:
- 使用
Interrupt On Change
模块。 - 使用 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 并且没问题吗?