2017-10-18 61 views
0

我很迷茫,如何解决这个问题,它应该如此简单。我正在使用pic16F1526,并试图将模拟量从0-255的读数大致调整为50-100。我正在使用这个公式模拟到数字输入标定方程适用于代码块,但不适用于微控制器

result =((user_input + 200)* 200)/ 800;

在代码块和我的计算器中,它可以在0-255的所有数字下工作,并且无论我在代码bloack中使用8位,16位变量,它都能很好地工作。 我已经验证了AtoD输入正在正确地将数据发送到UART。即使我输入静态数字代替样本,我也会得到奇怪的结果。

当acd读取一个255或我输入一个255时,该公式给出了一个十进制数31,而不是像它应该的100。我能想到的唯一的事情就是越来越乱,因为它有点微,因此8位PIC是数学算术。

回答

0

如果我正确理解你的问题,你想线性地映射数字0-255到数字50-100。

回到老年代y = mx + b代数。

当时x = 0y = 50。因此:

y = mx + b 
50 = m*0 + b 
b = 50 

x = 255y = 100。因此:

y = mx + 50 
100 = m*255 +50 
m*255 = 50 
m = 50/255 = 10/51 

因此,精确的答案是:

y = (10/51)*x + 50 

在一个侧面说明,我不知道在100插入到您的公式,当你怎样得到的31结果。见下文。

(255+200)*200/800 = 113.75 
+0

好的一点,我甚至都没有把它简化成一个简单的等式,我有点匆忙,只是把数字插入我的计算器,因为我正在修改一个不同的等式,这个和数学不是我的强项。 –

2

听起来就像你在codeblack中得到了正确的结果,因为整数提升和由于变量溢出而在硬件中得到不正确的结果。

  • uint8_t可以包含0到255
  • 能中int8_t包含-126 125
  • uint16_t可以包含0到65635
  • ...

假设你有uint16_t,微观的数学将如下进行:

  • ((255 + 200) * 200)/800
  • (455 * 200)/800455 * 200溢出16位变量!
  • (25464)/800:需要注意的是91000 & 0xFFFF == 25464
  • 31

您可以简化您的公式解决此问题: (user_input + 200)/4相当于((user_input + 200) * 200)/800,并会在16位不会溢出,虽然你的准确度不是很高正如ImaginaryHuman072889所指出的那样。

+0

哦,真好!我怀疑像这样的事情,但不知道如何解决。谢谢! –

相关问题