擅长:python、mysql、java
<p>它不能不失去位,因此精度。基本上你需要把你的ADC当作8位来处理。这可能没有听起来那么糟糕,例如,如果你的ADC是12位(在你的问题中不清楚),你只会失去4位。在</p>
<pre><code>uint8_t send = (adc_high_byte << 6) | (adc_low_byte >> 2) ;
</code></pre>
<p>然后在接收器中:</p>
^{pr2}$
<p>在您的示例中,4088被发送为4088/16=255,并且在接收器处它被转换:</p>
<pre><code>(255 * 5.0) / 256 = 4.98
</code></pre>
<p>但请注意</p>
<pre><code>(254 * 5.0) / 256= 4.96,
</code></pre>
<p>所以最终得到的精度约为0.02(确切地说,如果255表示的最大值为5.0,则精度为5.0/256=0.01953125)。这与原始精度5/4096=0.00122相比</p>
<p>可以使用<a href="https://en.wikipedia.org/wiki/Companding" rel="nofollow"><em>companding</em></a>进一步细化。在某些应用程序中,例如音频,保留小信号电平的细节比保留高信号电平更重要,因此可以使用非线性编码将12位数据转换为8,这样0和1之间的差远小于254和255之间的差。它的适用性和成功将取决于应用程序-它适用于音频。在其他应用中,不同的非线性编码可能是合适的,例如,对于电池监测,您可以在放电曲线的拐点处使用高分辨率,在这里电压下降率迅速增加(在某些电池化学中)。在</p>
<p>最后,正如@chux所建议的那样,你可以用更少的比特来传输delta(电平的变化),并保留完整的分辨率(但会损失一些绝对精度),但这是他的建议,所以我不会详细说明,只是说这种技术可以与压扩一起使用。在</p>