[教學] NXT Output – 馬達過度負載

延續我們的 NXC 常用指令 – Outputs 教學系列,今天要來詳細介紹當時所提到的 MotorOverload 指令。

上次我們提到 MotorOverload 指令必須配合定轉速模式,才能發揮作用。然而,這個指令在使用時有個缺點,當我們把輸出電力調到大於80左右時,馬達連轉都不會轉。CAVE推測是因為當馬達轉速提高時,轉動的阻力也相對提高,而設計者當初在設計這個指令的時候可能沒有考慮到這點,所以當輸出電力到達一定的程度的時候,馬達就不會轉了。

要解決這個問題,我們必須先了解一點原理。

首先,我們要怎麼知道馬達在轉動時遇到阻力了呢?

答案很簡單,只要透過角度感應器就可以了。當在一定的時間間隔內,馬達轉動的角度沒有增加,就表示馬達遇到了阻力。問題來了,這樣的程式要怎麼寫呢?

以下列出 NXC 與 NXT-G 的程式給大家參考:

NXC:

task main()
{
         int m;
         m = MotorTachoCount(OUT_A);   //此時 m 為0 (因為馬達還沒開始轉)
         OnFwd(OUT_A,100);
         Wait(100);                                          
         while( abs(m-MotorTachoCount(OUT_A))>10 )
        {
                 m = MotorTachoCount(OUT_A);
                 Wait(100);
         }
         Off(OUT_A);
}

NXT-G:

兩個程式的原理都一樣,先讓馬達轉動0.1秒,因為有先轉動0.1秒,所以
abs(m-MotorTachoCount(OUT_A))>10 成立,進入迴圈。在迴圈內,將當前的角度值存入變數裡面,馬達繼續轉動0.1秒,又回到條件判斷,因為將角度值存入變數裡面後馬達又轉了0.1秒,若是沒有遇到阻力,馬達轉動的角度就會更大,所以條件仍會成立。也就是說,程式會讓0.1秒前後的角度值相減,只要馬達的轉速一定,條件就會一直成立。

若是您對於以上的說明感到有點困惑,建議您在腦中把迴圈的流程多想幾遍,就會了解了。

最後來看看程式的效果:

需要NXT-G原始檔的朋友,歡迎留言索取!

About CAVEDU 阿吉 - 雜工 (2521 Articles)
CAVEDU 教育團隊 打雜
Contact: Website

4 Comments on [教學] NXT Output – 馬達過度負載

  1. 探奇自然科學教室 // 四月 10, 2010 at 11:54 上午 // 回覆

    謝謝你的說明!

    剛好在nxtasy.org看到這個討論。分享一下。

    [版主回覆04/10/2010 23:17:20]

    謝謝邱老師, John Hansen的建議如下:

    "Try checking if the run state is running and power is not zero and the rotation count is unchanging."

    意即在RUNSTATE變數 = running (這樣講實在很拗口…)且馬達電力不為零時, 如果角度感應器值不變的話, 就代表馬達卡住了. (stalling). 以上參數在NXC中可以用 GetOutput()取得.

                                                                                       阿吉

  2. 實作時,對於重負載的機構, 有可能因為外部抗力太大, 導致遲滯現象而影響判斷的準確性,
    所以, 建議可以再加上次數檢查, 我的作法是:
    於固定的時間週期檢查角度的變化是否小於指定值,
    若符合條件, 則開始計次, 同時判斷持續的次數是否已經超過指定值, 一旦達到設定的次數, 就可以研判馬達已經無法驅動機構的運作
    而期間如果角度變化超過指定值, 此時馬達應該已經克服外力恢復運轉, 所以計數器就歸零.
    這裡有我測試Firgelli Linear Actuator時作的程式範例

    [版主回覆04/10/2010 23:20:26]

    謝謝ch_lego兄的建議, 又上了一課呢.

                                                                  阿吉

  3. 探奇自然科學教室 // 四月 11, 2010 at 3:29 下午 // 回覆

    補充一點:

    RUNSTATE變數可以直接從GetOutput(p, RunState)取得,

    也可以使用這個巨集 MotorRunState得到,就像MotorOverload一樣。

    RunState定義在NXC_Guide.pdf第50頁最下方。

    John Hansen真貼心,已經都設計好了。
    [版主回覆04/12/2010 00:09:19]

    謝謝探奇的補充~  

  4. 這次Mindsensors即將要上市的NXTMMX, 它的user guide已經更新到V1.0,
    其中第7頁對於Motor回饋狀態的說明表格, 可以發現bit7是作為反應Motor is stalled的指示位元,
    可見NXTMMX已經將偵測功能加入Firmware中, 不過實際的運作行為還是需要實測驗證

    [版主回覆04/17/2010 22:56:17]

    感謝ch_lego兄提供的意見, 非常感謝.

Leave a comment

Your email address will not be published.


*