Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 6288|回復: 11
打印 上一主題 下一主題

89c51 控制 廣營 GWS NARO+D 無法控制 請教組語及伺服馬達高手

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-8-25 18:55:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用簡單的High Low控制 產生脈波 分別是 1ms 0度 1.5ms 60度 2ms 120度
目前問題是 當電源開啟後  只會動1ms 後面兩個都不動 也就是只動一次後面所產生的脈波 根本不理
測試很多方法 也改變1ms跑20次 才結束 換 1.5ms以此類推 還是無法 問題點出不來
但單一分別控制就很準確 單送 1ms 1.5ms 20ms 都會正確動作 但同個輸出波產生三種不同脈波寬度 就只動第一個
程式碼如下 :
    ORG    0000H
LOOP1:
    SETB    P1.0            ;設置P1.0為1 High
    CALL    DELAY            ;呼叫延遲0.5ms
    CALL    DELAY            ;呼叫延遲0.5ms  共 1ms
    CLR    P1.0            ;清除為0 Low
        MOV    R0,#38            ;設R0暫存器跑38次 38*0.5(Delay)=19


WAIT19R0:               
    CALL    DELAY            ;呼叫延遲0.5ms
    DJNZ    R0,WAIT19R0        ;R0不為零則跳到WAIT19R0 共跑38次19ms

LOOP2:
    SETB    P1.0            ;設置P1.0為1 High
    CALL    DELAY            ;呼叫延遲0.5ms
    CALL    DELAY            ;呼叫延遲0.5ms  
    CALL    DELAY            ;呼叫延遲0.5ms    共1.5 ms
    CLR    P1.0            ;清除為0 Low
        MOV    R0,#37            ;設R0暫存器跑37次 37*0.5(Delay)=18.5   


WAIT18_5R0:               
    CALL    DELAY            ;呼叫延遲0.5ms
    DJNZ    R0,WAIT18_5R0        ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms

LOOP3:
    SETB    P1.0            ;設置P1.0為1 High
    CALL    DELAY            ;呼叫延遲0.5ms
    CALL    DELAY            ;呼叫延遲0.5ms  
    CALL    DELAY            ;呼叫延遲0.5ms
    CALL    DELAY            ;呼叫延遲0.5ms    共2.0 ms
    CLR    P1.0            ;清除為0 Low
        MOV    R0,#36            ;設R0暫存器跑36次 36*0.5(Delay)=18


WAIT18R0:               
    CALL    DELAY            ;呼叫延遲0.5ms
    DJNZ    R0,WAIT18R0        ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms
   
   
    JMP    LOOP1            ;跳回迴圈

DELAY:                    ;Delay 0.5ms
    MOV    TMOD,#00010000B        
D1:
    MOV    TH1,#FEH
    MOV    TL1,#0CH
   
    SETB    TR1
    JNB    TF1,$
    CLR    TF1
    RET
    END
xu3u4rmp4 該用戶已被刪除
2#
發表於 2011-8-25 19:31:18 | 只看該作者
流程是不是
送出1ms再送1.5ms再送2ms再回到1ms的迴圈
這樣會不會跳太快.伺服機都還沒轉到1.5mS位置就到2mS了接著送出1mS
這樣因該抖動吧
但單一分別控制就很準確 單送 1ms 1.5ms 20ms 都會正確動作
因為是一直連續送出一種信號

上面是我的想法.有錯請告知
3#
 樓主| 發表於 2011-8-25 20:06:52 | 只看該作者
沒錯 就是這樣 我有試過 放慢如程式 還是一樣 只動一次
        ORG        0000H
LOOP:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  共 1ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#38                        ;設R0暫存器跑38次 38*0.5(Delay)=19
        MOV        R1,#50                        ;設R1暫存器跑50次
WAIT19R0:                               
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT19R0                ;R0不為零則跳到WAIT19R0 共跑38次19ms
        DJNZ        R1,LOOP                        ;重複(1ms high) (0 low) 週期 20ms 共50次 才換下個狀態
LOOP2:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  
        CALL        DELAY                        ;呼叫延遲0.5ms        共1.5 ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#37                        ;設R0暫存器跑37次 37*0.5(Delay)=18.5       
        MOV        R1,#50                        ;設R1暫存器跑50次
WAIT18_5R0:                               
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT18_5R0                ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms
        DJNZ        R1,LOOP2                ;重複(1.5ms high) (0 low) 週期 20ms 共50次 才換下個狀態
LOOP3:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms        共2.0 ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#36                        ;設R0暫存器跑36次 36*0.5(Delay)=18
        MOV        R1,#50                        ;設R1暫存器跑50次
WAIT18R0:                               
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT18R0                ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms
        DJNZ        R1,LOOP3                ;重複(2ms high) (0 low) 週期 20ms 共50次 才換下個狀態
       
        JMP        LOOP                        ;跳回迴圈

DELAY:                                        ;Delay 0.5ms
        MOV        TMOD,#00010000B               
D1:
        MOV        TH1,#FEH
        MOV        TL1,#0CH
       
        SETB        TR1
        JNB        TF1,$
        CLR        TF1
        RET
        END
4#
發表於 2011-8-25 22:42:50 | 只看該作者
迴圈起始值放錯地方

        ORG        0000H
MAIN:
        MOV        R1,#50                        ;設R1暫存器跑50次
LOOP:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  共 1ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#38                        ;設R0暫存器跑38次 38*0.5(Delay)=19

WAIT19R0:                              
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT19R0                ;R0不為零則跳到WAIT19R0 共跑38次19ms
        DJNZ        R1,LOOP                        ;重複(1ms high) (0 low) 週期 20ms 共50次 才換下個狀態


        MOV        R1,#50                        ;設R1暫存器跑50次
LOOP2:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  
        CALL        DELAY                        ;呼叫延遲0.5ms        共1.5 ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#37                        ;設R0暫存器跑37次 37*0.5(Delay)=18.5      

WAIT18_5R0:                              
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT18_5R0                ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms
        DJNZ        R1,LOOP2                ;重複(1.5ms high) (0 low) 週期 20ms 共50次 才換下個狀態

        MOV        R1,#50                        ;設R1暫存器跑50次
LOOP3:
        SETB        P1.0                        ;設置P1.0為1 High
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms  
        CALL        DELAY                        ;呼叫延遲0.5ms
        CALL        DELAY                        ;呼叫延遲0.5ms        共2.0 ms
        CLR        P1.0                        ;清除為0 Low
        MOV        R0,#36                        ;設R0暫存器跑36次 36*0.5(Delay)=18

WAIT18R0:                              
        CALL        DELAY                        ;呼叫延遲0.5ms
        DJNZ        R0,WAIT18R0                ;先減1 R0不為零則跳到WAIT18_5R0 共跑37次18.5ms
        DJNZ        R1,LOOP3                ;重複(2ms high) (0 low) 週期 20ms 共50次 才換下個狀態
      
        JMP         MAIN                       ;跳回迴圈

DELAY:                                        ;Delay 0.5ms
        MOV        TMOD,#00010000B               
D1:
        MOV        TH1,#0FEH
        MOV        TL1,#0CH
      
        SETB        TR1
        JNB        TF1,$
        CLR        TF1
        RET
        END
xu3u4rmp4 該用戶已被刪除
5#
發表於 2011-8-25 23:24:05 | 只看該作者
本帖最後由 xu3u4rmp4 於 2011-8-26 00:46 編輯

這樣修改有成功嗎?
你有用示波器看過信號嗎?
6#
發表於 2011-8-29 07:21:47 | 只看該作者
迴圈起始值放錯地方

        ORG        0000H
MAIN:
        MOV        R1,#50                    ...
jason0821 發表於 2011-8-25 22:42


同意jason0821大的做法,
只是R1用到50太多了,如果伺服機的反應為0.2秒轉60度,那用0.2秒除以20ms為10左右,
考量最後一個迴圈回到第一個迴圈大幅的擺動時間,把R1設為30左右ok
7#
 樓主| 發表於 2011-9-9 00:17:31 | 只看該作者
請問一下那如果速度要加快 有甚麼方法嗎?
不要提高電壓 改週期有用嗎?
8#
發表於 2011-9-13 17:20:09 | 只看該作者
請問一下那如果速度要加快 有甚麼方法嗎?
不要提高電壓 改週期有用嗎?
ginners 發表於 2011-9-9 00:17


不要提高電壓的前提下,改週期沒有必要,也無法加快動作速度,
因為從選擇伺服機後就被限制了最高的速度表現~~~
9#
 樓主| 發表於 2011-9-15 12:29:42 | 只看該作者
那可以降速嗎?
10#
發表於 2011-10-12 09:13:05 | 只看該作者
http://www.gws.com.tw/chinese/product/SERVO/servo%20form.h

RPV 遙控模型用伺服馬達的注意事項

工作電壓 : D. C. 4.8V - 7.5V  Max. (特殊規格 : 12.0-15.0V;24.0-28.V)

速度 : 從 0.05;0.05-0.15;0.15-0.30;0.30-0.60;至 0.60 秒/60 度以上

扭力 : 1.0;1.0-3.0;3.0-10.0;10-49;50-100;100-300;300-1000 公斤/公分等範圍

以上規格,均符合遙控模型的應用;我們亦可依客戶的規格需求而設計。

工作溫度 : -20°C ~ +60°C
脈寬範圍 (週期  : 16-23 ms)


最大 : 2.1 ms

最小 : 0.9 ms

超出以上之訊號範圍,將導致伺服機不正常工作.

擺臂位置 (旋轉角度)
以下規格表為轉動角度與輸入脈寬之相對關係:

脈寬 擺臂位置 (角度)
0.8 ms 安全界限 (順時針方向)
0.9 ms +60° ± 10° (順時針方向)
1.5 ms 0° (中立點)
2.1 ms -60° ± 10° (逆時針方向)
2.2 ms 安全界限 (逆時針方向)
11#
發表於 2011-10-12 09:26:05 | 只看該作者
Wish this may help?
12#
 樓主| 發表於 2011-11-11 17:03:25 | 只看該作者
回復 11# gws4ceo

恩恩! 已成功讓伺服馬達轉動了
感謝您的熱心指教 : )
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-4-28 06:07 , Processed in 0.136298 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表