debug都沒問題~可是馬達還是轉個不停 |
答題得分者是:foreman
|
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
此程式碼作用為抓取encoder讀取到的值
然後經過計算~判斷馬達該輸出多少pulse來補正 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 程式碼裡的[[判斷是否讀取新值]] 是跟上一次抓取的值作相減,若相減後等於0就代表encoder沒動 沒動的話就繼續抓值 照理說應該會在抓值程式那邊形成loop 而不會跑到馬達輸出的程式才對 可是接上電後馬達卻一直轉 想請問一下為何會這個樣子?? 希望有人可以幫我解答一下~~3q |
㊣
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
1> 程式沒問題不代表結果就會是你想要的.
2> 請問Encoder初值為何?一定是零嗎? 第一次取值時要怎麼判斷馬達沒在動? 3> 建議你找模擬軟體, 單步執行, debug 看看. 應該就可以知道問題在那裡了.
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
編輯記錄
㊣ 重新編輯於 2007-10-15 02:08:12, 註解 無‧
|
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
===================引 用 ㊣ 文 章=================== 2> 請問Encoder初值為何?一定是零嗎? 第一次取值時要怎麼判斷馬達沒在動? 3> 建議你找模擬軟體, 單步執行, debug 看看. 應該就可以知道問題在那裡了. ================================================ 你好~~謝謝你的回覆 encoder初值為零,有使用led燈判斷過了 所以假設encoder都不動 第一次取值時dph和dpl都為零 R3也為0 , 所以在CJNE指令時就可以判斷ENCODER位置沒改變 我是用Keil uVision2寫的 這個軟體裡面就有debug的功能 單步執行的時候正常 , 會在[[判斷是否讀取新值]]作一封閉迴圈 真納悶阿.......... |
bernie_w39
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
|
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
===================引 用 bernie_w39 文 章=================== SUBB 會連帶考慮 C 旗號, 在 SUBB 之前應該先把 C 清掉 ( e.g. CLR C ) 才能判斷 DPL 是否等於 R3 MOV A,DPL ; {{ SUBB A,R3 ; 與舊值相減~判斷是否有讀取新值 CJNE A,#00H,STA_GET_DATA ; 有的話則跳至STA_GET_DATA ========================================================= 謝謝你的回覆: 使用單步執行的時候 不管是否有跳出[[判斷是否讀取新值]]這個迴圈 在subb的時候cy都是0 不過為了以防萬一我還是在subb之前加了clr c 但是馬達還是一直轉......|||| 真不知道問題出在哪.... |
bernie_w39
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
您這篇似乎是接續上一篇的單擺實驗而來的, 不曉得您之前的問題解決了沒?
如果是我查問題的話, 我會優先確定 encoder 出來的結果是正確的. 既然您有 用 LED 來顯示正反轉, 可以先把馬達驅動的電路斷開, 用手轉動單擺, 看看 encoder 的方向判斷是否正確. 因為這是 MCU 的輸入級, 如果輸入訊號都不對了, 查程式其實意義不大. 如果確定 encoder 訊號不對, 就再查機械部份 (應該是光遮斷器) 的輸出是否 正確 (e.g. channel A, channel B 的相位順序, 訊號準位...). |
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
===================引 用 bernie_w39 文 章=================== 您這篇似乎是接續上一篇的單擺實驗而來的, 不曉得您之前的問題解決了沒? 如果是我查問題的話, 我會優先確定 encoder 出來的結果是正確的. 既然您有 用 LED 來顯示正反轉, 可以先把馬達驅動的電路斷開, 用手轉動單擺, 看看 encoder 的方向判斷是否正確. 因為這是 MCU 的輸入級, 如果輸入訊號都不對了, 查程式其實意義不大. 如果確定 encoder 訊號不對, 就再查機械部份 (應該是光遮斷器) 的輸出是否 正確 (e.g. channel A, channel B 的相位順序, 訊號準位...). ======================================================== 你好: encoder讀到的值是正確的 , 這個已經確認過了 讀值的部分跟馬達驅動的部分分開做的話都正確 可是一結合的話就出問題 ~3Q |
foreman
高階會員 ![]() ![]() ![]() ![]() 發表:3 回覆:124 積分:190 註冊:2004-09-10 發送簡訊給我 |
|
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
|
foreman
高階會員 ![]() ![]() ![]() ![]() 發表:3 回覆:124 積分:190 註冊:2004-09-10 發送簡訊給我 |
大大:
請參詳: http://elearning.stut.edu.tw/mechelec/ch1.htm ===================引 用 auturmal 文 章=================== P0與HCTL-2020之間沒接電阻 問這個問題的原因是否為接上馬達後電流被馬達吃走導致讀取的數值錯誤?? |
bernie_w39
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
我想問一下, 你是否有 debug 的工具, 可以真的作到線路上的單步驟執行?
如果有, 請利用單步驟執行, 在 CALL_RI_PULSE 與 CALL_REV_PULSE 兩個點 設中斷, 記錄 DPL, DPH 的值, 然後再到 TURN_RI, TURN_REV 點時, 記錄 R4 的值, 再 PO 上來看看. 如果只有軟體的模擬, 就不用作以上的動作, 把 TURN_RI 與 TURN_REV 最後面 的 SJMP START 改成 TURN_RI_HALT: SJMP TURN_RI_HALT 以及 TURN_REV_HALT: SJMP TURN_RI_HALT 我在猜是不是你在控制馬達轉動之後, 讀到的 encoder 內容, 造成誤判. 因為你的 encoder 解析度是馬達可控制的 20 倍, 所以可能在馬達停止後, 一個微小的反向 震動, 造成 encoder 設定 U/D 為反向, 所以會轉不停. 另外我仔細看了一下你的程式, 有幾個小建議. 1. 如果你覺得 2 bytes 去除 20 不好寫, 可以用一個大約數來作, 例如要作 x / 20 就改用 x / 16 - x / 64 x / 256 約為 0.0508x . 這樣的結果雖不精確, 但是好算 也是線性的, 比起你用 hi-byte * 13 lo-byte / 20 會跳格的結果要好. 2. 取負數應該要用 0 去減, 用 0xff 去減的結果是錯的, 除非你有預設借位. 3. 8051 的減法都會考慮 C 旗號, 所以習慣先設一下再作 SUBB 比較好. |
auturmal
一般會員 ![]() ![]() 發表:8 回覆:10 積分:3 註冊:2007-09-06 發送簡訊給我 |
|
bernie_w39
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |