2013-05-02 53 views
1

我有一個串行連接,它從連接到J熱電偶的微型計算機獲取數據。微處理器發送一個從0到1023的數值,與測得的毫伏成正比。 來自串行的數據存儲在變量「Thm1」中,該變量不斷更新。我的目標是計算溫度,重新轉換接收到的數據並在文本框中顯示相同內容。熱電偶的輸出不是線性的,因此我不能使用公式,我應該從表格中讀取數據,以毫伏/溫度爲單位給出5度的步長,並將接收值整合到兩個最接近的值之間。將串行數據關聯到表

假設1023對應16,881 mV。因此我有1023點每個是0.01650毫伏。我從串行800接收,對應於0,016550 x 800 = 13,2012 mV。看這張表pyromation.com/downloads/data/emfj_c.pdf,左邊第一個顏色,值在240到250攝氏度之間。我可以在這兩點之間做出線性整合。但是,我怎麼能找到這兩點呢?有沒有更好的方法比使用一系列的if和if其他嗎?

請舉例。

+0

該怎麼做? – 2013-05-02 20:08:48

+0

如何將毫伏與表格中的數據關聯以獲得溫度。 – FeliceM 2013-05-02 20:12:09

+0

你應該把你的問題的評論,而不是作爲評論 – 2013-05-02 20:57:22

回答

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截斷從
  • 出土文物推斷表格中的第一個截止點大於您要轉換的值
  • 檢查我們是否有值大於表中指定,在這種情況下使用的最後兩個臨界值
  • 如果我們有小於表指定的值,在這種情況下,使用前兩個截止
  • 使用兩個表點做線性外推。
+0

尼古拉斯,非常感謝您的建議。我並不完全瞭解所有的代碼,但我會提供一些經驗和測試。謝謝。 – FeliceM 2013-05-02 21:00:07

+0

更新了表格邊界之外的值,也試圖解釋一下 – 2013-05-02 21:16:30