全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1659
推到 Plurk!
推到 Facebook!

debug都沒問題~可是馬達還是轉個不停

答題得分者是:foreman
auturmal
一般會員


發表:8
回覆:10
積分:3
註冊:2007-09-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-15 01:04:20 IP:211.74.xxx.xxx 訂閱
此程式碼作用為抓取encoder讀取到的值

然後經過計算~判斷馬達該輸出多少pulse來補正

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

程式碼裡的[[判斷是否讀取新值]]

是跟上一次抓取的值作相減,若相減後等於0就代表encoder沒動

沒動的話就繼續抓值

照理說應該會在抓值程式那邊形成loop

而不會跑到馬達輸出的程式才對

可是接上電後馬達卻一直轉

想請問一下為何會這個樣子??

希望有人可以幫我解答一下~~3q
附加檔案:47124c140c590_PID.txt

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-15 01:58:44 IP:211.76.xxx.xxx 未訂閱
1>  程式沒問題不代表結果就會是你想要的.

2> 請問Encoder初值為何?一定是零嗎? 第一次取值時要怎麼判斷馬達沒在動?

3> 建議你找模擬軟體, 單步執行, debug 看看. 應該就可以知道問題在那裡了.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
編輯記錄
 重新編輯於 2007-10-15 02:08:12, 註解 無‧
auturmal
一般會員


發表:8
回覆:10
積分:3
註冊:2007-09-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-15 02:59:54 IP:211.74.xxx.xxx 訂閱

===================引 用 文 章===================

2> 請問Encoder初值為何?一定是零嗎? 第一次取值時要怎麼判斷馬達沒在動?

3> 建議你找模擬軟體, 單步執行, debug 看看. 應該就可以知道問題在那裡了.
================================================

你好~~謝謝你的回覆

encoder初值為零,有使用led燈判斷過了

所以假設encoder都不動

第一次取值時dph和dpl都為零

R3也為0 , 所以在CJNE指令時就可以判斷ENCODER位置沒改變

我是用Keil uVision2寫的

這個軟體裡面就有debug的功能

單步執行的時候正常 , 會在[[判斷是否讀取新值]]作一封閉迴圈


真納悶阿..........
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-15 11:49:26 IP:61.218.xxx.xxx 訂閱
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
auturmal
一般會員


發表:8
回覆:10
積分:3
註冊:2007-09-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-15 13:47:48 IP:211.74.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-15 14:08:45 IP:61.218.xxx.xxx 訂閱
您這篇似乎是接續上一篇的單擺實驗而來的, 不曉得您之前的問題解決了沒?

如果是我查問題的話, 我會優先確定 encoder 出來的結果是正確的. 既然您有
用 LED 來顯示正反轉, 可以先把馬達驅動的電路斷開, 用手轉動單擺, 看看
encoder 的方向判斷是否正確. 因為這是 MCU 的輸入級, 如果輸入訊號都不對了,
查程式其實意義不大.

如果確定 encoder 訊號不對, 就再查機械部份 (應該是光遮斷器) 的輸出是否
正確 (e.g. channel A, channel B 的相位順序, 訊號準位...).
auturmal
一般會員


發表:8
回覆:10
積分:3
註冊:2007-09-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-15 14:14:40 IP:211.74.xxx.xxx 訂閱

===================引 用 bernie_w39 文 章===================
您這篇似乎是接續上一篇的單擺實驗而來的, 不曉得您之前的問題解決了沒?

如果是我查問題的話, 我會優先確定 encoder 出來的結果是正確的. 既然您有
用 LED 來顯示正反轉, 可以先把馬達驅動的電路斷開, 用手轉動單擺, 看看
encoder 的方向判斷是否正確. 因為這是 MCU 的輸入級, 如果輸入訊號都不對了,
查程式其實意義不大.

如果確定 encoder 訊號不對, 就再查機械部份 (應該是光遮斷器) 的輸出是否
正確 (e.g. channel A, channel B 的相位順序, 訊號準位...).
========================================================

你好:

encoder讀到的值是正確的 , 這個已經確認過了

讀值的部分跟馬達驅動的部分分開做的話都正確

可是一結合的話就出問題

~3Q
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-15 14:58:52 IP:125.229.xxx.xxx 未訂閱
大大:
encoder接於P0,請問您有否接提升電阻嗎?
auturmal
一般會員


發表:8
回覆:10
積分:3
註冊:2007-09-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-10-15 15:03:29 IP:203.67.xxx.xxx 訂閱
P0與HCTL-2020之間沒接電阻

問這個問題的原因是否為接上馬達後電流被馬達吃走導致讀取的數值錯誤??
編輯記錄
auturmal 重新編輯於 2007-10-15 15:06:43, 註解 無‧
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-10-15 15:17:55 IP:125.229.xxx.xxx 未訂閱
大大:
請參詳:
http://elearning.stut.edu.tw/mechelec/ch1.htm
===================引 用 auturmal 文 章===================
P0與HCTL-2020之間沒接電阻

問這個問題的原因是否為接上馬達後電流被馬達吃走導致讀取的數值錯誤??
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-10-15 16:07:19 IP:61.218.xxx.xxx 訂閱
我想問一下, 你是否有 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-10-16 02:00:00 IP:211.74.xxx.xxx 訂閱
問題已經解決了
接上foreman所說的提升電阻後就能停止
不過還有一個小細節需要注意:
使用djnz指令的時候,若是暫存器內的值為0,則暫存器值會被更改為255
只要在有DJNZ的指令之前判斷暫存器內的值是否為0即可避免動作錯誤
for bernie_w39:
不好意思讓你打這麼多
因為主要解決的方法是foreman所說的電阻問題
所以將答題得分者給foreman
請不要見怪~3Q
編輯記錄
auturmal 重新編輯於 2007-10-16 02:00:50, 註解 無‧
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-10-16 14:48:37 IP:61.218.xxx.xxx 訂閱
沒關係, 有問題大家互相討論, 只是你說了你確認過讀到 encoder 的資料是正確的,
我以為是從 8051 讀到正確的 encoder 值, 所以我就略過了界面問題而已.
系統時間:2024-05-13 1:00:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!