Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
樓主: ffffff2641
打印 上一主題 下一主題

roboot >>>>S-O-S

[複製鏈接]
41#
發表於 2007-8-11 11:14:56 | 只看該作者
回 yyy 大大:
只是隨便問一下吧了,我只是想找出你我在試驗上的任何細微差異。有時這可能是得到不同結果的原因。
我一直也是用 digital 的 power supply,因為 analog 的電壓有時會不準確可能令 mcu 不穩定的。
伺服機我也不是很孰識,不過未見過有人用 SERVO E-9001 做2足。通常他們也是用 MG995及其相關係列。
LEO大大用的廣營 Micro 2BB MG伺服機我也有參考過,真是又細又好力。
配合你的 S51 板不知有何問題呢?你的 板是什麼規格呢?


[ 本帖最後由 irobot 於 2007-8-11 11:24 編輯 ]
42#
發表於 2007-8-11 11:31:39 | 只看該作者
回 Zirok 大大:
我建議你先確定輸出的訊號是否正常,這樣才可以確定問題是否在 servo 的提昇電阻上。
我也有  E-sky (8g) 伺服機,用在我的 控制板上是不用提昇電阻的。不過加了 1000 Ohm 的 提昇電阻 也一樣可以正常運作的。所以你加入 提昇電阻 也無妨。至於數值 (R) 只要可以限制電流不超過 mcu  的吸入電流便應該沒問題。
(5V / R) < 吸入電流 <--可從mcu 的 datasheet找到。
43#
發表於 2007-8-11 17:46:40 | 只看該作者
原帖由 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)來做控制的話,效果最好。

44#
發表於 2007-8-11 19:00:39 | 只看該作者
我想你是誤會了,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 編輯 ]
45#
發表於 2007-8-11 22:48:02 | 只看該作者
回irobot大大:
我找不到輸入電流可以多大@Q@,只有看到邏輯0的輸入電流(直流).邏輯0~1漏電流...等
,雖然知道不用家提升電阻了...,不過還是想問一下@Q@

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

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

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

ssc2.asm

5.86 KB, 下載次數: 270

ssc程式

46#
發表於 2007-8-12 01:48:22 | 只看該作者
讓我看一看你的先吧。我的做法是完全不同的,而且是用 C 寫的,兩者很難作比較。
47#
發表於 2007-8-12 10:07:03 | 只看該作者

回復 irobot 大大

喔喔 對吼,差點忘記=.=....,因為請大大看的話大大是比較累拉...SO...,
麻煩您了!!
48#
發表於 2007-8-12 14:08:06 | 只看該作者
回 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 編輯 ]
49#
發表於 2007-8-12 14:23:27 | 只看該作者
我的意見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
50#
發表於 2007-8-12 14:28:55 | 只看該作者
我的意見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。
51#
發表於 2007-8-12 14:33:16 | 只看該作者
我的意見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)
52#
發表於 2007-8-12 14:46:05 | 只看該作者
最後這個不知是否錯誤,只是對用 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 編輯 ]
53#
發表於 2007-8-12 19:23:28 | 只看該作者

回復 irobot 大大

首先我想說...,大大您太厲害囉  短短的時間就看完了...,還解釋那麼詳細..
,我的程式是由ayu大大發表的那篇ssc BY marbol 大大那邊弄低,所以程式的詳解大致上也是照抄@Q@

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

您的建議我還沒全部看完=.=...看完思考完後改改程式再來請教您  ,實在非常感激您!!
54#
發表於 2007-8-12 20:10:28 | 只看該作者

回復 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時它一直卡在那邊...,但我因為不清楚那一行的用意,也不敢亂刪,實在非常感謝您
55#
發表於 2007-8-12 20:15:35 | 只看該作者
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 編輯 ]
56#
發表於 2007-8-12 20:26:27 | 只看該作者
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 編輯 ]
57#
發表於 2007-8-13 14:01:51 | 只看該作者

回復 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吧,只是怕進位的問題,我伺服馬達用不多,更甭談讓它動=.=....,我現在只祈禱它能動一動就很開心拉~
再去試試=.=
58#
發表於 2007-8-13 14:43:41 | 只看該作者
呵呵,不錯的改動 !! 大致上也可以了。
但要留意
       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
59#
發表於 2007-8-13 19:17:04 | 只看該作者

回復 irobot 大大

阿=.=" 果然還是大大厲害,我完全沒有考慮到指令的週期...
想來想去也是大大寫的比較簡潔,太厲害囉~

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

[ 本帖最後由 zirok 於 2007-8-13 20:32 編輯 ]
60#
發表於 2007-8-13 20:51:32 | 只看該作者
你太跨獎了,你也可以做到的。若要我自己用彙編寫便不行了。這些東西是看時容易做時難。
你在進步中啊!! 不若我再考考你,若把 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
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-18 12:31 , Processed in 0.224017 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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