Robofun 機器人論壇

標題: roboot >>>>S-O-S [打印本頁]

作者: ffffff2641    時間: 2007-7-27 14:33
標題: roboot >>>>S-O-S
以下是小弟製作ㄉroboot!!


以下是roboot的vb控制端!!

所使用的晶片是89c52運用串列圖形控制經rs-232輸出訊號給52再由52的輸出端給予roboot動作!!
晶片的程式是運用ayu大大的ssc程式..可是測試的時候發現問題嚕!!?
1.再連接ㄉ時候pc端上正確的顯示了與連接阜連接了!!可是動作都一直送不出去@@不知是不是程式有寫錯了!!???
2.再連接上電源後,馬達會自行轉動半圈!!不隻是否屬於正常現象???
3.電源連接上51後,過幾分鐘會發燙!!而且我ㄉ電源是使用5V+(pc的power),不知是出了啥原因嚕!!!??
請問各位高手大大有過類似得經驗嗎!>>請問該如何解決呢????
作者: irobot    時間: 2007-7-27 20:01
你的機械人好像做得不錯啊!!發大一點的圖可以嗎?
單憑這些描述很難推測是那裡出問題的。依我小小的經驗,應該把問題反過來想。
那些部份你有測試過肯定沒有問題的?步驟如下:
1. 你的電腦資料輸出至 rs232 埠是否正確。我便試過 com1 是壞的,而要用 com2。可以用 hyperterminal 配合 loop back cable(把 rs232 的 2號和3號腳直接接上) 測試。可以參考這個文件 http://www.8052.com/users/jonled/RS232gd.pdf
2. 89c52 的電路是否正確。我也有使用89s52的經驗,但你的描述說會發盪,我覺得是不正常的。應再次確定電路的接駁是否有錯。
3.  再接駁電源後可以轉半圈。這也很難知道是怎樣一回事的。最徹底的辦法是在示波器上看看它輸出的波形是否正常。有示波器便最理想了,可以確定輸出無誤。如果沒有也可以用聲效卡配合免費的軟件做到相同的效果。我便試過波形正常但伺服機不動的情況,但因我肯定沒有錯最後便試出原來該款伺服機需要較大的訊號電流;要有上拉電阻才可以的。
聲效卡示波器 可以參考這個 http://hk.myblog.yahoo.com/My-DIY/article?mid=24&fid=10
希望你能快些找到原因,做到會動的機械人吧 !!

[ 本帖最後由 irobot 於 2007-7-27 20:39 編輯 ]
作者: ffffff2641    時間: 2007-7-27 21:00
小弟是在麵包板上測試低!!
不過我應該沒有把電源獨立出來...就是晶片的電源和伺服機的電源是共用的@@
現在就是引用了ssc程式...再加上rs232的控制宣告配合pc端給予控制..
請問上拉電阻是否.....>提升電阻,是否跟製作跑馬燈一樣在訊號線上串接電阻呢???
作者: irobot    時間: 2007-7-27 23:16
我也不知道 external pull up 是否叫上拉電阻,只是直譯罷了。就是把+5V 經電阻接駁至c51的輸出腳的意思。
一般伺服機是不需要的,但用在MG995上則需要。如果 ssc 程式是經過其他人驗証的,應該程式本身是沒有問題的。但你要確定使用的 MCU 是否一樣是 c51 系列,和使用晶體的頻率是否一樣。但就算程式有錯,MCU 本身也不會發盪的。所以我懷疑你的線路在接駁上是否有些少誤差呢?當然這是一種推測,因為不知你的線路和實際接駁的情況。
至於共用電源,我的經驗是用89c2051同時接駁6個 futaba s3003 伺服機是完全沒有問題的。
這是我最早期測試3個servo 的畫面:http://hk.myblog.yahoo.com/My-DIY/article?mid=14&fid=9
我想用獨立電源應可進一步排除其它影響因素,可以的話亦不妨一試。
=========================================================
剛看了你說的ssc電路,應該很簡單的。按理不應該駁錯。但可以的話不妨拍個實物參考一下。
至於它的程式好像也沒有很完整的提供(而不知是用12MHz還是11.0592MHz,不過這應該不是主要的因素),不如你發你的出來讓其它高手給你看一下吧。我對彙編語言則不是太懂的,應該幫不上忙了。

[ 本帖最後由 irobot 於 2007-7-28 00:24 編輯 ]
作者: uucww    時間: 2007-7-30 08:37

作者: ffffff2641    時間: 2007-7-30 10:45
請問iroboot大大!!!
我再您的板上有看到一篇也適用232作控制的介面!!
請問您適用什麼atmeag的哪一行晶片作控制的押!!~~??
還有您的程式是怎麼編寫的呢....??
作者: doubletime    時間: 2007-7-30 10:49
針對你的問題1,可做簡單的test
找台有2個com port的電腦來做debug平台
com1 使用vb,com2 使用 終端機,將com1  與com2   的tx 、 rx  互接tx接rx,rx接tx,即便知道你是否有傳出資料,如沒有即是ssc出問題,如正常,即51端有問題
如51端出問題,接51之tx 與電腦端rx 相接,rx端正電腦端tx 相接,開啟終端機,觀看你51送出的資料,即便知道51到底有沒有正常在動作了

external pull up 我比較喜歡叫提升電阻,原因是把輸出做成開集極的話,可以增加輸出能力,且51也不必受大電流而增加製程的負擔
因你接的是電腦的5v,有可能在power supply 供應電流不足的情況下導至51需呈受power supply 電源不穩定的負擔,可接示波器看5v 是否真為直流,或是處在1個漣波的情況下,另外就是irobot大大使用的是電池,只要電池有電的情況,當然驅動不會受影響,充電電池的輸出能力非常夠力
話說assembly我也不熟,so 我只能提出對你有問題有看法而已
作者: ffffff2641    時間: 2007-7-30 11:17
這是我51里的晶片程式...是用組合語言寫的
不知加入vb端得接收是否正確..
還有51的接收鮑率是否設定在1200這個值會比較好.....!!!
#ps:<這是與PC端連接控制SEVER MOTOR的程式>引用ssc程式
PWM0            EQU    40H                  
PWM1            EQU    41H                  
PWM2            EQU    42H                  
PWM3            EQU    43H                  
PWM4            EQU    44H                 
PWM5            EQU    45H                  
PWM6            EQU    46H                  
PWM7            EQU    47H                  
COUNT          EQU    37H
CUT            EQU    39H
PIN            EQU    51H
PWM            EQU    52H
PIN1           EQU    53H
                       ORG         00H
        JMP     START
                  ORG   23H
        JMP     INTERR
                  ORG         0BH
        JMP    T0_INT                          
                  ORG         30H
START:
        MOV     SP,#70H
        MOV     R1,#20H
        MOV     21H,#00H
        MOV     IE,#10010000B
        MOV     SCON,#01110000B
        MOV     TMOD,#00100000B
        MOV     TH1,#0f3H
        SETB          TR1
        SETB    EA
        SETB    ET0            
        SETB    ET1                           
        MOV     CUT,#0         
        MOV     COUNT,#0                     
        MOV     PWM0,#12     
        MOV     PWM1,#12
        MOV     PWM2,#12
        MOV     PWM3,#12
        MOV     PWM4,#12
        MOV     PWM5,#12
        MOV     PWM6,#12
        MOV     PWM7,#12
INTERR:
        PUSH    A
        JBC     T0,T0_INT
        JNB     RI,$
        CLR     RI
        MOV     A,SBUF
        MOV     21H,A
        XRL     A,#40H
        JZ      C0
        MOV     A,21H
        XRL     A,#41H
        JZ      C1
        MOV     A,21H
        XRL     A,#42H
        JZ      C2
        MOV     A,21H
        XRL     A,#43H
        JZ      C3
        MOV     A,21H
        XRL     A,#44H
        JZ      C4
        MOV     A,21H
        XRL     A,#45H
        JZ      C5
        MOV     A,21H
        XRL     A,#46H
        JZ      C6
        MOV     A,21H
        XRL     A,#47H
        JZ      C7
        MOV     A,21H
        JZ      STOP
        RETI   
MAIN:
     
              LCALL  OUT           
              LJMP MAIN

DEL_H:                                    

        MOV R7,#1  
L7:
        MOV R6,#2  
L6:
        MOV R5,#17        
        DJNZ R5,$  
        DJNZ R6,L6
        DJNZ R7,L7  
        RET

PWM_WIDTH:
                  MOV  COUNT,@R0
LOOP1:     
           SETB TR0
           JNB  TF0,$
           CLR  TR0
           DJNZ COUNT,LOOP1         
           CLR  TR0
           MOV  CUT,#0        
           INC  R0
           RET
OUT:
           MOV    R0,#40H        
C0:        
           SETB   P1.0
           MOV    R7,#10        
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.0
C1:     
           SETB   P1.1
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.1
C2:      
           SETB   P1.2
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.2
C3:        
           SETB   P1.3
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.3
C4:        
           SETB   P1.4
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.4
C5:      
           SETB   P1.5
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.5
C6:        
           SETB   P1.6
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.6
C7:        
           SETB   P1.7
           MOV    R7,#10         
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.7
           SETB   TR1
           RET
STOP:
           MOV    P1,#FFH
           MOV    20H,#5AH
           AJMP   T0_INT
T0_INT:
           PUSH  A
           PUSH  PSW
           CLR   TR0
           MOV   TH0,#>(25536-40)
           MOV   TL0,#<(25536-40)
           INC   CUT
           SETB  TR0
           POP   PSW
           POP   A
           RETI
           END
作者: irobot    時間: 2007-7-30 11:40
還有一點我忘記了說,電腦的 rs232 是不能直接接駁到 c51 的 pin10 , pin11 的。因原來的電腦圖並沒有包括 電壓轉換 的電路,我希望你有自行加入這個 level converter (電平轉換) 的部份吧。
(註:一般 mcu 的邏輯0用0V表示、 邏輯1用+5V表示 (TTL電壓)。但 rs232標準是用在較遠距離的數據傳送上,一般邏輯0為+15V、而邏輯1用 -15V。所以在接駁時是需要做電壓轉換的。rs232 to TTL converter,可用 max232 ic 或 用電阻和3極管取代)
可以參考這個:
max232 / dallas ds275 : http://www.kmitl.ac.th/~kswichit%20/MAX232/MAX232.htm
transistor method :       http://www.kmitl.ac.th/~kswichit%20/ap275/ap275.htm
rs232標準詳細資料 :      http://www.hw-server.com/rs232  

==============================================================
我試驗過的 mcu 有 2 個系列:
1.  51 系列有:89c2051、at89s52(與 c51 的性能是相同的)
2.  avr 系列有:atmega16、atmega48
由於我不太懂 assembly (彙編) ,所以都是用 C 寫的。其實都是用相同的邏輯去寫的。
主要是用1個計時器作 17.5ms 計時,剩餘的 2.5ms 則用 n 個 for-loop 去計時。 n 等於伺服機的數目。
首先要把伺服機的轉向角度(高電平時間)由小至大排序,然後找出每個之間的差值(這個數據是最重要的)。
每個 for-loop 的循環次數正好按之前計算的差值設定(當然要按剛才的順序)。視乎不同mcu的資源,這樣便可以同步控制很多的伺服機了。
可參考這個:http://hk.myblog.yahoo.com/My-DIY/article?mid=376&fid=9
(89c2051=13 servos 、 c52/s52 =20 servos 、 atmega48 = 21 servos 、 atmega16 = 24 servos)

[ 本帖最後由 irobot 於 2007-7-30 12:35 編輯 ]
作者: zirok    時間: 2007-7-30 11:50
原帖由 irobot 於 2007-7-27 23:16 發表
我也不知道 external pull up 是否叫上拉電阻,只是直譯罷了。就是把+5V 經電阻接駁至c51的輸出腳的意思。
一般伺服機是不需要的,但用在MG995上則需要。如果 ssc 程式是經過其他人驗証的,應該程式本身是沒有問題的。但你要確定使用的 MCU 是否一樣是 c51 系列,和使用晶體的頻率是否一樣。但就算程式有錯,MCU 本身也不會發盪的。所以我懷疑你的線路在接駁上是否有些少誤差呢?當然這是一種推測,因為不知你的線路和實際接駁的情況。
至於共用電源,我的經驗是用89c2051同時接駁6個 futaba s3003 伺服機是完全沒有問題的。
這是我最早期測試3個servo 的畫面:http://hk.myblog.yahoo.com/My-DIY/article?mid=14&fid=9
我想用獨立電源應可進一步排除其它影響因素,可以的話亦不妨一試。
=========================================================
剛看了你說的ssc電路,應該很簡單的。按理不應該駁錯。但可以的話不妨拍個實物參考一下。
至於它的程式好像也沒有很完整的提供(而不知是用12MHz還是11.0592MHz,不過這應該不是主要的因素),不如你發你的出來讓其它高手給你看一下吧。我對彙編語言則不是太懂的,應該幫不上忙了。


大大您好,我在您的圖中只有看到電池阻(電源),伺服機的電源好像是由電池提供的,
那mcu的電源是由??提供的呢? 感謝
作者: ffffff2641    時間: 2007-7-30 11:52
回覆..iroboot大大!!
我的51電路上有加裝一顆HIN232..
他跟MAX232的接腳一樣...
現在的問題是...51得接收鮑率是否一定要在1200..
之前有想過使用9600的接收率...
不過我的學長跟我說那樣太快了,51會接收不到資料....
作者: irobot    時間: 2007-7-30 12:09
回覆zirok
所有電源都是靠那4顆 AAA 電池的。它同時供應了給伺服機與mcu。但電路版內是有跳線位設定的,有需要時是可以分開供電的。因我剛開始時也和你們一樣在摸索階段,我也不肯定兩者是否可以共用電源。
===================================================================
啊!! 我誤會了。你是指那個連結內的相片嗎?你留意看第一幅相片,最上一條橙色電線把+ve 電源從第一塊麵包板送至第二塊麵包板,而最底的一條橙色電線把2塊麵包板的 gnd 地線接上。所以 mcu 與 伺服機是共用電源的。

[ 本帖最後由 irobot 於 2007-7-30 12:27 編輯 ]
作者: irobot    時間: 2007-7-30 12:19
回覆ffffff2641
一般來說用低的 baud rate 當然是更大機會成功的,因對mcu的反應時間要求是降低了。或許這樣說:用高baud rate 可以的,用低 baud rate 一定得。但相反用低 baud rate 可以的,用高baud rate 便不一定可以。說了好像沒說,嘻嘻。
前提是 電腦內的設定 要與 mcu 內的設定相同。由於還未看你 post 出來的 彙編,所以也不知你在電腦內設定 1200 的 baud rate 是否正確。
===============================================================
START:
        MOV     SP,#70H
        MOV     R1,#20H
        MOV     21H,#00H
        MOV     IE,#10010000B
        MOV     SCON,#01110000B
        MOV     TMOD,#00100000B
        MOV     TH1,#0f3H
剛看了開頭的部份,彙編實在把我看得頭昏腦脹。
按你的編碼,baud rate 設定是 serial mode 1, Timer mode 2, Timer1 8bit-UART auto-reload。
MOV     TH1,#0f3H  則是對應 crystal 12MHz, 2400 bps 的。 (設 PCON.7 = 0)。
不知你使用的 crystal 頻率是否正確,另外在電腦內 vb 程式的 baud rate 是否也正確定在 2400 bps。
如果你想用 1200 bps 則應寫為 MOV     TH1,#0e6H
其它設定可參考這計數器:http://www.keil.com/c51/baudrate.asp

[ 本帖最後由 irobot 於 2007-7-30 14:52 編輯 ]
作者: imas    時間: 2007-7-30 16:59
原帖由 ffffff2641 於 2007-7-30 11:52 發表
回覆..iroboot大大!!
我的51電路上有加裝一顆HIN232..
他跟MAX232的接腳一樣...
現在的問題是...51得接收鮑率是否一定要在1200..
之前有想過使用9600的接收率...
不過我的學長跟我說那樣太快了,51會接收不 ...


我平常都用9600,11.0592MHz的震盪器,
如果擔心慢的話,可以換22.1184MHz的震盪器,
不會有任何慢的情況,曾經用過115200傳送,
是出現指令有明顯延遲的情況,
不過9600應該是可以非常穩定!
作者: imas    時間: 2007-7-30 17:05
原帖由 irobot 於 2007-7-30 12:19 發表

而不知是用12MHz還是11.0592MHz,不過這應該不是主要的因素

MOV     TH1,#0f3H  則是對應 crystal 12MHz, 2400 bps 的。 (設 PCON.7 = 0)。


震盪器使用正確與否,是非常重要的因素!

用12MHz的震盪器算不出2400 bps 的鮑率,
跟8501的UART命令週期有關係,依照官方公佈的算式,用12MHz絕對算不出整數!
作者: irobot    時間: 2007-7-30 19:49
imas 大大的說法是正確的,用12MHz 是不可能得出整數。所以一般是用 11.0592 或 22.1184 MHz 的 crystal。
不過如果你已經買了 12MHz 的 crystal 也可以暫時用著,因為用 baud rate calculator 計算,用#f3H的偏差只是0.16%。一般來說偏差不可超過 (+/-) 1%。
所以如果你檢查後情況還沒有改善,則問題很可能出在你的 彙編程式上了。
======================================================
初步看你的程式,不知我有否看錯;好像是不能夠控制伺服機角度的。因為 沒有發現任何指令是用來改變 pwm0 至 pwm7 內的數值,即永遠是#12。程式有的部份是檢查從 rs232 讀入的字節是代表要改變那一個伺服機,但沒有跟進接收要改變的角度。
不過即使如此,程式好像還是能把各伺服機固定在中位的。所以如果接通電源而伺服機不動,則可能程式還有其它問題。(例如設置 timer)
作者: yyy    時間: 2007-7-30 23:23
樓主大大您好,
      這個程式不能用vb來連接控制,一定要修改晶片內的組語,才可控制,至於樓主大大的文章中提到at89s51接伺服機的問題,請教一下樓主大大,連接伺服機後,有用示波器看控制線的波形嗎?會跟原來的波形相同嗎?

因為測試過LEO大大使用的micro 2bbmg,發現這顆伺服機和富他爸的s3003會把波形拉下來而micro 2bbmg接at89s51就不能動作了。而富他爸的s3003雖波形拉下來,但是還可動作。

所以,想說LEO大大好像用的是華邦的51晶片,手中又有p89c51rd2hbp的晶片,於是用來測試,結果問題解決了,所以得到一個結論,好像at系列的晶片會有問題(不同的伺服機會挑機),用變種的51晶片就不會有這個問題,不曉得其它大大們有沒有測試過或遇到這個現象???



ps測試的伺服機是mg-995和富他爸的s3003、s3001和micro 2bbmg。

ps1 http://www.robofun.net/forum/viewthread.php?tid=519&extra=page%3D2 版主大大這篇文章和ayu大大的解說,如您能嘗試一下,16ssc馬上可作出來哦。vb程式一定要下載 Mr.Chuck Baird 公開的這個程式,http://www.badongo.com/file/2887054 (請跟ayu大大講一下,下載這個程式來用。)才可用在51和avr上哦。

[ 本帖最後由 yyy 於 2007-7-30 23:38 編輯 ]
作者: ffffff2641    時間: 2007-7-31 12:09
請問..各位高手大大~~
s03t這個伺服機在at8051上測試是大部分都不會動作.還是......
有沒有例外的押!!??(我之前是有用過FPGA寫過單顆馬達測試有動作出來!!)
有解決的辦法嗎????
還是只要改晶片內的組語舊行了..
作者: irobot    時間: 2007-7-31 13:43
ffffff2641
關於你的問題,我總結如下:
1. 硬件電路(用ssc貼內的)我傾向相信應該沒有問題。但你用的 crystal 數值為何?
2. 把 PC 與 mcu 連接的 rs232 通訊,應該可以假設通訊埠和電壓轉換部份均沒有問題,以及你有定好雙方的baud rate。
3. 在 PC內的軟體,想知道你是否用這個:http://www.seattlerobotics.org/encoder/200106/16csscnt.zip
    它的通訊格式是每次發3組數據 (開始碼, 伺服機編號, 轉向角度) ,開始碼定為255, 伺服機編號是1至16, 而轉向角度是0至254。
    所以與你提供的 mcu 彙編程式,在接收數據的格式上是有不同的。不知你有否把這 vb 程式做相應的修改呢?
4. 在 mcu 內的程式,如我前貼所說,好像在接收數據和更新轉向角的部份是有點問題的。
5. 關於伺服機的配合,只要在測試時加入提升電阻便可以了。亦即在供電給mcu的地方(+5v),搭一條線出來接約 1000 ohm電阻,
    再經電阻接至待測的訊號腳便可以了。
希望你最終能解決問題,發一個會動的機械人片段上來分享吧!!!

================================================================
另外我對你說的 FPGA 控制伺服機很感與趣,不知你是否有相關的資料,可以發表出來的。
例如:
1. 用什麼牌子的和型號的 FPGA 呢?Xillin, Altera, Lattice or Atmel
2. 有電路圖 或 用什麼測試版呢?
3. 用哪種編程語言 ? schematic design 、VHDL ? 有 source code 嗎?

[ 本帖最後由 irobot 於 2007-7-31 14:47 編輯 ]
作者: ffffff2641    時間: 2007-7-31 16:48
我在去試試看好嚕~~
有問題隨時再向各位大大請教!!!
我是用...atml 的...晶片上有一個max的圖示!
電路圖押~~幾乎不用!!因為我寫完硬體描述直接轉譯成執行碼燒到晶片內了!!再把伺服機接..供應電源接上就可以執行了~~
我使用的語言VHDL!硬體描述語言!!不過...描述上就滿複雜的...要寫好幾個電路描述進去吧!!
作者: irobot    時間: 2007-7-31 20:29
原帖由 ffffff2641 於 2007-7-31 16:48 發表
我是用...atml 的...晶片上有一個max的圖示!
電路圖押~~幾乎不用!!因為我寫完硬體描述直接轉譯成執行碼燒到晶片內了!!再把伺服機接..供應電源接上就可以執 ...


我猜想你用的是不是 altera 廠出品的 CPLD 中的 MAX 系列晶片呢?
另外我想問單憑這晶片是如何做到 20ms 計時的?是用自建的計數器嗎?
作者: ffffff2641    時間: 2007-7-31 20:52
回irobot大大~!!
是的..他主要是配合MAX PLUSII這套編輯軟體..來做電路描述與腳位規劃!!
我記得我們老師說他內部有內建計時器..這ㄍ晶片驅動時脈只用了4MHz喔!!!
另外他得計時模式是靠程式編輯者的設定而不同的..
作者: irobot    時間: 2007-7-31 21:20
啊!! 原來是這樣。我剛好想自學這些東西,所以就問你一下。我手上正好也有 altera 的 CPLD。不過只是入門級的 MAX罷了,也不知是否有足夠能力控制伺服機。我還想問一問你是用標準的 VHDL 編寫的還是用 altera 專用的 ADHL 寫的,當中要學懂編寫哪些功能的技巧才可以做到控制一顆伺服機呢?
作者: ffffff2641    時間: 2007-8-1 10:43
回irobot大大~!!
我適用標準的VHDL寫的...要控制一顆伺服機要注意他的轉動角度時脈
例如:0.7ms----->0度角
       1.3ms----->...
       1.8ms....
       2.3ms....
只要設定好以上的時脈..還有要設定的輸出腳位就可以讓伺服機動做了!!
另外...那個晶片功能很強...因為他可能是屬於多核心吧!!
任何一支腳都可以當輸出/輸入...只要程式設定哪一隻腳輸出就行了!!
作者: wallace_tsou    時間: 2007-8-1 10:52
標題: FPGA,CPLD不是多核MCU !
FPGA、CPLD是屬於可程式化邏輯閘,不是多核心MCU。不過可以做到多工這樣說也不太正確,因為它本來就是平行處理的電路。
作者: ffffff2641    時間: 2007-8-1 12:43
想起來的....!!!我們老師也是這說的!!~~~
作者: ffffff2641    時間: 2007-8-1 13:59
請教一下irobot大大~~
在您的blog上看到您有製作一塊89c2051的控制板!!
請問您是在哪一個網站上找到的押!!??
還有他也是使用組語的嗎??還是有不同的語言???
作者: irobot    時間: 2007-8-1 16:30
回覆ffffff2641大大:
它是我自己設計的第一塊伺服機控制版。軟體是自行用C語言寫的。用彙編寫對我來說想著也覺頭痛,看一點點則還可以的。
當然在編寫前是爬了很多格子(台灣的、外國的、內地的和日本的都有)。所以一般用程式控制伺服機的方法我也懂得一點。
唯獨用 硬件 FPGA/CPLD  的方法 和 多核心 FPPA 的則還不會。所以也想學一學啊。
作者: ffffff2641    時間: 2007-8-1 18:22
回覆irobot大大!!
是用c寫的押....可惜我沒學過keil C只懂得組合語言和VHDL
那如果使用8051和您寫的那套VB控制端做連結的話..也可以得到相同的效果嗎??
在下聽說用C寫好像要注意一些細節..不然會當機???
作者: irobot    時間: 2007-8-1 21:40
回覆ffffff2641 大大:
用我的 VB控制界面 與其它 mcu (包括 8051系 、 atmega 或 其它) 理論上當然是可以了。最重要是兩者均使用 rs232 便行了。
但當然有可能要稍作修改,因為控制伺服機時資料傳送時的格式和長度均有可能是不同的。舉例,用 89c2051 在控制角度時在180度內只能細分200步左右,由於少於255,所以用單字節便可代表角度了。但用 atmega16 則能夠做到在180度內細分900步左右,由於大於255,所以要用雙字節代表角度。所以在控制伺服機時傳送資料的長度便不一樣了,這時你便要修改你的VB 界面了。
作者: doubletime    時間: 2007-8-1 21:42
用C 應該不是會當機,而是小地方不注意會產生BUG
但ASSEMBLY也會有這個問題存在,也就是只要是程式沒有寫好就是會有BUG
VHDL本身只是1個硬體描述語言,且也和C滿像的
作者: yyy    時間: 2007-8-9 23:37
原帖由 irobot 於 2007-7-27 20:01 發表
最徹底的辦法是在示波器上看看它輸出的波形是否正常。有示波器便最理想了,可以確定輸出無誤。我便試過波形正常但伺服機不動的情況,但因我肯定沒有錯最後便試出原來該款伺服機需要較大的訊號電流;要有上拉電阻才可以的。
irobot大大您好,請教一下,
請問1、您的伺服機是何廠牌呢??  2、波形正常,是還沒接伺服機時,所看到的現象嗎??  3、mcu是什麼型號呢??4、接在那一支腳呢??(如果是51的話,應該不是p0腳吧?? )
5、是否接上伺服機後,發現波形拉下來使得伺服機不動作,這時才接上 上拉電阻,謝謝您喔。



原帖由 irobot 於 2007-7-27 23:16 發表
上拉電阻,一般伺服機是不需要的,但用在MG995上則需要。至於共用電源,我的經驗是用89c2051同時接駁6futaba s3003 伺服機是完全沒有問題的。我想用獨立電源應可進一步排除其它影響因素,可以的話亦不妨一試。

大大請問這段話的意思是說, 1、用89c2051接MG995的時候需用到上拉電阻嗎??  2、您的試驗是用單一電源接51加上futaba3003伺服機來測試的吧?? 請教一下,這時的示波器接上伺服機測量的波形還是5v的波形嗎(沒接上上拉電阻喔)??感謝您喔。

對了,再請教一下,您的機器人是用futaba3003伺服機來做的吧,會動嗎??好像它的塑膠齒輪會崩壞,不曉得您有沒有遇到這個情況呢??


原帖由 irobot 於 2007-7-30 12:09 發表
回覆zirok :
所有電源都是靠那4顆 AAA 電池的。它同時供應了給伺服機與mcu。但電路版內是有跳線位設定的,有需要時是可以分開供電的。因我剛開始時也和你們一樣在摸索階段,我也不肯定兩者是否可以共用電源。 ...

請問,這樣電源是4.8v,動作很久嗎??可動多久??    這時的伺服機與mcu分別   是futaba3003伺服機還是mg995呢、是用51還是avr??

有沒有用mg995接上mcu的實際實驗情況呢??感謝大大的熱心幫忙,謝謝嘍。
作者: irobot    時間: 2007-8-10 02:22
1. futaba3003, TowerPro MG995
2. 對,接了伺服機後,用 3003 波形仍然正常,用995 則不正常
3. mcu 用 89c2051
4. 所有腳也有試啊, p1.0 和 p1.1 因為沒有 internal pull-up,所以加了 external pull-up,MG995 也只有在這2支腳才可正常運作。
5. 你的猜測是對的,看到這情況我才懷疑是輸出電流不夠。

1.  對
2. 是正常的方波,與未接伺服機前是大致一樣的。
3. 只有2足沒有手,會動的。未有齒輪崩壞的情況,相信與使用情況有關。用作戰鬥機械人則肯定會發生了。

1. 動作大約20分鐘吧。是用 89c2051 和 futaba3003 的。
2. 只測試過 mg995 對訊號的反應沒有 futaba3003 的好。futaba3003 每次可以轉動較少的度數。
作者: yyy    時間: 2007-8-10 08:07
原帖由 irobot 於 2007-8-10 02:22 發表
2. 對,接了伺服機後,用 3003 波形仍然正常,用995 則不正常

4. 所有腳也有試啊, p1.0 和 p1.1 因為沒有 internal pull-up,所以加了 external pull-up,MG995 也只有在這2支腳才可正常運作

3. 只有2足沒有手,會動的。未有齒輪崩壞的情況,相信與使用情況有關。用作戰鬥機械人則肯定會發生了。

2. futaba3003 每次可以轉動較少的度數。


感謝大大的詳細解答喔,
                                                        再打擾一些問題,

2、小弟用s51,(單一電源和獨立電源都用,用的是電源供應器,ac變dc的裝置。)接上3003的情況是波形會拉下來,也就是不會達到5v的電壓位準。而995則波形正常,剛好和您的狀況相反。可是兩個伺服機的動作都正常。好奇怪喔????
(3003是Taiwan,995是China, 您的3003是Japan的嗎?? )

4、因s51的p1、2、3腳都有internal pull-up,只有p0沒internal pull-up,2051應該也是一樣的吧??
      因為沒看data sheet 故做此猜想。  

        p1.2---p1.7,995加上  external pull-up沒動作嗎???

       995好像要加上 6v 它的動作才能得到最佳反應,3003好像要 5v 吧??大大的電源是四個充電電池??
       一個 1.2v 四個 4.8v 是否也有關係呢???

3、大大未來是要用塑膠還是金屬齒輪來實驗呢??目前小弟可能朝向用金屬齒輪來實驗吧

2、意思是說,995可轉到比較大的角度而3003只能轉較小的角度吧???

感謝大大的熱心解答喔。
作者: zirok    時間: 2007-8-10 10:10
標題: 回復 #33 irobot 的帖子
所以port 1 也需要接上上拉電阻才能夠推動伺服馬達囉??
還是說是PORT 0.1.2.3 都要加上上拉電阻才推的動,請問一般是用幾歐姆的排阻呢?

感謝大大
作者: irobot    時間: 2007-8-10 12:23
回 yyy :
futaba3003 我也不知是那裡做的。但 MG995 則是內地的。
接了 external pull-up ,MG955 在那一支腳也可正常運作。
而 89c2051 根據 datasheet ,p1.0 和 p1.1 均沒有 internal pull-up 的,因它可作為 analog comparator 用。所以或許與 89s51 不同。
若加了手後,根據網友的經驗, futaba 3003 的腳便不足以支撐身體的重量和動作了。所以我才一直有試 MG995。正如你所說它不但大力,而是用金屬齒輪的。
最後 futaba3003 與 MG995 均可以轉 180 度的,不過 futaba 較好,不容易 overshoot,並且它的機械反應是較好的。舉例:若訊號上的 high time 增加 3.33 us ,它的轉向角度便會增加若 0.3 度。少於 3.33 us ,則可能角度仍然定在原位。但對 MG995 而然,則訊號上的 high time 增加至 5 us,它才會轉動至新的角度的 (增加若  0.45度 ),少於 5 us 便有機會不動而保持在原位。當然這只是我自己的測試結果,不保證百分百正確的。

想問你一下,你用的 變壓器是 digital 的嗎?

[ 本帖最後由 irobot 於 2007-8-10 12:42 編輯 ]
作者: irobot    時間: 2007-8-10 12:40
回復 Zirok
一般 mcu 的輸出腳均有 internal pull-up 的。所以不需要再外加 external pull-up的。
我用的 89c2051 則是比較特別,其中只有 2 支腳是沒有的,因有特別的用途。

而 mcu 的輸出腳一般是可以直接推動 伺服機的訊號腳 (注意,不是提供電源的意思),例如 futaba 3003 或 你要使用的 E-sky (8g) 伺服機。但我發覺 用在 MG995 身上則一定要外加 external pull-up 才可以。
作者: zirok    時間: 2007-8-10 16:15
標題: 回復 #37 irobot 的帖子
喔喔...原來如此,有這些差別,又讓我學到了一課,感謝您9527...喔不不 irobor大大
那就只能看看我自己的問題是出在哪裡了...
作者: yyy    時間: 2007-8-11 08:11
原帖由 irobot 於 2007-8-10 12:23 發表
回 yyy :
想問你一下,你用的 變壓器是 digital 的嗎?

irobot大大您好喔,
      好感謝您的熱心解惑和實驗分享 ,變壓器有digital的嗎 ???我想您的意思應該是 power supply 吧??小弟的power是analog,digital也有,不過這兩者有差別嗎??有什麼特別的用途要注意嗎??謝謝您了喔。

PS

請問香港那邊有這顆 SERVO E-9001 的伺服機嗎??使用在機器人上面的效果如何??
或是有人做出兩足,推薦的伺服機??
台灣這邊的LEO大大用的是廣營 Micro 2BB MG伺服機,效果很好,小弟測試的結果有一些狀況(S51的板子),
現在,在伺服機的選用上傷透了腦筋


那顆e-sky小弟猜想,應該接上提升電阻就可解決問題了吧??不過還是用示波器來看波形,比較知道實際的狀況。


[ 本帖最後由 yyy 於 2007-8-11 08:46 編輯 ]
作者: zirok    時間: 2007-8-11 09:15
標題: 回復 #39 yyy 的帖子
那應該要接多少歐姆的提升電阻呢?  看來問題還是在這@Q@
示波器的話我有測過....,不過看不是很清楚=.=" 跳很快而且波形我沒有改成固定的...(示波器要去學校用=.=)

也有用波形產生器=>伺服機,不過還是不動,SO...能請教大大應該用多少歐母的提升電阻呢?
作者: irobot    時間: 2007-8-11 11:14
回 yyy 大大:
只是隨便問一下吧了,我只是想找出你我在試驗上的任何細微差異。有時這可能是得到不同結果的原因。
我一直也是用 digital 的 power supply,因為 analog 的電壓有時會不準確可能令 mcu 不穩定的。
伺服機我也不是很孰識,不過未見過有人用 SERVO E-9001 做2足。通常他們也是用 MG995及其相關係列。
LEO大大用的廣營 Micro 2BB MG伺服機我也有參考過,真是又細又好力。
配合你的 S51 板不知有何問題呢?你的 板是什麼規格呢?


[ 本帖最後由 irobot 於 2007-8-11 11:24 編輯 ]
作者: irobot    時間: 2007-8-11 11:31
回 Zirok 大大:
我建議你先確定輸出的訊號是否正常,這樣才可以確定問題是否在 servo 的提昇電阻上。
我也有  E-sky (8g) 伺服機,用在我的 控制板上是不用提昇電阻的。不過加了 1000 Ohm 的 提昇電阻 也一樣可以正常運作的。所以你加入 提昇電阻 也無妨。至於數值 (R) 只要可以限制電流不超過 mcu  的吸入電流便應該沒問題。
(5V / R) < 吸入電流 <--可從mcu 的 datasheet找到。
作者: yyy    時間: 2007-8-11 17:46
原帖由 irobot 於 2007-8-11 11:14 發表
只是隨便問一下吧了,我只是想找出你我在試驗上的任何細微差異。有時這可能是得到不同結果的原因。
我一直也是用 digital 的 power supply,因為 analog 的電壓有時會不準確可能令 mcu 不穩定的。
伺服機我也不是很孰識,不過未見過有人用 SERVO E-9001 做2足。通常他們也是用 MG995及其相關係列
LEO大大用的廣營 Micro 2BB MG伺服機我也有參考過,真是又細又好力。
配合你的 S51 板不知有何問題呢?你的 板是什麼規格呢?

irobot 大大您好喔,
       小弟也是想在試驗上得到一些經驗,謝謝您的分享,沒用過digital的powr,趕快來用看看,請問您的型號和廠牌、規格???

用 MG995及其相關係列,請問這個相關係列是指那一種型號、規格呢??台灣不曉得買不買得到。

廣營 Micro 2BB MG伺服機,請問您是用2051或avr來作控制的???

S51 板是用 at89s51 24pc 0226 (philip的p89c51rd2bn也可用。),可用到24MHz。
用在廣營 Micro 2BB MG伺服機上的話,是我的伺服機中最不穩定的,所以還在想辦法克服中。您是用2051來作控制的嗎??

好像沒看到您用avr來測試這些伺服機的狀況,我用avr(at90s8515)來做控制的話,效果最好。


作者: irobot    時間: 2007-8-11 19:00
我想你是誤會了,digital 的意思是用 Universal regulated switching power supply 是很輕的,不是傳統的 變壓器(transformer) 俗稱火牛。
廣營 Micro 2BB MG伺服機。我沒有這個啊。
用在廣營 Micro 2BB MG伺服機上的話,是我的伺服機中最不穩定的

意思是你的 mcu 輸出正確的訊號,但伺服機操作不正常嗎?按理加入提昇電阻應該可以解決的。
您是用2051來作控制的嗎??好像沒看到您用avr來測試這些伺服機的狀況

對啊! 我用 89c2051 的,當然用 c51/52 也可以的,也試過用在 s52 上。
另外也用 atmega16/32 和 atmega48 。   用相同方法控制,得出來的效果是一樣的。
很奇怪為什麼你用不同 mcu 會有不同結果?
因為 51系 和 avr系 從 datasheet 看,只是 pin  的輸出電流有別,輸出電壓也是相約的。
在控制 servo 上按理不會有太大差別的,你的情況很奇怪啊!

[ 本帖最後由 irobot 於 2007-8-11 19:02 編輯 ]
作者: zirok    時間: 2007-8-11 22:48
回irobot大大:
我找不到輸入電流可以多大@Q@,只有看到邏輯0的輸入電流(直流).邏輯0~1漏電流...等
,雖然知道不用家提升電阻了...,不過還是想問一下@Q@

如果是程式上的問題的話我自己是不知道是哪裡錯了@Q@,可以請大大們幫我看一下嗎? 感激不盡

其實就是marbol大大的那篇ssc上的程式,我改了一些些...
嗯...如果可以的話可以讓我參考參考您的程式嗎=.=....我不會直接套用的,只是看看能執行的程式跟我修改後的程式的動作差在哪裡...(或是告訴我該在哪邊作修正@q@)

[ 本帖最後由 zirok 於 2007-8-11 22:51 編輯 ]

ssc2.asm

5.86 KB, 下載次數: 561

ssc程式


作者: irobot    時間: 2007-8-12 01:48
讓我看一看你的先吧。我的做法是完全不同的,而且是用 C 寫的,兩者很難作比較。
作者: zirok    時間: 2007-8-12 10:07
標題: 回復 irobot 大大
喔喔 對吼,差點忘記=.=....,因為請大大看的話大大是比較累拉...SO...,
麻煩您了!!
作者: irobot    時間: 2007-8-12 14:08
回 Zirok 大大:
首先說一下,我不精通彙編,也從來不用的。由於上述原因,我只是從你程式碼背後的目的去思考 (你有很好的註解) 和翻翻 8051 的指令集吧了。所以只是說說我的看法,大家研究研究。希望不會弄錯吧。
先解構你的程式
1. Main --- 計定 loop 的次數, table 開始的位置
    1.1  loop --- 每次載入 8 個 table 內的資料至 pwm0 至 pwm7,然後呼叫 out
                2.1  用 out 順序輸出 servo 訊號: pwm0 至 P1.0,  pwm1 至 P1.1, ,,,,,餘此類推
      ..               3.1 out 的詳細步驟,已 pwm0 為例:
      ..                      3.1.1 把 2.5 ms 的時間分為3份 ,先設 P1.0 為 high
      ..                      3.1.2 del_H: 固定延時 約 1ms
      ..                      3.1.3 pwm_width: 根據 pwm0 的值延時 (pwm0) x 40 us
      ..                      3.1.4 把 P1.0 設為 low
      ..                      3.1.5 del_L : 延時數應把 2.5ms - 1ms - pwm_width = (1.5ms - pwm_width)
      ..                      3.1.6 完成一整個 2.5 ms 週期
      ..        2.2  完成最後輸出 pwm7 至 P1.7 則完成 out 的部份
    1.2    完成 1次 loop 用的時間剛好是 (2.5 ms x 8) = 20ms,指向 table 的位置剛好移後了 8 格
    1.3    loop 的次數達 5次 (讀完所有 table 內的資料) 由第 1 步重新開始。

不知是不是這樣呢?


[ 本帖最後由 irobot 於 2007-8-12 14:17 編輯 ]
作者: irobot    時間: 2007-8-12 14:23
我的意見1:
del_L 的部份你好像是在做 (2.5ms - pulse_width),我認為是 (1.5 ms - pulse_width)。可以改為
DEL_L:              ;延時R7*0.1毫秒,晶振在11.0592MHZ
MOV A,#27H ;27H X 40us 約 = 1.56 ms 注意:1.5 ms 正確應用約 26H,但由於你的計數方法所以要用 27H
CPL PWM
ADD A,PWM
MOV COUNT,A
LOOP2: SETB TR0 ;開啟T0計數器
JNB TF0,$
CLR TR0 ;關閉T0計數器
DJNZ COUNT,LOOP2 ;將PWM LOW的值乘以40us         
CLR TR0 ;這行有點多餘=.=
MOV CUT,#0 ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除         
RET
作者: irobot    時間: 2007-8-12 14:28
我的意見2:
你的中斷計時方法用起上來有點怪:
T0_INT:    ;只用到一個計時中斷
PUSH A
PUSH PSW
CLR TR0
MOV TH0,#>(65536-40) ;設定TIMER0在每40us中斷一次,if use12Mhz crystal
MOV TL0,#<(65536-40)
;INC  CUT  ;CUT還搞不懂
SETB TR0
CLR TR0
POP PSW
POP A
RETI

紅色部份我覺得是不需要的,搞不好會不會是一個 dead loop。
作者: irobot    時間: 2007-8-12 14:33
我的意見3:
C1:
SETB P1.1 ;R0=41H
MOV R7, #13 ;每一格"H"的時間,視需要微調
ACALL DEL_H ;1ms
ACALL PWM_WIDTH
CLR P1.1

這個 del_H 用 13 會較接近 1ms (@ 12MHz)
因我計算你原設計的計械週期(machine cycle) 是 74 x 10 = 740 mc = 740 us (@ 12 MHz)
作者: irobot    時間: 2007-8-12 14:46
最後這個不知是否錯誤,只是對用 timer 作中斷計時是 很怪的用法。
PWM_WIDTH:
          MOV COUNT,@R0
LOOP1:
       SETB TR0 ; 開啟T0計數器
        JNB TF0,$
       CLR TR0 ;關閉T0計數器
       DJNZ COUNT,LOOP1 ;將PWM的值乘以40us         
       CLR TR0 ;這行有點多餘=.=
       MOV CUT,#0 ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除         
        MOV PWM,@R0 ;將R0的值交給DEL_L去取LOW的時間
        INC R0 ;找下一個PWM的位置
RET

用 timer 作中斷計時本意是要讓 cpu 有空去處理其它事務。計時的任務便交  timer 去負責,時間到了才通知 cpu 接手處理的。
JNB TFO.$ 是檢查 timer 有否 overflow
這裡 cpu 並沒有空著,而是不斷檢查 timer 有否 overflow。其實是重複了 timer 的任務。
在真正 overflow 時,很有可能是先 做了 T0_INT 的部份,然後才執行 JNB TFO.$ 這一句 。如果在 T0_INT 返回時把 overflow 的 flag 給 clear 了,搞不好也有機會造成 dead loop 的。
其實這樣倒不如交由 cpu 自己做計時吧。

[ 本帖最後由 irobot 於 2007-8-12 14:49 編輯 ]
作者: zirok    時間: 2007-8-12 19:23
標題: 回復 irobot 大大
首先我想說...,大大您太厲害囉  短短的時間就看完了...,還解釋那麼詳細..
,我的程式是由ayu大大發表的那篇ssc BY marbol 大大那邊弄低,所以程式的詳解大致上也是照抄@Q@

沒錯,您分析的十分精闢,讓在下自嘆不如@Q@,您提到我的計時中斷寫法怪怪的,
沒錯~ ,雖然我有51的書,可是我還是有點不懂他的寫法,感覺有點跟我想像的不太一樣,
也有上網去找看看資料,不過幾乎都講的差不多=.=...

您的建議我還沒全部看完=.=...看完思考完後改改程式再來請教您  ,實在非常感激您!!
作者: zirok    時間: 2007-8-12 20:10
標題: 回復 irobot 大大
關於您的意見1:
因為我之前以為伺服馬達可接受的訊號範圍為0.5ms~2.5ms,延遲的部分我R7原本是送1,後來我聽別的大大說是1.0ms~2.0ms,所以就改了一下,沒想到忘了改那邊 ,真是粗心阿,那如果我用26H的話我後面應該怎麼寫呢? 因為我找不到2的補數的指令,還是我沒注意到...

關於您的意見2:
因為我還不是很懂組合語言...,計時中斷怎麼執行的也不清楚,所以書上有啥就照寫...ㄎㄎ,覺得怪又不知道怪在哪裡,還好有您的指點,令我豁然開朗
(後來用u vision debug時,發現它好像是執行到setb tr0 它就會先跑到最前面的org=> JMP 到 T0_INT,執行完了它才再跳回來)

關於您的意見3:
呵呵...,我都不知道怎麼算-.-",我可以請教您怎麼算嗎?  感謝^^

關於您最後的意見:
其實我一開始也看不懂那一行是作什麼的=.=",也不知道CPU在執行中斷的時候也會檢查那些旗標,現在我懂了,難怪我用u vision debug時它一直卡在那邊...,但我因為不清楚那一行的用意,也不敢亂刪,實在非常感謝您
作者: irobot    時間: 2007-8-12 20:15
Zirok大大:
開于于第52帖提到的可能錯誤,終於有時間翻查了 manual 。確定會導致錯誤了。
http://www.atmel.com/dyn/resources/prod_documents/DOC4316.PDF  (用搜尋找 timer 0 的段落)
你看這個:
2.11.5 Interrupt
Each timer handles one interrupt source; that is the timer overflow flag TF0 or TF1. This
flag is set every time an overflow occurs. Flags are cleared when vectoring to the timer
interrupt routine
.
它說當 timer0 溢位(overflow) 時,TF0=1。 程序流程 導向 中斷程序(timer interrupt routine)時,會清空 TF0 的旗標,即 TF0=0。
按這順序
PWM_WIDTH:
          MOV COUNT,@R0
LOOP1:
       SETB TR0 ; 開啟T0計數器
        JNB TF0,$
       CLR TR0 ;關閉T0計數器
當開始計時後發生溢位,程序流程 會先指向 中斷程序, 並清空 TF0 的旗標,即 TF0=0。當返回下句時 JNB TF0,$
,它可能永遠也測不到溢位的,做成無限循環。程式其它部份若是用以上的寫法皆有問題,你要更改啊!!

解決辦法也很簡單,你用 timer 也不過是想做 40us 的延時。乾脆用 NOP (no operation) 這個指令吧。執行它 cpu 什麼也不會做,但會消耗 1 個 機械週期 (machine cycle) 的時間。 在頻率 12MHz 時剛好是 1us 。就用 40 個 NOP 便可以了,比你原先的計時方法更準確。
PWM_WIDTH:
          MOV COUNT,@R0
LOOP1:
       NOP       ;每個 nop 延時 1us
       NOP
       NOP
       ....共 四十 個

       NOP
       NOP
       DJNZ COUNT,LOOP1 ;將PWM的值乘以40us         
       MOV CUT,#0 ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除         
        MOV PWM,@R0 ;將R0的值交給DEL_L去取LOW的時間
        INC R0 ;找下一個PWM的位置
RET

[ 本帖最後由 irobot 於 2007-8-12 20:43 編輯 ]
作者: irobot    時間: 2007-8-12 20:26
CPL PWM
ADD A,PWM
這2句的功能就是做 ( A - PWM -1 ) 啊。

所以 你先做 MOV A,#27H 。就等於計這算術  ==> (27H - PWM -1) = 26H - PWM
意思正好是 (1.5ms - pulse_width ) 了。
你明白麼?
如果還不明白可以在網上找找關於 2進制補碼 (2's complement) 的資料和使用方法。可以學多一樣東西。

PS :其實伺服機訊號是 0.5 至 2.5 ms 較多的。而且你做到 0.3 至 2.7 ms 會更好,差不多所有 servo 你也能控制了。
因已包括 (1 至 2 ms) 在內,你說對嗎?

[ 本帖最後由 irobot 於 2007-8-12 20:47 編輯 ]
作者: zirok    時間: 2007-8-13 14:01
標題: 回復 irobot 大大
程式的確是還有地方沒改完整=.=...昨天簡易isp的線壞了...程式燒不進去~

我把大大您建議的地方改成這樣:
==============================================
LOOP2:       
        ;SETB        TR0        ;開啟T0計數器
        ;CLR        TR0        ;關閉T0計數器
                       
LOOP3:        MOV        R4,#28H        ;40次
        NOP                ;每個 nop 延時 1us
        DJNZ        R4,LOOP3        ;R4=0時跳下一行
        DJNZ        COUNT,LOOP2        ;將PWM LOW的值乘以40us         
        CLR        TR0        ;這行有點多餘=.=
        MOV        CUT,#0        ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除                
       
        RET
==============================================
應該沒錯吧,不過我每次都會疏忽掉....,關於二的補數,我有學過...,不過不是很清楚(之前升學考試被它弄得很慘=.=...),不過大大您的意思我看懂了~,用26h最後再用加1應該也ok吧,只是怕進位的問題,我伺服馬達用不多,更甭談讓它動=.=....,我現在只祈禱它能動一動就很開心拉~
再去試試=.=
作者: irobot    時間: 2007-8-13 14:43
呵呵,不錯的改動 !! 大致上也可以了。
但要留意
       MOV         R4,#28H               ;40次                 
LOOP3:        
        NOP                                     ;每個 nop 延時 1us
        DJNZ       R4,LOOP3            ;R4=0時跳下一行   <=== 每次執行這句要用 2us 啊!!
        DJNZ       COUNT,LOOP2    ;將PWM LOW的值乘以40us         
        CLR        TR0                      ;這行有點多餘=.= 藍色的可以不要
        MOV        CUT,#0        ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除                 
        RET

所以較準確的寫法是這樣
        MOV COUNT,A
LOOP2:
        MOV         R4, #0AH               ;10次                 
LOOP3:        
        NOP                                     ;每個 nop 延時 1us  (t1)
        NOP                                     ;每個 nop 延時 1us  (t2)
        DJNZ       R4,LOOP3            ;R4=0時跳下一行     (t3) <=== 連這一句計 (t1+t2+t3) 總數是 4us 。
        DJNZ       COUNT,LOOP2    ;將PWM LOW的值乘以40us         
        MOV        CUT,#0        ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除                 
        RET

作者: zirok    時間: 2007-8-13 19:17
標題: 回復 irobot 大大
阿=.=" 果然還是大大厲害,我完全沒有考慮到指令的週期...
想來想去也是大大寫的比較簡潔,太厲害囉~

改完後立刻拿去試看看,不過它現在輸出的訊號都跟8051的VCC一樣,之前的話它是變成每隻腳都是固定0.5左右的電壓,
不知道拿去接伺服馬達會怎樣 ,怕怕 ,然後DIGITRACE目前我還是傳不進去訊號,不是軟體問題的話那應該就是硬體的問題...,不過它都不理我=.=",只有白色框框閃個不停,嗯...我在想想看電路哪裡錯了...(可是這麼簡單的電路 ...我插在麵包板上~)

[ 本帖最後由 zirok 於 2007-8-13 20:32 編輯 ]
作者: irobot    時間: 2007-8-13 20:51
你太跨獎了,你也可以做到的。若要我自己用彙編寫便不行了。這些東西是看時容易做時難。
你在進步中啊!! 不若我再考考你,若把 5 放入 COUNT 內,你猜 它是否真的計時 5 X 40us = 200 us 呢?若不是,又延時了多少呢?
程式碼如下:
        MOV COUNT, #05H
LOOP2:
        MOV         R4, #0AH               ;10次                 
LOOP3:        
        NOP                                     ;每個 nop 延時 1us  (t1)
        NOP                                     ;每個 nop 延時 1us  (t2)
        DJNZ       R4,LOOP3            ;R4=0時跳下一行     (t3) <=== 連這一句計 (t1+t2+t3) 總數是 4us 。
        DJNZ       COUNT,LOOP2    ;將PWM LOW的值乘以40us
作者: irobot    時間: 2007-8-13 21:07
你的目標是要讓伺服機起動,在我看來其實你已經有足夠能力做到了。
只是你剛開始便要同時處理8個伺服機,在你來說是稍稍難了一點。
如果你真的很想起動你的伺服機,可以把要求稍微降低一點。
1.  用你的 8051 點著一盞 LED 燈。
2.  讓這盞 LED 燈閃爍。
3.  準確控制 LED 燈著的時間和熄滅的時間。(例如 1 秒)
     這可訓練你準確用 Looping 計時的技巧。若是用 timer 計時也可以,同樣達到目的。
4,  輸出 1.5 ms High, 18.5 ms Low 這要求很準確的計時。若你做到便可以控制一個伺服機了。
5.  有了基礎,便可陸續加入更多的伺服機了(即你現在做的ssc)。
6.  也可以先嘗試 用 rs232 控制一盞 LED 燈的開關,熟悉一下 rs232 的用法。然後便用來控制一個伺服機。
總括以言,就是盡量把問題簡化。逐個擊破。 然後才做擴展。 不要同時出現太多不熟悉的問題。


[ 本帖最後由 irobot 於 2007-8-13 21:11 編輯 ]
作者: zirok    時間: 2007-8-14 15:39
標題: 回復 irobot 大大
那我也可以把聲道線換成led嗎~??

您丟給我的問題我覺得應該是要加上4 x 2 us ,我不太肯定是4或是5,因為我老師說最後一次它就不會再往前跳了...之類的,我也有點忘記了

謝謝大大的肯定,不過我還差的遠拉,想說有程式的話應該蠻快就可以試試看囉,沒想到桶出這麼多問題  哈哈 ,我會繼續把它完成的,希望有問題還能上來與大大們討論(不要不理我~ )
作者: irobot    時間: 2007-8-14 18:17
用 8051 的輸出腳接 led 是可控制它亮著或熄滅的。在未完成你的 ssc 前不妨順著1至4做,能控制一個伺服機也很有意思的。而且較容易成功和有滿足感。
另外答案是 5 x 2us = 10 us ,是多了 10 us 所以這樣的計時方法還不是準確的。
在這裡的誤差是 ( (5x2) / (5x40) ) x 100% = (2/40) x 100% = 5%  (留意是一個固定的誤差值,與 5 無關的)

[ 本帖最後由 irobot 於 2007-8-14 18:24 編輯 ]
作者: zirok    時間: 2007-8-14 19:33
喔~,3.4可能是我現在要嘗試的吧@q@,6的話我還不知道如何用電腦透過rs232對8051送指令呢 ,希望也有機會用到~不過還是先一步一步來吧  我說的對嗎?

原來要算5次,我原本以為是n-1次說~,可能是我對老師的誤解~ ,所以說5%的誤差算是可以容許的範圍囉? 嗯~




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2