2012-03-28 76 views
1

我有一個Arduino Mega連接到6軸機器人手臂。所有6箇中斷都連接到編碼器(中斷上一個編碼器引腳,另一個在香草數字輸入上)。中斷與此代碼處理:Arduino編碼器中斷破壞串行數據

void readEncoder1(){ 
//encoders is a 2d array, where the first d is the axis, and the two pin numbers 
//first pin is on an interrupt (CHANGE), and second is a standard digital in 
    if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) { 
    positions[0]++; 
    } else { 
    positions[0]--; 
    } 
if(servoEnable){ 
    updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly 
} 
} 

這被設計成保持在特定的位置 - 鎖定臂如果Arduino的檢測到電機的位置是關閉的一定閾值時,它更新電源去到電機保持手臂就位。如果兩個或三個(或更多)軸處於負載狀態(需要不斷更新以保持位置),或者它們正在移動,則Arduino將停止接收串行輸入上的完整命令,其中幾個字符將被丟棄。中斷顯然運行得非常快,並且由於某種原因,這導致命令被破壞。有沒有辦法解決?在架構上,我是這樣做的嗎?我的主要目的是在主運行循環中以100毫秒的間隔調用updatePositions(),這是否會顯着減少中斷開銷?我想我的問題歸結爲,即使所有6個編碼器都在脈動,我如何才能在Arduino中獲得可靠的串行命令?

回答

2

正交編碼器被設計爲由硬件計數器讀取。電機全速運轉時脈率通常很高。一兆赫茲並不罕見。脈衝數越高,伺服迴路工作得越好,您可以更精確地定位電機。

這樣做是在與低功耗CPU的軟件,很好,具有挑戰性。當ISR花費的時間比脈衝之間的時間間隔長時,它會崩潰。你會失去脈衝,因此位置。特別糟糕,因爲您無法檢測到這種錯誤情況。而且這種損失發生在機器人快速移動時,最糟糕的情況是失去控制。

你絕對不能更新中斷處理程序中的伺服迴路,所以先把它擺脫掉。把ISR保持在最低限度,只計算位置,沒有別的。伺服迴路應該是分開的,由定時器中斷或滴答驅動。你不能正確地控制一個100毫秒伺服更新的機器人,除非它是一個很大的緩慢,爲了獲得平滑的加速度和穩定的反饋,最多需要幾個毫秒。

花40美元來控制價值數千美元的機器人硬件的智慧是有限的。不能跟上伺服環路,你可以檢測到,當位置錯誤累積太多時,關閉它。沒有什麼可以做的關於失去脈衝,這是一個殘骸。獲取硬件計數器。

1

嵌入式系統的第一條規則:

做盡可能少的中斷。

就你而言,只需更新中斷中的位置並在後臺或低優先級運行位置/速度控制循環。

另外:我假設你知道你正在「丟失」編碼器脈衝,因爲你在其中一個通道上沒有中斷?

此外,中斷驅動的編碼器分析非常容易產生噪音。如果你得到一個噪聲脈衝,你可能只會看到其中一個邊緣的中斷,因爲它們會太靠近以處理兩者。

更強大的方法是使用一個狀態機,它監視所有4個轉換,但需要在兩個通道的兩邊都有中斷,或者輪詢速度足夠快以至於不會錯過任何您希望看到的速率。