找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1312|回復(fù): 3
收起左側(cè)

請教如何使用光電計數(shù)確定電機位置

[復(fù)制鏈接]
ID:773929 發(fā)表于 2024-10-12 15:27 | 顯示全部樓層 |閱讀模式
50黑幣
各位師傅,老板要求用一個光電傳感器+電機+齒輪控制滑軌上的滑塊來回運動,通俗點就是類似編碼器一樣的裝置,要求滑塊可以到指定位置,目前思路是 利用正反轉(zhuǎn)輸出IO做正反轉(zhuǎn)反饋,以此來確定光電計數(shù)是否應(yīng)該加或減,以下是一些疑惑的地方:

1.這個雖然不是編碼器,但定義計數(shù)值變量的時候要不要考慮正負?
2.電機齒輪上只有5個齒,光電輸入中斷應(yīng)該設(shè)置為 上升沿觸發(fā) 還是上升沿+下降沿觸發(fā)?
3.滑軌開端有一個行程開關(guān),我想將其作用到滑塊歸零設(shè)置上,但領(lǐng)導建議作為出軌報警功能,哪一個更好?

這個電機是帶有剎車的。

還請問各位師傅我這個思路可行嗎,或者有什么建議?

代碼框架:

unsigned long 計數(shù)值

光電中斷函數(shù)()
{
   if(正轉(zhuǎn) == 1)
  {
     計數(shù)值++;

   }else 計數(shù)值--;

}

回復(fù)

使用道具 舉報

ID:982617 發(fā)表于 2024-10-14 10:22 | 顯示全部樓層
你的思路總體可行,但是細節(jié)上需要調(diào)整。以下是對你提出的問題進行解答:
1. 計數(shù)值變量是否要考慮正負?
要考慮正負。你需要定義一個方向變量,例如 ,用于記錄滑塊是正向運動還是反向運動,然后根據(jù)方向變量來決定計數(shù)值是加還是減。direction
2. 光電中斷觸發(fā)方式?
建議使用上升沿 + 下降沿觸發(fā)。這樣可以確保每次光電傳感器檢測到齒輪上的齒,都能觸發(fā)中斷,即使滑塊速度很快,也不會漏掉計數(shù)。
3. 行程開關(guān)功能?
你的領(lǐng)導建議將其作為出軌報警功能更合理。因為行程開關(guān)主要用于檢測滑塊是否超出滑軌范圍,作為出軌報警可以提高系統(tǒng)安全性。而將行程開關(guān)用于歸零設(shè)置,需要考慮滑塊初始位置的不確定性,可能導致歸零不準確。

改進建議:
添加方向變量: 定義一個 變量,用于記錄滑塊運動方向,初始值為 (正向)或 (反向)。direction1-1
修改中斷函數(shù): 將 的加減操作與 變量關(guān)聯(lián)起來。計數(shù)值direction
使用剎車功能: 使用電機剎車功能,可以更快速地停止滑塊運動,并保證滑塊停在目標位置。
考慮誤差累計: 齒輪只有 5 個齒,可能導致計數(shù)誤差累積。建議考慮增加齒輪的齒數(shù),或者使用其他傳感器來輔助定位,例如霍爾傳感器。
代碼框架示例:
unsigned long 計數(shù)值 = 0;
int direction = 1; // 初始值為正向運動
void 光電中斷函數(shù)()
{
  if (direction == 1)
  {
    計數(shù)值++;
  }
  else
  {
    計數(shù)值--;
  }
}

void 設(shè)置目標位置(int targetCount)
{
  // ... 根據(jù)計數(shù)值和方向變量控制電機正反轉(zhuǎn),直到計數(shù)值達到目標值
}

void 行程開關(guān)中斷函數(shù)()
{
  // ... 設(shè)置報警標志
}
其他建議:
使用更專業(yè)的傳感器,例如編碼器,可以提高定位精度,減少誤差累積。
考慮使用 PID 控制,可以更精確地控制滑塊運動,并減少抖動和誤差。
希望以上建議能夠幫助你更好地實現(xiàn)你的項目!
回復(fù)

使用道具 舉報

ID:982617 發(fā)表于 2024-10-14 10:24 | 顯示全部樓層
你的思路基本上是可行的,但有一些細節(jié)需要注意和調(diào)整。以下是針對你提到的幾個疑惑的具體建議和思考:
1. 計數(shù)值的正負
是否需要考慮正負取決于你的設(shè)計邏輯。如果你的電機有明確的正向和反向,那么最好使用正負值來表示滑塊的運動方向。比如:
- 正值表示正向運動(向右)。
- 負值表示反向運動(向左)。
通過這種方式,計數(shù)值可以反映滑塊相對于初始位置的偏移,更加直觀。
2. 光電輸入中斷的觸發(fā)方式
由于電機齒輪上只有5個齒,如果你希望在每個齒到達光電傳感器時都能進行計數(shù),那么可以設(shè)置為**上升沿 + 下降沿觸發(fā),這樣每次齒的進入和離開都能觸發(fā)中斷,從而更精確地進行計數(shù)。
3. 行程開關(guān)的作用
關(guān)于行程開關(guān)的用途,建議將其除了作為出軌報警功能外,最好也作為滑塊歸零設(shè)置的功能。這里有幾個理由:
- 歸零設(shè)置可以為滑塊提供一個參考位置,使得在系統(tǒng)中可以更容易地計算滑塊的確切位置。
- 設(shè)定歸零位置后,滑塊可以在這個位置上進行校準,避免誤差積累。
- 如果單獨作為出軌檢測,可能在滑塊正常工作時無故產(chǎn)生誤報,容易導致不必要的停機。
4. 代碼框架的完善
以下是改進后的代碼框架示例,考慮了你提到的正負計數(shù)和光電中斷的觸發(fā)模式。

```c
unsigned long 計數(shù)值 = 0;      // 移動計數(shù)值
int 正轉(zhuǎn) = 1;                  // 設(shè)定運動方向標志

void 光電中斷函數(shù)() {
    // 在中斷處理函數(shù)中判斷觸發(fā)方向
    if (光電傳感器觸發(fā) == 上升沿) {
        // 進入時,當電機正轉(zhuǎn)
        if (正轉(zhuǎn) == 1) {
            計數(shù)值++;
        } else {
            計數(shù)值--;
        }
    } else if (光電傳感器觸發(fā) == 下降沿) {
        // 離開時,亦可反向計數(shù)
        if (正轉(zhuǎn) == 1) {
            計數(shù)值++;
        } else {
            計數(shù)值--;
        }
    }
}

// 設(shè)置歸零位置的行程開關(guān)函數(shù)
void 行程開關(guān)處理() {
    if (行程開關(guān)觸發(fā)) {
        計數(shù)值 = 0; // 歸零
        // 可能還需要增加電機停止或其他安全機制
    }
}
```
其他建議
- 剎車控制:考慮電機剎車的觸發(fā)條件,確保在滑塊到達目標位置或出軌時能夠及時剎車。
- 安全性:在程序上增加安全檢查,以避免滑塊在達到行程開關(guān)時仍繼續(xù)運動。
- 調(diào)試與測試:完善調(diào)試過程,確保每個部分都能正常工作?梢栽诠怆娭袛嗪托谐涕_關(guān)上增加LED指示燈,便于實時觀察狀態(tài)。
總的來說,考慮到準確性和安全性,是非常重要的。希望這些建議對你有所幫助!
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2024-10-14 15:03 | 顯示全部樓層
1.要不要考慮正負?
原則上不考慮,把初始點設(shè)成原點,不存在負值。
2.電機齒輪上只有5個齒,光電輸入中斷應(yīng)該設(shè)置為 上升沿觸發(fā) 還是上升沿+下降沿觸發(fā)?
看你要求控制精度,以及光電模塊輸出特性,上下同時的理論精度高一倍。
3.滑軌開端有一個行程開關(guān),我想將其作用到滑塊歸零設(shè)置上,但領(lǐng)導建議作為出軌報警功能,哪一個更好?
應(yīng)該設(shè)置在歸零點。我理解滑臺一端歸零點,一端為出軌點,因為歸零點風險最大,滑塊經(jīng);,不做保護比出軌端風險更大,而且歸零點有開關(guān)可以消除累積誤差。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表