2017-04-10 67 views
2

我的項目是關於製造旋塗機。基本上是使用離心機來覆蓋具有微厚度的基板的機器。無論如何,對於這個項目來說,它需要我輸入電機用來旋轉基板的時間和速度。然後讀取電機的轉速,並重新開始新的會話。我現在的問題是,如何在使用傳感器讀取轉速時運行電機。步驟1:設置電機的速度(使用伺服值103-180)和電機的時間(秒)(電機需要旋轉多長時間)。我的程序中是否需要多線程?

在這一步中,有3個階段的速度和時間設置。我需要使用鍵盤輸入這個階段的速度和時間。

步驟2:將馬達和rpm測量讀數

對於該步驟的紡絲,速度和時間的值是變成整數。這允許電機根據給定的時間旋轉。同時,隨着電機旋轉,轉速測量也會開始,讀取電機的轉速並顯示在LCD屏幕上。

第3步:電機停止並重復步驟1

這裏是我的問題,我該如何使電機旋轉而轉讀取?我可以做單線程或多線程(希望不會在多線程中,仍然是arduino的初學者)

+0

Arduino上沒有線程。 –

回答

3

Arduino沒有線程。線程通常是操作系統的一個功能。使用Arduino,您沒有經典意義上的操作系統。 你的代碼,包括它使用的庫,直接在硬件上運行。

該系統已設置,以便您的loop函數將被重複調用。一次做多件事的通常方式(如控制電機速度,讀取傳感器和更新顯示器)是在循環過程中完成一些任務。在僞代碼,可能是這樣的:

void loop() { 
    int rpm = read_rpm_from_sensor(); 
    adjust_motor_timing(rpm, target_rpm); 
    display_speed(rpm); 
} 

好像你也有階段:初始化階段用戶在其中輸入值,運行階段和完成階段。你可以通過使用一個全局的「狀態」變量來處理這些變量,這個變量跟蹤你所處的階段。你在setup()中初始化你的狀態,然後在循環()中讀取它以決定你需要做什麼工作。

enum { enter_values, run, finish } state; 

void setup() { 
    // your other initialization goes here 
    state = enter_values; // set up the starting state 
} 

void loop() { 
    switch (state) { 
    case enter_values: 
     get_values_from_keyboard(); 
     state = run; 
     break; 
    case run: 
     int rpm = read_rpm_from_sensor(); 
     adjust_motor_timing(rpm, target_rpm); 
     display_speed(rpm); 
     if (enough time has elapsed) { 
     state = finish; 
     } 
     break; 
    case finish: 
     stop_motor(); 
     // go back to the initial state for the next run 
     state = enter_values; 
     break; 
    } 
} 

這應該給你一個一般結構的想法。

對於某些需要非常精確定時的傳感器和外圍設備,您可能會使用直接處理硬件的中斷。但是,這是一個非常相似的想法:你需要將你需要做的工作分解成非常小的塊,你可以一遍又一遍地做。唯一改變的是中斷可能會(簡要地)中斷你正在做的任何事情。但CPU一次只能做一件事。

+0

我瞭解你的FSM結構。在一個大的圖景中,我可以看到。所以對於所有的功能,我必須編寫具體的任務來使這個功能起作用? – rjadkins

+0

是的,這些僅僅是佔位符函數,可以讓您瞭解您必須提供的具體內容以及它們適用於結構的位置。 當您實施它們時,請確保您不添加任何延遲呼叫。每一步都必須在相當短的時間內完成,以便「同時」發生的其他任務可以做他們需要做的事情。 –

相關問題