ginners 發表於 2011-8-25 18:55:09

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

用簡單的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 發表於 2011-8-25 19:31:18

流程是不是
送出1ms再送1.5ms再送2ms再回到1ms的迴圈
這樣會不會跳太快.伺服機都還沒轉到1.5mS位置就到2mS了接著送出1mS
這樣因該抖動吧
但單一分別控制就很準確 單送 1ms 1.5ms 20ms 都會正確動作
因為是一直連續送出一種信號

上面是我的想法.有錯請告知

ginners 發表於 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

jason0821 發表於 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 發表於 2011-8-25 23:24:05

本帖最後由 xu3u4rmp4 於 2011-8-26 00:46 編輯

這樣修改有成功嗎?
你有用示波器看過信號嗎?

marbol 發表於 2011-8-29 07:21:47

迴圈起始值放錯地方

      ORG      0000H
MAIN:
      MOV      R1,#50                  ...
jason0821 發表於 2011-8-25 22:42 http://www.robofun.net/forum/images/common/back.gif

同意jason0821大的做法,
只是R1用到50太多了,如果伺服機的反應為0.2秒轉60度,那用0.2秒除以20ms為10左右,
考量最後一個迴圈回到第一個迴圈大幅的擺動時間,把R1設為30左右ok

ginners 發表於 2011-9-9 00:17:31

請問一下那如果速度要加快 有甚麼方法嗎?
不要提高電壓 改週期有用嗎?

marbol 發表於 2011-9-13 17:20:09

請問一下那如果速度要加快 有甚麼方法嗎?
不要提高電壓 改週期有用嗎?
ginners 發表於 2011-9-9 00:17 http://www.robofun.net/forum/images/common/back.gif

不要提高電壓的前提下,改週期沒有必要,也無法加快動作速度,
因為從選擇伺服機後就被限制了最高的速度表現~~~

ginners 發表於 2011-9-15 12:29:42

那可以降速嗎?

gws4ceo 發表於 2011-10-12 09:13:05

http://www.gws.com.tw/chinese/product/SERVO/servo%20form.h

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

工作電壓 : D. C. 4.8V - 7.5VMax. (特殊規格 : 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)
http://www.gws.com.tw/images/product/servo001.jpg

最大 : 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 安全界限 (逆時針方向)

gws4ceo 發表於 2011-10-12 09:26:05

Wish this may help?

ginners 發表於 2011-11-11 17:03:25

回復 11# gws4ceo

恩恩! 已成功讓伺服馬達轉動了
感謝您的熱心指教 : )
頁: [1]
查看完整版本: 89c51 控制 廣營 GWS NARO+D 無法控制 請教組語及伺服馬達高手