这个信号使用什么编码?

电器工程 编码
2022-01-15 18:38:39

我有一个便宜的无线泳池温度计 (AcuRite 617 1 ),我想截取接收器的温度数据,并将其与计算机数据记录系统一起使用。

方便的是,接收器内部是一个连接到天线的小型分线板,具有数字“V”、“G”、“D”和“SH”引脚:

RF211板

这是传输期间从“D”引脚捕获的一段数据(每分钟发生一次)。在这一段之前,似乎有更高速率的数据,但我相信这可能是噪音——这是 1.36kHz / 680Hz 数据的开始。

从“D”引脚捕获的信号

我用谷歌搜索了一下,找不到看起来很像这样的编码,但如果我要猜测发生了什么,这就是我的想法:

  • 最初的 4 个 680 Hz 周期用于同步时钟但不包含数据
  • 随后的 1.36 kHz(初始速率的 2 倍)的 13 个周期似乎具有两种形式之一:它们要么在周期中点之前或之后下降到低点——我假设一种形式是合乎逻辑的,另一种是合乎逻辑的是零。
  • 在那之后,似乎有一个奇怪的差距,但如果你忽略作为前面“1”一部分的低点部分,那么剩余的差距是 735 µs,这是(相位正确!)延续680 赫兹前导码。

我看对了吗?这种编码有名称吗?

关于分线板的一些进一步说明:

  • 该板标有“RF211”,看起来与 MICRF211“通用,3V QwikRadio 接收器,工作频率为 433.92MHz” 3非常一致
  • MICRF211 数据表有下图(几乎没有解释),与我的捕获相比,除了双倍数据速率方波外,它看起来非常像我所看到的:
    数据资料

2016-02-14 更新:我重新访问了这个项目,似乎在 4 周期前导码和 1 周期“后同步码”之间得到了一个干净的 64 位流,之后显示板通过以下方式关闭 RF 模块将 ^SH 拉低(顶线):

64位数据

根据 Micrel 的“33/66% PWM”方案(在谷歌其他地方没有出现),那就是

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

所以现在我必须开始操纵温度来解码这些位。这里 ("x") 是在显示中似乎没有任何明显变化的位:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

我假设这些是最低有效位或电池电量(仅在显着下降时显示为“低”)。

2016-02-15 更新:我正在路上展示新的“逆向工程”stackexchange 以确定含义:https ://reverseengineering.stackexchange.com/questions/12048/what-is-contained -in-this-transmission-rf-pool-temperature-sensor-base-unit-re

4个回答

麦克雷尔将其称为 33/66% PWM 方案。它似乎是一个相当简单但临时的协议。

PWM代表脉冲宽度调制。有一个维基百科页面更详细,但简而言之,PWM 是你保持固定周期的地方,所以这里是从上升沿到下一个上升沿的时间,但你可以改变在高电平上花费的时间百分比通过改变下降沿发生时的状态。对于这个,您可以看到“1”为 33%,“0”为 66%。

初始脉冲系列的高低时间相等。通常这样做是为了让接收器在接收到实际数据之前进行同步。

有关他们对该模块的期望的更多详细信息,请参见http://www.micrel.com/_PDF/App-Notes/an-22.pdf 。

能够接收这种编码的典型方法是将其输入到微控制器的定时器输入捕捉引脚中。或者,您可以简单地连接到一个通用输入并让它以 4-5 倍的 PWM 周期进行采样。从那里开始,解码算法并不太难。

或者,按照markt的建议,您可以回到温度传感器本身。但是,如果它是模拟输出信号,您必须自己将其转换为数字信号,并且您的日志记录中的数字可能与原始输出略有不同。

我认识的人通常称这种编码技术为“PWM”,我认为这是一个合理的描述。

我首先想到的是查看您的数据流,并假设您正确猜测了位的极性,这是一个 12 位 ADC 读数,LSB 在前,以“1”作为起始位。我将首先使用 LSB,因为可能是下一个读数的开始显示单个位的变化,并且(池)温度的 ADC 读数不太可能在这么短的时间内变化第二或第三个 MSB。

我会更深入地研究系统,回到生成数据的任何东西(而不是传输它),看看您是否可以识别温度传感器,并寻找传输数据和温度之间的某种相关性。

我已经开始解码 Acurite 617,这是我最初的观察结果。我可以告诉你最后一个字节是某种“检查”字节,最后三个字节的下一个包含温度。这些字节也使用第 7 位发送以进行偶校验,并且仅使用每个字节的低半字节。我编写了一个 Arduino 程序来捕获数据并看到以下消息/温度。

40 ce c0 00 00 0c 03 是
(00 0C 03) => 0C3 => 67F

40 ce c0 00 00 0c 84 39
(00 0C 04) => 0C4 => 67F

40 ce c0 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67F

我看到的其他数据/时间是:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

使用它,您应该能够进行“直线”(假设)转换。

由于我没有很好的范围(以及数据每分钟发送一次的事实),我不确定我的时间。我看到同步 HI 和 LO 为 720 微秒,数据位为 240 和 480 微秒。

希望我以后会有更多的信息。我有一堆这样的。一旦它们开始泄漏,我就将它们从游泳池中取出并晾干以在房子周围使用。后来的 617 模块(底部有螺丝和 O 形环)似乎使用寿命更长。


我做了一些更多的解码。最后一个字节(校验字节)使所有八个字节的 XOR 等于 0FFH。例如,对于“40 CE C0 00 00 8D 0C 30”,40 xor CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30 等于 0FF。

此外,我将温度降至 34F,计数为十进制数 10(即 00 00 0A),在 80F 时计数为十进制 264(即 81 00 88 或 108H)。

由此我使用 Temp(F) = 0.1811 * Count + 32.1889。如果我看到任何错误,我可能会获得更大的跨度以获得更好的数据。

在 2016-02-14 上查看 Rob Starling 的字符串:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

异或 = FF

计数 = 0E4 或 228

温度 = 73.5F

几乎所有的射频传输方案都需要在其数据编码协议中具有几个特征。这些将包括:

  1. 用于在频率上锁定接收器的一致格式前导码
  2. 一个同步脉冲指示器,用于标记开始,如果帧指示
  3. 一种使用某种编码时钟对数据 1 和 0 进行编码以进行数据恢复的方法。

您注意到的奇数球脉冲肯定是同步脉冲指示器。

数据编码似乎遵循我所看到的脉冲宽度编码。这是一种相当常见的技术,其中一个过渡方向遵循恒定频率,从而导致恒定宽度的位单元时间。在位单元期间,有效脉冲呈现为位单元时间的 25% 或位单元时间的 75%。该方案不是曼彻斯特编码提供的脉冲到脉冲直流平衡编码方案。脉冲宽度编码的常用技术是通过发送额外的比特在整个消息中创建整体平衡来提供消息协议内的 DC 平衡。在其最简单的形式中,数据被发送两次,第二个副本在逻辑上反转。

在您的示例中,在同步脉冲之前看到脉宽调制数据很奇怪。然而,如果数据解码算法被设计成在这个位置接受接收到的同步数据,这仍然是一个可行的方案。设备可能在同步之前和之后发送一种类型的数据。拆分可以在传感器地址/临时数据或真实数据/反转数据之间。

编辑:

有趣的是,发射器单元似乎使用不同的软件算法来制定同步模式之前的数据单元的正脉冲宽度,而不是同步模式处和之后的脉冲宽度。这意味着可能有一个单独的大块软件生成较早的模式而不是模式的后续部分。这种模式差异可能意味着每种情况下的数据源在如何逐位访问方面需要不同的处理。在时序图中看到的差异可能只是指令时序或模式生成循环中的两个差异。