模拟到数字输入标定方程适用于代码块,但不适用于微控制器
我很迷茫,如何解决这个问题,它应该如此简单。我正在使用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-255到数字50-100。
回到老年代y = mx + b
代数。
当时x = 0
,y = 50
。因此:
y = mx + b
50 = m*0 + b
b = 50
当x = 255
,y = 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
听起来就像你在codeblack中得到了正确的结果,因为整数提升和由于变量溢出而在硬件中得到不正确的结果。
- uint8_t可以包含0到255
- 能中int8_t包含-126 125
- uint16_t可以包含0到65635
- ...
假设你有uint16_t,微观的数学将如下进行:
((255 + 200) * 200)/800
-
(455 * 200)/800
:455 * 200
溢出16位变量! -
(25464)/800
:需要注意的是91000 & 0xFFFF == 25464
31
您可以简化您的公式解决此问题: (user_input + 200)/4
相当于((user_input + 200) * 200)/800
,并会在16位不会溢出,虽然你的准确度不是很高正如ImaginaryHuman072889所指出的那样。
哦,真好!我怀疑像这样的事情,但不知道如何解决。谢谢! –
好的一点,我甚至都没有把它简化成一个简单的等式,我有点匆忙,只是把数字插入我的计算器,因为我正在修改一个不同的等式,这个和数学不是我的强项。 –