使用Beagelebone讀取編碼Z相信號

2021-09-22 01:46:13 字數 2771 閱讀 1731

編碼器z相信號,又稱零位訊號,編碼器軸每旋轉一圈,a相和b相都發出相同的脈衝個數,但是a相和b相之間 存在乙個90°(電氣角的一週期為360°)的電氣角相位差,可以根據這個相位 差來判斷編碼器旋轉的方向是正轉還是反轉,正轉時,a相超前b相90°先進行 相位輸出,反轉時,b相超前a相90°先進行相位輸出。編碼器 每旋轉一圈,z相只在乙個固定的位置發乙個脈衝,所以可以作為復位相或零位 相來使用。

關於beaglebone如何使用a b相,請參考

當需要使用編碼器z相信號做精度控制時,如需要在特定位置停止,僅僅使用限位開關,精度是比較差的,這時候就需要限位開關配合z相零點來精確控制了。

1.首先在機械安裝的時候把 z 相信號的 零點位置(編碼器 每旋轉一圈,z相只在乙個固定的位置發乙個脈衝,該位置就是零點位置)對準了。 

2.然後你把限位開關安裝到零點位置,當檢測到限位開關從off->on 跳變時,私服電機需要減速慢行(非常慢的狀態),直到再次檢測到限位開關從on->off 跳變的過程中,一直迴圈判斷是否接收到編碼器z相脈衝訊號 ,一旦檢測到z 相信號,則立即停機。

也就是說:慢速找到乙個近點行程開關。行程開關在on的過程包含了乙個z相的脈衝。這個條件只能由安裝保證。行程開關的on過程開放允許乙個輸入中斷。當z脈衝發生的時候,連線乙個輸入中斷,使得電機立即停止。

另外,用z相脈衝找原點,並非是在z相脈衝出現時將機器立即停下來並且以此為參考點,而是在z相脈衝到來時將計數器清零。如果機器停下來的時候衝過頭,首先零位的精度是不會收到影響的,因為在零位脈衝到來時將a,b相position清零並開始重新計數,過衝的距離可以通過a,b相的position獲取到。

以下程式沒有使用光電開關,僅僅使用了編碼器的z相信號,當系統啟動的時候,首先讓電機以比較快的速度運動,當檢測到z相脈衝的時候,立刻停止電機,這時候由於電機慣性過衝,在讓電機以非常慢的速度反相運動並檢測z相脈衝,一旦檢測到上公升沿,再次立刻停機即可。

#include#include"gpio.h"

#include"sys/poll.h"

#include"pwm.h"

using namespace exploringbb;

using namespace std;

int main()

gpio ingpio_z(49);

ingpio_z.setdirection(input); //設定gpio為輸入

ingpio_z.setedgetype(rising); //設定檢測上公升沿

cout << "即將啟動電機,尋找零點" << endl;

/*pwm pwm("pwm_test_p9_16.13");

pwm.setperiod(500000);

pwm.setdutycycle(75.0f); // 設定週期迴圈的百分比

pwm.setpolarity(pwm::active_low); //正轉

pwm.run();

*/cout << "電機以較快的速度運動尋找零點" << endl;

ingpio_z.waitforedge(); // 輪詢檢測上公升沿

/*pwm pwm("pwm_test_p9_16.13");

pwm.setperiod(500000);

pwm.setdutycycle(100.0f); // 電機停機

pwm.setpolarity(pwm::active_low);

pwm.run();

*/cout << "電機以非常慢的速度反向運動,尋找z相零點精確位置" << endl;

/* pwm pwm("pwm_test_p9_16.13");

pwm.setperiod(500000);

pwm.setdutycycle(90.0f); // 電機慢速

pwm.setpolarity(pwm::active_high); //反轉

pwm.run();

*/ingpio_z.waitforedge(); // 繼續檢測上公升沿,判斷是否到達零點

/* pwm pwm("pwm_test_p9_16.13");

pwm.setperiod(500000);

pwm.setdutycycle(100.0f); // 電機停止

pwm.setpolarity(pwm::active_high);

pwm.run();

*/cout << "找到零點了 " << endl;

cout << "電機停止" << endl;

return 0;

}

配合光電開關的話,將光電開關接上板子即可,接線如下:

棕色:電源正極(+24v,或+5v);

藍色:電源負極(0v或gnd);

黑色:開關訊號輸出(接plc或其它裝置的輸入端);

白色(有的是灰色或其它的淺色),這個的接法多種多樣,

最好是參照光電開關說明書接線,歸納起來大概有如下三種型別:

1 白色為公共端,開關動作時(感應到有物體)需要輸出低電平時白色與藍色短接,

需要輸出高電平時白色與棕色短接.(此種用法較多).

2 白色為反相輸出端,即黑色是常開(no)輸出的話,白色為常閉輸出(nc),

此時只需接其中之一,另一線懸空..(此種用法較少).

3 白色為反相控制端,白色為高電平時黑色為常開(no)輸出,

白色為低電平時黑色為常閉輸出(nc)...(此種用法很少).

使用phpExcelReader讀取excel檔案

避免將excel檔案轉化成csv格式,在進行資料讀取,而且支援多sheet檔案。在這個需求前提下,我選擇了2款php開源類 phpexcelreader phpexcel。其中後者支援讀寫,但是需要php5.2以上版本,並且需要開啟zip支援 重點說一下 phpexcelreader,因為 phpe...

C 讀取PDF PDFBox使用

這個絕對是個好 將以上4個檔案引用到專案中,在檔案中需要引入以下2個命名空間 using org.pdfbox.pdmodel using org.pdfbox.util 三 api的使用方法 using system.io using system.text using org.pdfbox.pd...

使用GDAL讀取影像

最近在學習gdal和opencv,gdal的強大功能我就不用說了,大家上網可以查到很多關於它的資料。opencv是乙個開源的計算機視覺庫,可以去opencv中文論壇具體了解它,說下我的構思吧,opencv庫里有很多關於數字影象處理的函式,但是它卻侷限於遙感影象的讀取,而gdal卻對遙感影像的讀取支援...