【问题标题】:Analog to Digital input scaling equation works in codeblocks but not on Microcontroller模数输入缩放方程适用于代码块,但不适用于微控制器
【发布时间】:2017-10-18 17:31:07
【问题描述】:

我不知道如何解决这个问题,它应该很简单。我正在使用 pic16F1526 并尝试将模拟到数字的读数从 0-255 大致缩放到 50-100。我正在使用这个等式

结果 = ((user_input + 200) * 200) / 800;

在代码块和我的计算器上,它适用于 0-255 的所有数字,无论我在代码块中使用 8 位、16 位变量,它都能完美运行。 我已经验证了 AtoD 输入工作正常,将数据发送到 UART。即使我输入静态数字代替样本,我也会得到奇怪的结果。

当 acd 读取 255 或我输入 255 时,等式会给出十进制的 31,而不是应该的 100。我唯一能想到的是,8 位 PIC 的数学运算方式变得一团糟,因为它有点微。

【问题讨论】:

    标签: math numbers scaling microchip


    【解决方案1】:

    听起来您在 codeblack 中获得了正确的结果是因为整数提升,而因为变量溢出而在硬件中获得了不正确的结果。

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

    假设你有 uint16_t,micro 的数学运算如下:

    • ((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 指出的那样高。

    【讨论】:

    • 哦,太好了!我怀疑发生了这样的事情,但不知道如何解决。谢谢!
    【解决方案2】:

    如果我正确理解您的问题,您希望将数字 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
    

    【讨论】:

    • 好点,我什至没有费心将其简化为一个更简单的方程,我有点匆忙,只是将数字插入我的计算器,因为我正在修改一个不同的方程,嗯,数学不是'这是我的强项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多