我有一个串行连接,从连接到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等长序列更好的方法?
请举例。
答案 0 :(得分: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
可以: -