1

我有一个串行连接,它从连接到 J 热电偶的微控制器获取数据。微处理器发送一个从 0 到 1023 的数值,与测量的毫伏成正比。串行数据存储在一个不断更新的变量“Thm1”中。我的目标是计算重新转换接收数据的温度并在文本框中显示相同的数据。热电偶的输出不是线性的,因此我不能使用方程,我应该从一个以 5 度为单位给出毫伏/温度的表格中读取数据,并将接收到的值整合在两个最接近的值之间。

让我们假设 1023 对应于 16,881 mV。因此,我有 1023 个点,每个点是 0.01650 mV。我从串行 800 收到对应于 0,016550 x 800 = 13,2012 mV。查看此表 pyromation.com/downloads/data/emfj_c.pdf ,左侧第一列,值在 240 到 250 摄氏度之间。我可以在这两点之间进行线性积分。但是,我怎样才能找到这两点呢?有没有比使用一长串 if 和 if else 更好的方法?

请举例。

4

1 回答 1

1

您可以进行线性外推,例如:-

public static decimal ExtrapolateFrom(int f, int s, decimal f1, decimal s2, int value)
{            
    return (s2-f1)/((s-(decimal)f)/(value-(decimal)f))+f1;         
}

public static decimal ExtrapolateFrom(List<Tuple<int, decimal>> table, int value)
{
    if(table.Count < 2) throw  new Exception("Not enough values to extrapolate from");
    var result = table.Select((x, i) => new { x, i }).Where(x => x.x.Item1 >= value).Select(x => x.i).ToList();
    var index = result.Any()? result.First() : table.Count-1;
    if (index < 1) index = 1;    
    return ExtrapolateFrom(table[index - 1].Item1, table[index].Item1, table[index - 1].Item2,table[index].Item2, value);
}


private static void Main(string[] args)
{
    var table = new List<Tuple<int, decimal>> ()
        {
            new Tuple<int, decimal>(0, 0.0M),
            new Tuple<int, decimal>(100, 5.0M),
            new Tuple<int, decimal>(200, 6.0M),
            new Tuple<int, decimal>(300, 9.0M),
            new Tuple<int, decimal>(500, 11.0M),
        };


    Console.WriteLine(ExtrapolateFrom(table, 50));
    Console.WriteLine(ExtrapolateFrom(table, 400));
    Console.WriteLine(ExtrapolateFrom(table, 600));
}

ExtrapolateFrom需要一张桌子的那个: -

  • 检查以确保至少有 2 个截止值从
  • 找到表中大于您要转换的值的第一个截止值
  • 检查我们是否有一个大于表指定的值,在这种情况下使用最后两个截止值
  • 如果我们的值小于表指定的值,在这种情况下使用前两个截止值
  • 使用两个表格点进行线性外推。
于 2013-05-02T20:53:52.117 回答